Skip to main content

Overview

The Site Blocker feature helps you stay focused by blocking access to distracting websites. When you try to visit a blocked site, you’ll see a motivational overlay instead of the website content.
Site blocking works across all tabs and windows in your browser. It’s designed to help build better browsing habits, not as a strict parental control.

How It Works

When you block a site:
  1. The site URL is normalized and stored in IndexedDB
  2. When you navigate to a blocked site, a content script detects the domain
  3. A fullscreen blocker overlay appears with:
    • The blocked site name
    • A motivational message with emoji
    • Your current block streak counter
    • Option to close the tab or override the block
From blocker.tsx:16-67, the blocker shows:
- Site name (e.g., "facebook.com blocked")
- "to help you focus" subtitle
- Block Streak: {count} with fire emoji
- Close button
- "Open anyway" override button

Adding Blocked Sites

1

Open Site Blocker

Click the Site Blocker icon in the dock at the bottom of your new tab, or use the keyboard shortcut to access settings.
2

Enter Website URL

Type the website URL in the input field. You can enter:
  • Full URL: https://facebook.com
  • Domain only: facebook.com
  • Subdomain: www.facebook.com
The extension will normalize all formats to the base domain.
3

Click Add

Press Enter or click the Add button. The site will be immediately blocked.

URL Normalization

From site-blocker.store.ts:25-33, the extension normalizes URLs:
// All these formats become "facebook.com":
- https://www.facebook.com/profile
- facebook.com
- www.facebook.com

