TreeMap
A free, open-source disk-space visualizer. Squarified treemap, duplicate hunting, disk-full forecasting, and cleanup that only ever moves files to the Trash.
Free ambient sound mixer and focus timer. Layer rain, café, brown noise and binaural beats, run Pomodoro sessions and keep working offline. No sign-up.
Translation pending
ProductivityTypeScript · PHPGitHub @aminurislamarnobOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Focus on work
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗A mobile-first ambient sound mixer and focus timer, built with Next.js and installable as a PWA.
/?mix=light-rain:55,cafe:45).Shortcuts are ignored while you're typing in the search box. With a slider focused, the arrow keys adjust that slider instead.
| Key | Action |
|---|---|
| Space | Play / pause |
| V | Open or close focus mode |
| F | Full screen (opens focus mode if needed); press again to exit |
| M | Mute / unmute |
| Esc | Close focus mode or the open sheet |
| 1 2 3 | Switch to Mix, Sounds or Timer |
| ← → ↑ ↓ | Focused slider: ±5% |
| Page Up / Page Down | Focused slider: ±10% |
| Home / End | Focused slider: 0% / 100% |
npm install
npm run dev # http://localhost:3000 (service worker disabled in dev)
npm run build && npm start # serves out/ locally, service worker enabled
next build writes a fully static site to out/ (output: "export"). Installing and testing offline need that production build, served over HTTPS or on localhost.
The site runs on Cloudflare as a static-assets Worker on https://focuship.app. The custom domain is declared in wrangler.jsonc; on deploy Cloudflare creates its DNS record and certificate. The workers.dev URL is turned off so the app has one origin, since installs and offline caches are per-origin.
npx wrangler login # once
npm run deploy # next build && wrangler deploy → focuship.app
npm run deploy:redirect # the 301 Worker for focus.aminurislam.me, focusship.app and www hosts
A second, tiny Worker (workers/redirect/) answers every old or alternative hostname with a 301 to the same path and query on https://focuship.app.
focuship.app and focusship.app (Cloudflare Registrar puts them in the same account).focuship.app zone, turn off Block AI bots, AI Labyrinth and Managed robots.txt; the site ships its own robots.txt and llms.txt.npm run deploy, then check https://focuship.app loads and curl -A GPTBot -I https://focuship.app returns 200. Point the API's FRONTEND_URL and Google's consent-screen home page and privacy links back to focuship.app.wrangler.focus.jsonc and deploy:focus script, then the old let-me-focus Worker (npx wrangler delete --name let-me-focus) to free focus.aminurislam.me.npm run deploy:redirect, then check curl -I https://focus.aminurislam.me/timer?x=1 returns a 301 to https://focuship.app/timer?x=1.https://focuship.app/sitemap.xml.wrangler.jsonc points Cloudflare at out/. Response headers (caching, the service worker's no-cache rule, security headers) live in public/_headers, since headers() in next.config.ts doesn't apply to static exports. Sounds are served from the same CDN with a one-year immutable cache, and only changed files are re-uploaded on each deploy.
| Path | What it does |
|---|---|
src/lib/catalog.ts | Sounds, categories and presets |
src/lib/audio/engine.ts | Web Audio engine: sync(layers, playing, volume) fades voices in and out. Recordings loop gaplessly by crossfading two media elements. |
src/lib/audio/noise.ts | Seamless white, pink and brown noise buffers |
src/lib/store.ts | App state (useSyncExternalStore), persistence, share links, Media Session, timer |
src/lib/pwa.ts | Service worker registration, install prompt, offline downloads |
public/sw.js | Caches the app shell, hashed assets and sounds; offline fallback for the page |
src/app/manifest.ts | Web app manifest, including shortcuts |
scripts/generate-icons.mjs | Renders the icon set (npm run icons) |
wrangler.jsonc, public/_headers | Cloudflare deployment and response headers |
Sound files are fetched whole and played from memory, so the service worker can cache them. They're saved as you play them, or all at once from About & offline.
Recordings come from Moodist by remvze (MIT). Its sounds are under the Pixabay Content License or CC0. The visual style follows the dark, mono-accented look of superset.sh.
MIT © Md. Aminur Islam. Sound recordings keep their own licenses (see Credits).