Hamesh 為網路提供一個邊緣。將想法釘在精確的句子、程式碼行或段落上——然後離開,回來時它會正好等在你離開的地方。
AI 翻譯
Hamesh gives the web a margin. Pin a thought to the exact sentence, line of code, or paragraph — then leave, and find it waiting right where you left it.
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Leave context where it belongs.
Hamesh is a contextual annotation layer for the web. Attach a note to a specific
element on any page, leave, and find it restored in place when you return. The
name is the Arabic word for margin — the strip beside a manuscript where a
reader leaves a mark. The web removed that strip; Hamesh puts it back.檢視完整 README ↗Books and manuscripts have always had margins: a quiet place where readers leave thoughts, questions, and connections. Hamesh is the Arabic word for that margin, and this extension brings it to the web. Instead of losing ideas in a separate app, attach them to the exact words, element, or moment in a video that inspired them. When you come back, they are waiting exactly where you left them.
Every release is in the changelog.
Select the words that stopped you, click the small mark that appears beside them, and write. They keep a faint tint, like the trace of a pencil, and your note is waiting there whenever you return, even if the page has moved them. Shortcut: Alt+T.
Not every thought belongs to words. Press Alt+H, move across the page, and Hamesh frames whatever is under the pointer: an image, an equation, a whole paragraph. Click it and write. Nothing to draw, no screenshot to keep.
While you watch a lesson or a talk, press Alt+V and write your line. The video pauses until you're done, and a small mark on its timeline takes you back to that very moment.
Notes from every site gather in the Notes Library, grouped by website or sorted into your own folders. Search instantly, pin what you return to, and go back in one click to where each thought was born. Edit, delete, or move any note without reopening its page.
Choose who a note is for: just you, or your team. A shared note shows on the very page it belongs to, with your picture beside it. Talk in the margin with replies and @mentions, see where you were named in Mentions, or open the whole discussion in Chrome's side panel. Teams is optional, uses Google sign-in, and starts on a free plan.
Your personal notes stay on your device, in your browser's own extension storage: no account, no analytics, and nothing sent anywhere. Hamesh Teams is the only exception: once you turn it on and sign in, only what you choose to share goes to the Hamesh Teams server. The full details are in PRIVACY.md and on the website.
Add Hamesh to Chrome from the Chrome Web Store. Then, on any page, click the Hamesh icon or press Alt+H.
Hamesh is proprietary software. This section is for authorized contributors; see CONTRIBUTING.md and License.
| Layer | Choice |
|---|---|
| Framework | WXT (browser extension tooling), MV3 |
| UI | React 19, mounted in an isolated Shadow DOM on web pages |
| Language | TypeScript (strict) |
| Styling | Design tokens (CSS custom properties) in src/ui/tokens.css |
| Teams wire | Zod schemas in packages/teams-contract |
| Unit tests | Vitest |
| E2E tests | Playwright, driving the real extension |
Requires Node 20+ and pnpm.
pnpm install
pnpm dev # WXT dev server with hot reload
To load a build in Chrome:
pnpm build # output → .output/chrome-mv3/
Open chrome://extensions, turn on Developer mode, choose Load unpacked, and select
.output/chrome-mv3/.
The repo ships two builds from one source:
WXT_TEAMS_API_ORIGIN and WXT_GOOGLE_CLIENT_ID in .env.local.Teams code is gated by a build-time constant, so a build without those values carries none of it. See docs/teams-client.md. The Teams server lives in a separate, private repository.
| Command | What it does |
|---|---|
pnpm dev | Dev server with hot reload |
pnpm build | Production build to .output/chrome-mv3/ |
pnpm zip | Packaged .zip for the Chrome Web Store |
pnpm test | Unit and integration tests (Vitest) |
pnpm test:e2e | End-to-end tests against the real extension (Playwright) |
pnpm check | Typecheck, lint, format check, unit tests and build |
pnpm assets | Regenerate the extension icons and the social preview image |
src/
├── domain/ # Pure logic: notes, page keys, anchors, preferences, library grouping
├── storage/ # Repositories over chrome.storage.local
├── content/ # The on-page app: orchestration, theme detection, navigation, positioning
├── ui/ # React components and design tokens (composer, viewer, library, settings, teams)
├── teams/ # Teams client: API, sign-in, sync, realtime, the page channel
├── messaging/ # Runtime message types
└── entrypoints/ # WXT entrypoints: content script, background, popup, Notes Library
packages/
└── teams-contract/ # The Teams wire contract, shared with the server
landing/ # The website, hamesh.fandees.tech
docs/ # Architecture, engineering rules, releasing, the Chrome Web Store package
Everything Hamesh draws on a web page lives in one Shadow DOM root, so its styles never leak into the page, and the page's never leak in.
pnpm test # unit and integration
pnpm test:e2e # end to end
pnpm check # the full gate
The E2E suite builds the extension, serves its fixtures over HTTP (content scripts don't run on
file://), and launches Chromium with --headless=new, since legacy headless can't load
extensions. CI runs it on every pull request, alongside typecheck, lint, format, unit tests and
the build.
Semantic Versioning. Releases are cut from main by pushing a vMAJOR.MINOR.PATCH tag, which builds
and publishes the extension through GitHub Actions. See docs/RELEASING.md and
the changelog.
Proprietary. All rights reserved. See LICENSE. This is not open-source software. CONTRIBUTING.md · SECURITY.md · PRIVACY.md