Search CodeHorizon

Products

CSS Class HighlighterChrome extension · Live ShopGradeChrome extension + web app · Live SecureVaultAndroid app · Live Companion AIAndroid app · Live Speaker CleanerAndroid app · Live NickedAndroid game · Live CompassAndroid app · In testing TubeFocusChrome extension · Live KeeptakeChrome extension · Live TabClusterPast Chrome extension · Past project NotiloPast Chrome extension · Past project

Insights

Android now checks who built an app before it installs itAndroid WebMCP lets your website hand AI agents a proper set of toolsWeb and AI Your next customer might be an AI agent. Here is what it reads in your storeShopify Manifest V2 is gone. This is what a Chrome extension looks like nowChrome extensions Google sends fewer clicks now. Here is how a business website should adaptSearch

Pages

HomeThe studio ServicesWebsites, stores, extensions and apps Case studiesSelected work ProcessHow a project runs All productsThe complete collection InsightsPlatform changes, explained JournalEvery release, newest first Start a projectPlan it in a minute
move openEsc close

Notilo

Past Chrome extensionPast project

A web highlighter I built. Not currently live.

I built and previously published Notilo for web highlights and local notes. It is no longer live. This case study preserves its interface, text-range anchoring and export workflow.

Platform
Chrome
Last version
3.2.5
Project
Built and published
Status
Not currently live
Role
Sole developer
Timeline
May to Aug 2025
Stack
JavaScriptManifest V3Selection APIRange APIMutationObserver

The problem

Why Notilo exists

You read something important, close the tab, and two days later cannot remember where it was or why it mattered. I built Notilo to anchor notes to exact text ranges and restore highlights when a page re-rendered or was revisited. The extension is now a past project.

Before

  • Closing the tab and losing the thought
  • Highlights that vanish when the page changes
  • Notes scattered across other apps

With Notilo

  • Highlights anchored to the exact words
  • Notes right next to the text
  • Search and export in one place
The hardest part
Re-attaching a highlight that spans several DOM nodes after the page re-renders, or when you come back days later.

How it works

How you use it, step by step.

The workflow I built. Notilo is no longer live, so these screens are redrawn from its last version.

  1. Highlight text on a page and pin a note right next to it
  2. Sort each note into one of six categories as you write it
  3. Six highlight colours, chosen first or changed from the note
  4. Search highlighted text and notes on the page, then jump to one
Highlight text on a page and pin a note right next to it
Sort each note into one of six categories as you write it
Six highlight colours, chosen first or changed from the note
Search highlighted text and notes on the page, then jump to one

Under the hood

How it is built.

Highlights anchored to text ranges with the Selection and Range APIs, so they survive re-renders and come back when you revisit the page. It had notes in six colours and six categories, in-page search, and export to a text file. Everything stayed in local storage, with no account and no sync.

  1. 01

    Selection API

    What you picked

  2. 02

    Range API

    Anchored to the exact words

  3. 03

    chrome.storage

    Per page, on your device

  4. 04

    MutationObserver

    Puts highlights back as the page changes

Decisions

The calls I made, and what they cost.

Each decision lists the reason for it and what it gave up.

  1. 01

    One storage key per URL

    Why

    A simple key-value lookup, scoped to the exact page, that works offline.

    Trade-off

    Query strings and hashes create separate sets of highlights, which can be confusing on single-page apps.

  2. 02

    MutationObserver instead of polling

    Why

    It catches late-loading text as it appears and costs nothing while the page is idle.

    Trade-off

    It has to be disconnected carefully to avoid memory leaks.

A bug worth telling

Highlights on the wrong word

What happened
Restored highlights landed on the wrong occurrence of a word, one or two along.
Why
Restoring matched by the text itself, and “important” appears six times in most articles. It reliably found the wrong one.
The fix
Save the selection’s character offset within the page’s text, and restore it from the text node that owns that exact range. Text is ambiguous; position isn’t.

What I tried first

  • The CSS Custom Highlight API::highlight is the right long-term answer and was the first thing I tried, but Safari and older versions of Chrome didn’t support it. Wrapping ranges in the DOM runs everywhere.
  • Cloud sync with accountsIt was planned for version 2, until I wrote the privacy policy: every URL you visit, and your notes, uploaded. Local-only was the product decision.

What I learned

  • A selection can span dozens of elements. Re-wrapping it without breaking the layout takes careful node splitting.
  • chrome.storage.local has limits. Pages with heavy annotation needed LRU eviction of old highlight sets.

Screens

What it looks like.

01 / 05
01Highlight text on a page and pin a note right next to it
02Six highlight colours, chosen first or changed from the note
03Sort each note into one of six categories as you write it
04Search highlighted text and notes on the page, then jump to one
05Export one note or all of them as a plain text file

Features

What you get.

01

Six readable colours

Yellow, pink, green, blue, purple and orange.

02

Notes on highlights

Add context, thoughts or to-dos next to the text.

03

Categories

General, Important, To-do, Research, Quote or Idea.

04

In-page search

A fast overlay that filters across every note on the page.

05

Export to TXT

One note or all of them, ready to paste anywhere.

06

Local note management

I built a local note library with categories, search and text-file export.

Your data

The original extension stored notes locally in the browser, with no account, analytics or ads. This page documents that past implementation; Notilo is no longer live.

Questions

Good questions.

Something else? Ask me directly.

Is Notilo still live?

No. I built and previously published Notilo, but it is no longer live or available for new installations. This page remains as a portfolio case study.

What did I build?

A Chrome extension for six-colour highlights, categorised notes, in-page search and export, without an account.

How were highlights restored?

The implementation used the Selection and Range APIs to anchor annotations to page text and restore them on revisits.

Where were notes stored?

The original implementation stored notes locally in the browser. The screens here are redrawn from its last version, 3.2.5, and show only what it did.

Milestones

From the first line to today.

  1. May to Aug 2025

    Built and published

    Highlights in six colours, notes, in-page search and export.

  2. 20 Mar 2026

    3.2.5

    Highlights read better in all six colours, search on a page is faster, and exports are cleaner.

  3. 11 Oct 2026

    No longer live

    It stays on this site as a record of what I built.

  1. Project status

    Notilo is no longer live

    I built and previously published Notilo. It now remains as a past project and engineering case study.

    • Notilo is no longer available for new installations.
    • Screenshots and technical details remain as a record of what I built.
  2. Updatev3.2.5

    Notilo 3.2.5: easier-to-read highlights

    Highlights look smoother and read better, whichever of the six colours you pick.

    • Search your notes on a page faster.
    • Cleaner exports when you save your notes as a file.
    • Steadier all round.

For businesses

Like how Notilo turned out? I can build yours.

Websites, Shopify stores, Chrome extensions and Android apps, designed and engineered with the same care as my own products.

Booking new projects

Tell me what you’re building.

I read every message myself and reply within a day or two with honest next steps.

  1. 01You share the ideaA few lines is plenty. Links to anything similar help.
  2. 02We talk it throughOne short conversation by email or a quick call.
  3. 03You get a clear planScope, timing and a price that fits, before any work starts.
Just say helloFour fields, that is all

Your details come straight to my inbox and are only used to reply. Nothing is stored on this site or shared.

Project plannerTakes about a minute
01What do you need?Pick any that fit. Skip it for a quick hello.
02Budget
03Timeline
04Tell me about it

Your details come straight to my inbox and are only used to reply. Nothing is stored on this site or shared.