// Removes:
- Protocol (https://)
- www prefix
- Paths and query parameters
Blocking facebook.com will block all Facebook pages, including www.facebook.com, m.facebook.com, and any subdomains.

Built-in Site Categories

The Site Blocker includes pre-configured categories of commonly distracting websites. You can enable entire categories with one click.

Available Categories

From site-blocker.sheet.tsx:181-186:
  • Social Media: Facebook, Twitter, Instagram, TikTok, Reddit, etc.
  • Entertainment: YouTube, Netflix, Twitch, streaming platforms
  • News: News websites and aggregators
  • Shopping: E-commerce and shopping sites
  • Gaming: Gaming platforms and websites
1

Open Site List

In the Site Blocker panel, scroll down to see categorized site lists.
2

Select Category

Each category shows how many sites it contains and how many you’ve already blocked.
3

Block All

Click Block All to add all sites in that category to your blocked list.

Bulk Operations

From site-blocker.store.ts:204-264, you can use bulk operations:
// Block multiple sites at once
await bulkAddSites(['site1.com', 'site2.com', 'site3.com'], 'social-media');

// Unblock multiple sites
await bulkRemoveSites(['site1.com', 'site2.com']);
Bulk operations are optimized for performance and update IndexedDB in batches.

Managing Blocked Sites

View Blocked Sites

Your custom blocked sites appear at the top of the Site Blocker panel under “Custom Blocked Sites”. From site-blocker.sheet.tsx:177-180:
<CustomBlockedSites
  sites={sites}
  onToggleSite={toggleSite}
/>

Toggle Block Status

1

Find the Site

Locate the site in your blocked sites list or category list.
2

Click Toggle

Click the toggle switch next to the site name to enable or disable blocking.
3

Confirmation

The toggle updates immediately. The site is now blocked or unblocked.
From site-blocker.store.ts:162-186:
// Toggling a site:
// - If blocked → unblocked
// - If unblocked → blocked
// - If doesn't exist → creates and blocks

Remove Blocked Sites

1

Locate Site

Find the blocked site in your custom sites list.
2

Click Remove/Delete

Click the delete or remove icon next to the site.
3

Soft Delete

The site is marked as deleted (soft delete) in the database. It can be re-added later without creating a duplicate.
Removing a site from the blocked list means you’ll be able to access it immediately. There’s no undo button.

Block Streak Counter

The blocker overlay displays your block streak, which tracks how many times you’ve successfully stayed focused by not overriding blocks. From blocker.tsx:44-48:
<p className={style.streak}>
  <span className={style.streakEmoji}>🔥</span> Block Streak: {streak}
</p>
Your streak increases each time you close a blocked site instead of clicking “Open anyway”.

Override Blocks (Open Anyway)

While the goal is to stay focused, you can override blocks when necessary:
1

Visit Blocked Site

Navigate to a blocked website. The blocker overlay appears.
2

Click 'Open anyway'

At the bottom of the blocker overlay, click the “Open anyway” button with lock icon.
3

Site Opens

The blocker is bypassed and the site loads. Your block streak may be affected.
From blocker.tsx:56-61:
<button onClick={onOpenAnyway} className={style.openAnywayButton}>
  <span className={style.openAnywayText}>
    <span className={style.openAnywayIcon}>🔒</span>
    Open "{siteName}" anyway
  </span>
</button>
The override is temporary for that session. The site remains in your blocked list and will be blocked again on the next visit.

Storage & Sync

Local Storage

From site-blocker.store.ts:289-316, blocked sites are stored in:
  • Chrome Storage: For fast access and cross-tab synchronization
  • IndexedDB: For persistent storage with full site data
  • Store name: meelio:local:site-blocker

Data Structure

Each blocked site stores:
interface SiteBlocker {
  id: string;           // UUID
  userId: string;       // User ID for multi-user support
  url: string;          // Normalized domain
  category?: string;    // Optional category tag
  isBlocked: boolean;   // Current block status
  createdAt: number;    // Timestamp
  updatedAt: number;    // Timestamp
  deletedAt: null;      // Soft delete timestamp
}

Migration

From site-blocker.store.ts:77-86, the store automatically migrates data from Chrome storage to IndexedDB on first load:
if (currentState.sites.length > 0 && localSiteBlockers.length === 0) {
  console.log("Migrating site blockers from Chrome storage to IndexedDB");
  // Migrates all sites to new storage format
}

Limits & Quotas

From site-blocker.store.ts:102:
const MAX_SITE_BLOCKERS = 500;
You can block up to 500 websites. This limit prevents storage issues and ensures good performance.

Timer Integration

The Site Blocker works seamlessly with the Pomodoro timer:
  • During focus sessions, blocked sites show your active timer
  • Breaking the block can be configured to pause your timer
  • Timer completion notifications remind you to avoid distractions
Check timer.store.ts for timer configuration and site blocker integration settings.

Extension-Only Feature

From site-blocker.sheet.tsx:193-217, site blocking requires browser extension APIs:
const isExtension = typeof chrome !== "undefined" && chrome.storage !== undefined;
If accessed from the web version:
  • Shows message: “Site blocking functionality is only available in the browser extension.”
  • Provides link to install the extension
  • No blocking functionality available
Site Blocker only works in the browser extension version of Meelio. The web app cannot block sites.

Privacy & Security

  • All blocked site data is stored locally in your browser
  • No browsing history is collected or sent to Meelio servers
  • Site blocker rules are private to your browser profile
  • Optional: Sync blocked sites across devices when signed in to Meelio account

Troubleshooting

  1. Check if the site URL is correctly normalized
  2. Verify the site’s toggle is set to “blocked” (not just added to the list)
  3. Refresh the page or close and reopen the tab
  4. Check if you’ve granted the optional host permissions
  • Ensure the URL format is valid (e.g., example.com or https://example.com)
  • Check if you’ve reached the 500 site limit
  • Try removing the www. prefix if the site won’t add
  • Verify the extension has the optional host permissions (https://*/*)
  • Check if content scripts are enabled in your browser
  • Try disabling and re-enabling the extension
  • Check if the site uses a redirect that bypasses the blocker
  • This may indicate a storage issue
  • Check browser storage permissions
  • Try re-adding a site to trigger migration to IndexedDB
  • Check browser console for storage errors

Pomodoro Timer

Use focused work sessions with automatic site blocking

Task Management

Plan your work before blocking distractions

Soundscapes

Add ambient sounds to enhance focus

Settings

Configure site blocker behavior and preferences

Build docs developers (and LLMs) love