Skip to content

Commit ef7803c

Browse files
committed
chore(release): bump version to 1.1.0 and update documentation
- Bump version to 1.1.0 across manifest, package.json, and UI files - Update CHANGELOG.md with comprehensive v1.1.0 release notes - Refine README.md and landing page to reflect YouTube Watch support and new features - improve manifest and package description
1 parent 8e59348 commit ef7803c

7 files changed

Lines changed: 87 additions & 26 deletions

File tree

CHANGELOG.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,50 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [1.1.0](https://github.com/YazanAmmar/limitra/releases/tag/v1.1.0) - 2026-04-29
9+
10+
### Added
11+
12+
- **YouTube Watch support**: Limitra now tracks and enforces limits on regular YouTube Watch pages (`/watch`) in addition to Shorts, with a 10-second watch threshold before a video counts.
13+
- **Block Condition setting** (`Strict` / `Flexible`): Choose whether enforcement triggers when **either** limit is reached (OR) or only when **both** limits are exceeded simultaneously (AND). Configurable from the Command Center with dynamic descriptions and full i18n support.
14+
- **Customizable Block Duration**: Users can now set how long a block lasts (15 minutes to 24 hours) instead of a fixed 6-hour interval.
15+
- **Smart Session Lock**: An immutable `NEXT_RESET_KEY` prevents time-travel bypass during active blocks - the reset time is locked in as soon as a block begins.
16+
- **Settings Lock During Active Block**: Settings modifications (limits, time limits, tracking mode) are rejected while a block is active, preventing last-second workarounds.
17+
- **Sarcastic and Stoic quote tones**: Two new motivational tone modes added alongside the existing Gentle, Harsh, and Philosophical options, with expanded quote sets across all tones.
18+
- **Global Settings Reset**: A dedicated reset action in the Command Center restores all global preferences to defaults.
19+
- **Brutalist Modal Component**: A reusable confirmation modal used for the reset action and future destructive operations.
20+
- **Brutal Tooltip Component**: Contextual tooltips integrated across the settings dashboard to explain options inline.
21+
- **Hot-Swap Platform Detection**: The content engine now detects platform boundary crossings (e.g., Shorts → Watch) and re-bootstraps automatically without page reload, with full lifecycle cleanup to prevent memory leaks.
22+
- **Dynamic Overlay Enforcement Reason**: The blocking overlay now displays the precise trigger - `Time`, `Count`, `Time & Video Limits` (both), or `Bypass` - resolved at enforcement time.
23+
- **Ports & Adapters (Hexagonal) Architecture**: Core logic is now fully decoupled from Chrome APIs via abstract interfaces (`core/interfaces/`) and concrete adapters (`adapters/chrome/`). `BackgroundOrchestrator` is now environment-agnostic. Dependencies are injected exclusively at the composition roots (`background.ts`, `content.ts`).
24+
- **Multi-Platform Scoped Storage**: All storage keys are dynamically prefixed per platform (`limitra_${platform}_key`), eliminating cross-platform data collisions and laying the foundation for future platform expansion.
25+
- **Context-Aware Popup UI**: The popup now auto-detects the active platform or presents a platform selector dropdown on unsupported pages.
26+
- Twitter/X social links added across the website and extension.
27+
- `background-orchestrator.test.ts` added; `storage.test.ts` updated to use injected `StorageFacade`.
28+
29+
### Changed
30+
31+
- `StorageFacade` converted from a singleton to an injectable class.
32+
- `SessionManager` now receives injected `StorageFacade` and `ConnectionManager`.
33+
- `Messenger` now receives an injected `MessageBus`, removing direct `chrome.runtime` calls.
34+
- `BLOCK_NOW` messages are now filtered by `PlatformId` to prevent cross-platform message crosstalk.
35+
- `PlatformAdapter` interface migrated to `src/core/interfaces/` and its `id` property is now `readonly`.
36+
- Background service worker replaces `window.matchMedia` (invalid in Service Workers) with `storage.getTheme()`.
37+
- Overlay persistence watcher and controller split into separate modules (`overlay/persistence.ts`, `overlay/controller.ts`, `overlay/renderer.ts`).
38+
39+
### Fixed
40+
41+
- **Ghost overlay bug**: A stale blocking overlay left over from a previous installation or extension reload is now detected and removed on bootstrap.
42+
- Custom select initialization timing in the popup - `chrome.tabs.query` is now properly awaited before the platform select is initialized.
43+
- Time tracking no longer runs when a limit is set to zero.
44+
- Live time limit changes are now applied immediately without requiring a page reload.
45+
- `e.isTrusted` check removed from `custom-select.ts` to allow programmatic change events.
46+
47+
### Security
48+
49+
- `isCurrentlyBlocked()` is now the central gatekeeper: enforcement and punishment logic only executes after this check passes, ensuring AND/OR conditions are always respected.
50+
- Smart session lock (`NEXT_RESET_KEY`) prevents time-travel bypass: the reset timestamp is frozen once a block is active, blocking attempts to shorten the penalty by manipulating the clock.
51+
852
## [1.0.0](https://github.com/YazanAmmar/limitra/releases/tag/v1.0.0) - 2026-04-16
953

1054
### Added

README.md

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,15 @@ Limitra is a Chromium extension designed to **enforce hard limits on how you spe
4545

4646
## Overview
4747

48-
Limitra is a Chromium extension designed to **enforce hard limits on YouTube Shorts**.
48+
Limitra is a Chromium extension designed to **enforce hard limits on YouTube** - both Shorts and regular Watch pages.
4949

5050
Instead of reminders or nudges, it applies strict blocking once your limits are reached - helping you break out of endless scrolling loops.
5151

5252
You can define limits based on:
5353

54-
- Number of Shorts watched
54+
- Number of videos watched
5555
- Active session time
56-
- Or both combined
56+
- Or both combined - with your choice of **Strict** (either limit triggers) or **Flexible** (both limits must be reached) enforcement
5757

5858
When a limit is exceeded, Limitra immediately blocks playback using a fullscreen overlay that cannot be easily bypassed.
5959

@@ -81,7 +81,7 @@ Limitra immediately blocks access when limits are reached - no reminders, no byp
8181

8282
### Settings / Command Center
8383

84-
Configure your limits, tracking mode, theme, and behavior from a dedicated control panel.
84+
Configure your limits, tracking mode, block condition, block duration, theme, and behavior from a dedicated control panel.
8585

8686
<p align="center">
8787
<img width="720" alt="Settings Dashboard" src="assets/screenshots/settings.png" />
@@ -90,19 +90,29 @@ Configure your limits, tracking mode, theme, and behavior from a dedicated contr
9090
## Why Limitra?
9191

9292
- **Hard limits that actually stop you**: playback is paused, muted, and blocked the moment you hit your limit.
93-
- **Two dimensions of control**: track by watched Shorts count, session time, or both together.
94-
- **Designed against easy workarounds**: Limitra watches for counter resets, suspicious wipes, and hidden overlays.
93+
- **Two dimensions of control**: track by watched video count, session time, or both together.
94+
- **Your rules, your conditions**: choose whether one limit or both limits must be reached before enforcement kicks in.
95+
- **Designed against easy workarounds**: Limitra watches for counter resets, suspicious wipes, and hidden overlays - and locks settings during active blocks.
9596
- **Built for practical daily use**: quick popup stats, clear settings, theme support, and multilingual UI.
9697

9798
## Features
9899

99100
### Enforcement Core
100101

101102
- Dual-limit system based on **video count** and **active session time**
103+
- **Block Condition** setting: `Strict` (OR - either limit triggers a block) or `Flexible` (AND - both limits must be reached)
104+
- **Customizable block duration**: choose how long a block lasts, from 15 minutes to 24 hours
102105
- Fullscreen enforcement overlay triggered instantly on limit breach
103-
- Clear enforcement reasons: count, time, or anti-bypass
106+
- Dynamic enforcement reason display: `Count`, `Time`, `Time & Video Limits`, or `Bypass`
104107
- Automatic pause and mute of active videos
105108
- Disables playback-related keyboard shortcuts
109+
- Settings are locked during an active block to prevent last-second changes
110+
111+
### Platform Support
112+
113+
- **YouTube Shorts**: tracks video count and session time with a 1.5-second watch threshold
114+
- **YouTube Watch**: tracks regular video viewing with a 10-second watch threshold
115+
- **Hot-swap detection**: automatically switches tracking context when navigating between Shorts and Watch without a page reload
106116

107117
### Tracking & Intelligence
108118

@@ -116,13 +126,18 @@ Configure your limits, tracking mode, theme, and behavior from a dedicated contr
116126
- Detects manual counter resets and storage manipulation
117127
- Prevents overlay removal via DevTools or CSS tampering
118128
- Identifies rapid storage wipe attempts
129+
- Smart session lock: block duration is frozen at enforcement time to prevent clock manipulation
130+
- Central `isCurrentlyBlocked()` gatekeeper enforced before any punishment executes
119131
- Enforces immediate blocking when suspicious behavior is detected
120132

121133
### User Interface
122134

123135
- Live usage stats and progress bars in the popup
124-
- Dedicated **Command Center** dashboard for managing limits, modes, themes, and behavior
125-
- Motivational quote system with multiple tone styles
136+
- Context-aware popup: auto-selects the active platform or shows a platform selector on unsupported pages
137+
- Dedicated **Command Center** dashboard for managing limits, modes, block condition, block duration, themes, and behavior
138+
- Motivational quote system with multiple tone styles: Random, Gentle, Harsh, Philosophical, Sarcastic, Stoic
139+
- Brutalist tooltip components for inline option explanations
140+
- Confirmation modal for destructive actions (e.g., global settings reset)
126141
- Light, Dark, and System themes
127142
- Clean and responsive UI across all views
128143

@@ -151,6 +166,7 @@ src/
151166
│ │ ├── alarm-manager.ts
152167
│ │ ├── connection-manager.ts
153168
│ │ ├── message-bus.ts
169+
│ │ ├── platform-adapter.ts
154170
│ │ └── tab-manager.ts
155171
│ ├── storage/ # Persistence layer - settings, stats, sessions, security
156172
│ ├── background-orchestrator.ts # Environment-agnostic background logic
@@ -159,19 +175,19 @@ src/
159175
│ ├── tracker.ts # Delegates URL observation to the active adapter
160176
│ └── messenger.ts # Typed message bus wrapper
161177
├── platforms/
162-
│ ├── youtube/index.ts # YouTube Shorts adapter
178+
│ ├── youtube/index.ts # YouTube Shorts + Watch adapter (with hot-swap support)
163179
│ └── generic/index.ts # Fallback adapter
164180
├── ui/
165181
│ ├── popup/ # Extension popup UI
166182
│ ├── settings/ # Command Center dashboard
167183
│ ├── overlay/ # Blocking screen (renderer, controller, persistence)
168-
│ └── components/ # Reusable UI components
184+
│ └── components/ # Reusable UI components (tooltip, modal, custom-select)
169185
├── i18n/ # Internationalization (types, singleton, locale files)
170186
├── _locales/ # Chrome manifest-level translations
171187
├── assets/ # Icons and static assets
172188
├── background.ts # Composition Root - Service Worker entry point
173189
├── content.ts # Composition Root - injected page script entry point
174-
└── types.ts # Shared types (PlatformAdapter, AppAction, messages)
190+
└── types.ts # Shared types (PlatformId, AppAction, messages)
175191
```
176192

177193
## Getting Started
@@ -227,11 +243,12 @@ npm test
227243

228244
For full release notes, see [CHANGELOG.md](./CHANGELOG.md).
229245

246+
- **1.1.0**: YouTube Watch support, flexible block conditions (AND/OR), customizable block duration, improved anti-bypass logic, new UI components (modal, tooltip), and major internal architecture upgrades.
230247
- **1.0.0**: First stable release with dual-limit enforcement, blocking overlay, anti-bypass protection, popup stats, settings dashboard, theme support, and English/Arabic localization.
231248

232249
## Roadmap
233250

234-
- Expand beyond YouTube Shorts into other high-distraction platforms (TikTok, Reels, etc.)
251+
- Expand beyond YouTube into other high-distraction platforms (TikTok, Instagram Reels, etc.)
235252
- Add richer analytics and historical usage views.
236253
- Improve anti-bypass hardening for more edge cases.
237254
- Introduce smarter recovery, reset, and scheduling options.

docs/index.html

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
/>
3030
<meta
3131
name="keywords"
32-
content="limitra extension, block youtube shorts, stop infinite scrolling, focus browser extension, productivity chrome extension, limit screen time, digital discipline tool"
32+
content="limitra extension, block youtube videos, stop infinite scrolling, focus browser extension, productivity chrome extension, limit screen time, digital discipline tool"
3333
/>
3434
<meta name="author" content="Limitra" />
3535
<meta name="robots" content="index, follow" />
@@ -63,7 +63,7 @@
6363
"@type": "SoftwareApplication",
6464
"name": "Limitra",
6565
"url": "https://limitra.xyz",
66-
"description": "Limitra is a strict, local-first browser extension that blocks endless scrolling and enforces time or video limits on YouTube Shorts.",
66+
"description": "Limitra is a strict, local-first browser extension that blocks endless scrolling and enforces time or video limits on YouTube Videos.",
6767
"applicationCategory": "ProductivityApplication",
6868
"operatingSystem": "Chrome",
6969
"offers": {
@@ -192,7 +192,7 @@
192192
></span>
193193
<span class="relative inline-flex rounded-full h-2 w-2 bg-limitra-accent"></span>
194194
</span>
195-
Browser Extension — v1.0.0
195+
Browser Extension — v1.1.0
196196
</div>
197197
</div>
198198
<h1
@@ -493,7 +493,7 @@ <h3 class="text-limitra-dark dark:text-limitra-light font-black text-xl">
493493
Works on YouTube
494494
</h2>
495495
<p class="text-gray-600 dark:text-limitra-muted mb-5 font-medium">
496-
Currently optimized for YouTube Shorts.
496+
Currently optimized for YouTube.
497497
</p>
498498
<div class="grid grid-cols-1 sm:grid-cols-2 gap-3">
499499
<div class="brutal-card p-3 flex items-center gap-3">
@@ -572,8 +572,8 @@ <h2 class="text-3xl font-extrabold mb-8 text-limitra-dark dark:text-limitra-ligh
572572
<p
573573
class="text-gray-600 dark:text-limitra-muted text-sm leading-relaxed font-medium pl-8 transition-colors duration-300"
574574
>
575-
Currently, the logic is highly optimized for YouTube Shorts. Support for standard
576-
long-form videos is planned for future releases.
575+
Yes. Limitra now supports both YouTube Shorts and regular Watch videos, with
576+
separate tracking logic optimized for each experience.
577577
</p>
578578
</div>
579579
<div class="brutal-card p-6">

manifest.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
{
22
"manifest_version": 3,
33
"name": "Limitra - Master Your Focus",
4-
"version": "1.0.0",
5-
"description": "If willpower worked, you wouldn't be here. Limitra enforces the limit.",
4+
"version": "1.1.0",
5+
"description": "If willpower worked, you wouldn't be here. Set hard limits. Limitra enforces them.",
66
"default_locale": "en",
77
"permissions": ["storage", "activeTab", "scripting", "alarms"],
88
"host_permissions": ["*://*.youtube.com/*"],

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "limitra",
3-
"version": "1.0.0",
4-
"description": "If willpower worked, you wouldn't be here. Limitra enforces the limit.",
3+
"version": "1.1.0",
4+
"description": "If willpower worked, you wouldn't be here. Set hard limits. Limitra enforces them.",
55
"type": "module",
66
"scripts": {
77
"format": "prettier --write \"src/**/*.{ts,js,json,html}\" \"docs/**/*.html\"",

src/ui/settings/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ <h2 id="title-about" class="about-title">About Limitra</h2>
212212
rel="noopener noreferrer"
213213
class="version-badge"
214214
>
215-
v1.0.0
215+
v1.1.0
216216
</a>
217217
</div>
218218
</div>

0 commit comments

Comments
 (0)