TreeMap
무료 오픈소스 디스크 사용량 시각화 도구로, 사각형 트리맵·중복 파일 탐색·디스크 가득 예측·정리 시 파일을 휴지통으로만 이동한다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A full-screen focus environment for a second monitor. One piece of artwork edge to edge, a glass player with three buttons, and a daily intention you set each morning. Open it, drag it across, press F, and leave it alone.
Live at desk-screen.vercel.app.README 전문 보기 ↗A full-screen focus environment for a second monitor. One piece of artwork edge to edge, a glass player with three buttons, and a daily intention you set each morning. Open it, drag it across, press F, and leave it alone.
Live at desk-screen.vercel.app.
Art fills the screen. Seven SVGs — all 1920×1080 viewBox vector, sharp at any resolution. The background button cycles through them; your pick is remembered by name so adding or reordering artwork never scrambles what you chose. If you haven't chosen yet, it opens on an artwork that matches the time of day. Every 8-12 minutes it quietly drifts to the next one on its own — so the screen is never exactly the same as when you left it.
Music picks its source automatically in this order:
clientId in config.js makes the page a Spotify Connect device.music/ and sync.py builds the track list.Intention is the third thing. On the first open of each day, a prompt appears: What are you working on? You type something, press Enter, and it shows up as a faint italic line above the player for the rest of the day. It resets at midnight. Press I to change it. It is stored only in your browser and sent nowhere.
Each SVG gets its own <canvas>. On load, all artwork is drawn into its canvas during idle time — one at a time across requestIdleCallback slots — so nothing blocks. After that, switching artwork is a compositor flip: toggling opacity on the right canvas, not a draw call.
This matters because the artwork is detailed. hill-town.svg is 3.2 MB of paths and takes ~2.5 s to rasterise. Without pre-rasterisation, clicking the background button produced 600–2700 ms stalls. After: 31 ms median, 131 ms worst case while clicking as fast as possible.
Each canvas is promoted to its own GPU layer via will-change: opacity; transform: translateZ(0), so the reveal never triggers layout or paint.
The files engine runs two Audio elements in rotation. One plays; the other has already fetched the next track. Pressing next swaps them — zero network wait. The freed element then fetches the track after that.
Switch time before: ~60 ms. After: ~19 ms. The difference is small in absolute terms but noticeable on a second monitor where you glance across just to skip.
The ambient engine synthesises everything from scratch. Six pieces, each defined by a scale, a register, note gap ranges, harmonic partials, a filter envelope, and a slow chord cycle measured in minutes. Notes are chosen randomly within those rules each time they fire — the music never repeats and never ends.
Reverb is a synthesised impulse response built from shaped exponential noise. The whole engine — six endless compositions — is 13 KB of JavaScript and downloads nothing. No audio files, no CDN, no licensing questions.
The ambient engine now has seven pieces. The newest, Old House, sits in the childhood register — C5, major pentatonic, short struck attacks that decay quickly, partials tuned to read like a toy piano rather than a bell. It opens each morning session when the hour is between 5 and 10.
The piece runs the same synthesis path as the others: oscillators, envelope, filter, reverb send. No samples, no files. The nostalgic quality comes entirely from the scale choice and the short attack-to-decay ratio.
All three sources expose the same interface:
{ name, available(), init(ui), toggle(), next(), prev() }
app.js picks one at startup and never knows which it got. Adding a fourth source means writing one more file of that shape and registering it in the engines map.
manifest.json and sw.js make Desk Screen installable as a native-looking app from any browser. The service worker caches the shell (HTML, CSS, JS, fonts) on first load so the screen opens instantly even on slow Wi-Fi, and works fully offline for the generative and local-files engines. Art and video are fetched network-first so newly dropped files show up without clearing the cache.
The install prompt appears automatically on supported browsers. On desktop Chrome, an icon appears in the address bar.
cd ~/Projects/desk-screen
./start.command
Refreshes the track and background lists, serves on http://127.0.0.1:8080, and opens the browser. The address must be 127.0.0.1 — Spotify's redirect URI is registered against that exact string and rejects localhost.
Install ffmpeg (brew install ffmpeg) to read song tags from audio metadata and measure average base colours from raster artwork.
python3 build-public.py
cd dist && npx vercel --prod
The public build uses the generative engine only — local files cannot be hosted publicly and the Spotify SDK requires Premium and registered redirect URIs.
| Key | Action |
|---|---|
| Space | Play / pause |
| ← → | Previous / next track or piece |
| B | Change background (also auto-drifts every 8-12 min) |
| F | Fullscreen |
| I | Set or change today's intention |
| Y | Switch to YouTube engine (if configured) |
macOS media keys and the Now Playing widget work via the Media Session API.
index.html markup only
style.css every visual decision
app.js artwork, buttons, keyboard — knows nothing about music
intention.js daily focus intention — prompt, display, localStorage
engine-spotify.js Spotify Web Playback SDK + PKCE flow
engine-files.js files in music/ with dual-buffer prefetch
engine-youtube.js curated Pakistani nostalgia playlist via YouTube IFrame API
engine-ambient.js seven generative pieces, synthesised entirely in the browser
config.js your settings (clientId, playlist, mode) — not in git
sync.py reads music/ art/ video/, writes tracks.js + backgrounds.js
tracks.js generated — window.TRACKS — not in git
backgrounds.js generated — window.BACKGROUNDS
sw.js service worker — offline shell cache, network-first for art
manifest.json PWA manifest — name, icons, display mode
build-public.py writes dist/ for hosting
start.command sync → serve → open
vercel.json cache headers
prefers-reduced-motion swaps video for the poster frame.sync.py reads only the top level of art/, video/ and music/ — subfolders are a safe parking space.