WallpaperMachine
The wallpapers you love. A new home on your Mac.
LidShutter is a Mac menu bar app that plays a sound when you open or close your MacBook lid. 22 original sounds, works offline, one-time price.
LifestyleAstro · TypeScriptGitHub @MohammadAshfaqueOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗The landing page for LidShutter, built with Astro, GSAP and plain CSS.
npm install
npm run dev
Then open http://localhost:4321.
src/data/site.ts: prices, launch slots, downloadUrl (your notarized DMG) and supportEmail.POLAR-SETUP.md to set up payments and license keys, and copy .env.example for the environment variables.| Path | What it is |
|---|---|
src/components/Hero.astro | The MacBook lid that opens as you scroll, with the app running inside it |
src/components/DiceRoll.astro | The dice that plays the 22 sounds |
src/components/AppDashboard.astro | Working copy of the app's menu bar menu and dashboard (shown inside the hero lid) |
src/components/Pricing.astro | Launch pricing, country prices and the Buy button |
src/scripts/synth.ts | Port of SoundSynth.swift: the sounds, generated in the browser |
src/data/sounds.ts | Sound names, subtitles and groups (mirrors the app) |
src/styles/global.css | Design tokens taken from Theme.swift |
src/pages/privacy.astro, support.astro, thanks.astro | Privacy policy, feedback form, and the page buyers land on after paying |
src/pages/api/ | Checkout, the Polar sales webhook, sold count, country, feedback |
If you add or change a sound in the app, update synth.ts and sounds.ts to match.
Push to GitHub and import the repo in Vercel. Astro is detected automatically.
The counter at the top of the page counts every sound visitors play. It needs a free Upstash Redis database:
KV_REST_API_URL / KV_REST_API_TOKEN (or UPSTASH_REDIS_REST_*) environment variables for you.Until a database is connected, the page shows the regular "A tiny menu bar app for MacBook" pill instead, so it never displays a made-up number. Locally, npm run dev uses a temporary in-memory counter that resets on restart.
The API lives in src/pages/api/plays.ts: at most 25 plays per request and 150 per minute per visitor.