TreeMap
무료 오픈소스 디스크 사용량 시각화 도구로, 사각형 트리맵·중복 파일 탐색·디스크 가득 예측·정리 시 파일을 휴지통으로만 이동한다
무료 환경음 믹서·집중 타이머, 비·카페·노이즈·바이노럴 비트 겹쳐 포모도로 진행, 오프라인 사용, 가입 필요 없음
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.
생산성TypeScript · PHPGitHub @aminurislamarnob온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Focus on work
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
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).