TreeMap
무료 오픈소스 디스크 사용량 시각화 도구로, 사각형 트리맵·중복 파일 탐색·디스크 가득 예측·정리 시 파일을 휴지통으로만 이동한다
로컬 우선 Gmail 작업공간으로 의미 검색, 발신자 인텔리전스, 필터 레시피 제공, 이메일과 임베딩을 브라우저에 보관
A local-first Gmail workspace for semantic search, sender intelligence, and filter recipes. Your emails and embeddings stay in your browser.
생산성TypeScript · JavaScriptGitHub @sarthakagrawal927온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Private Gmail workspace with browser-local semantic search, sender insights, and explicit unsubscribe workflows.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Gmail inbox workspace with local-first semantic search. The app signs in with
Google, reads Gmail through the Gmail API, stores email metadata and embeddings
in the browser, and lets the user search, inspect, analyze, and unsubscribe
without persisting mailbox contents on the server.README 전문 보기 ↗Gmail inbox workspace with local-first semantic search. The app signs in with Google, reads Gmail through the Gmail API, stores email metadata and embeddings in the browser, and lets the user search, inspect, analyze, and unsubscribe without persisting mailbox contents on the server.
Live app: https://mail.significanthobbies.com
The server does not store email bodies, email lists, or generated embeddings. Cloudflare D1 stores only better-auth tables for login/session state. Gmail data is fetched on demand and cached locally in IndexedDB inside the browser.
| Concern | Service |
|---|---|
| Hosting | Cloudflare Workers (email-manager, email-manager.sarthakagrawal927.workers.dev) — Vite SPA + Hono worker |
| Database | Cloudflare D1 (email-manager-auth) for auth, via Drizzle ORM; email data + embeddings stored client-side in IndexedDB |
| Auth | better-auth + Google OAuth |
| Analytics | PostHog (posthog-js) plus Microsoft Clarity with the SPA root explicitly masked |
| AI | @huggingface/transformers — runs client-side in the browser for semantic search |
| CI/CD | GitHub Actions — ci.yml (lint/typecheck/test/build) on push/PR to main; deploy.yml deploys to Cloudflare Workers on manual workflow_dispatch only (production deploys are manual) |
pnpm install
cp .env.example .dev.vars # wrangler reads secrets from .dev.vars locally
pnpm dev
pnpm dev runs two processes:
/app, /about, /privacy); proxies /api/* to wranglerpnpm buildFor a full production-like stack (Astro landing at / + API), build first then use wrangler alone:
pnpm build
pnpm dev:api
Open http://localhost:8787.
Required secrets (.dev.vars / wrangler secret put):
GOOGLE_CLIENT_IDGOOGLE_CLIENT_SECRETBETTER_AUTH_SECRETBETTER_AUTH_URLOptional client build var (.env or .env.local for Vite):
VITE_POSTHOG_KEYGoogle OAuth must allow the local and production callback URLs:
http://localhost:8787/api/auth/callback/googlehttps://mail.significanthobbies.com/api/auth/callback/googlepnpm dev — Vite SPA + wrangler dev (API)pnpm dev:api — wrangler dev onlypnpm dev:spa — Vite onlypnpm build — Vite build + Astro landing overlay → dist/pnpm typecheck — TypeScript check (app + worker)pnpm lint — Biome (biome check .)pnpm test — Vitest unit suitepnpm test:e2e — Playwright e2e suitepnpm check:docs — documentation validation (scripts/check-docs.mjs)pnpm run deploy — build and deploy to Cloudflare Workerssrc/worker.ts Hono worker — /api/*, SPA shell routing, Astro landing at /
src/pages/HomeClient.tsx Gmail cockpit (/app)
landing-astro/ Static marketing landing (overlaid to dist/index.html)
src/components/ mailbox, search, analytics, unsubscribe UI
src/lib/auth.ts better-auth + Google token refresh
src/lib/gmail.ts Gmail REST client with 429 backoff
src/lib/db.ts IndexedDB schema and helpers
src/lib/embeddings.ts browser-side embedding model loading
dist/spa-index.html Vite SPA shell served for /app, /about, /privacy
Key constraints:
wrangler dev / deployed worker — use pnpm dev or pnpm dev:api for /api/*.Before changing behavior, run the smallest relevant check:
pnpm typecheck
pnpm build
pnpm test:e2e
This app is read-only by design. It does not send, reply, archive, delete, or modify any emails. The only non-read action available is unsubscribe, which always requires an explicit user click and opens the sender's unsubscribe flow — nothing happens automatically.
If automation features are added in the future (e.g. scheduled triage, AI-suggested labels), the policy is:
Users can rely on the app not taking any action on their mailbox unless they initiate it themselves.
Stable maintenance app. Migrated off OpenNext to Vite SPA + Hono worker (2026-06-20).
The remaining production setup footgun is Google OAuth: the deployed callback URL
must be present in the Google Cloud Console OAuth app, otherwise sign-in fails with
redirect_uri_mismatch.
See AGENTS.md for implementation conventions and deeper architecture notes.
See docs/README.md for the full knowledge-system layout (product, architecture,
decisions, development, operations, learnings).
These historical receipts are context, not a current acceptance checklist.
Business lane: P2 Watch / maintenance
Rule: do not create another broad "improve the UI" task unless the acceptance criteria differ materially from the tasks listed here.
Current work is tracked in this repository’s GitHub Issues; the SaaS Maker task board is retired.
2026-05-26: Added "Automation Safety" section (task 74061467) — P2 trust maintenance. Documents read-only guarantee and review-before-send policy for any future automation features.
2026-06-20: De-OpenNext migration — Vite SPA + Hono worker per fleet PRD §6.2.
pnpm verify:local-mailbox exercises actual IndexedDB and application
sync/index/search/digest code in an isolated Chrome context. Mail and embeddings
are synthetic fixtures; the harness blocks external requests and permits only
GET for its fake mailbox endpoint. It verifies separate accounts with colliding
message IDs, independent cursors, body reads, delayed refresh ownership and
rejection of unscoped storage. It closes the browser and local server on exit.
Chrome must be installed; no provider credentials or model download are used.
The account isolation decision and legacy-cache handling are documented in ADR-010. This is a read-only product: no compose, draft, reply, archive or delete flow exists. Unsubscribe remains an explicit user action and was not exercised.
The audit began with zero open issues and PRs. Implementation is tracked in #53; remaining authorized deployment, real OAuth/account switching, mailbox/model journey and domain qualification are consolidated in #54. Historical completed task rows were preserved without re-certifying them.
The source repair pins the existing MiniLM model and excludes untagged, incompatible
or malformed cached vectors from search. Their emails remain available; normal
indexing regenerates valid vectors without deleting mail. Similarity is no longer
displayed as a match probability. Evidence and upgrade behavior.
Released runtime 24142fee is verified at 100% traffic with the ordinary-domain
mobile guest journey. The linked report contains exact release and rollback
receipts. Real Google/mailbox and broader ranking gates remain in #54.