Easy-to-manage touch screens
Free, open-source touch screens. Guided USB setup, a drag-and-drop editor and local control. Made for Home Assistant.
A satirical scratch-off lottery for basic needs in NYC. Scratch. Pray. Win ibuprofen.
Translation pending
LifestyleGitHub @vvexstudioOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
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 NYC lottery for basic needs. A satirical art piece made for the 3percentclub Spooky Hackathon.
▶ Play it: https://scratch-n-pray.pages.dev (works best on a phone)
Tell the city what you need. Buy a ticket. Scratch the silver. Pray.
The idea came out of a conversation about how getting your needs met in America, and in New York City especially, often feels less like a system and more like gambling. You enter the housing lottery. You hope your name comes up on the waitlist. You call 311 again. You reapply for the benefit you already qualified for. You wait to see if the loan forgiveness program you were promised still exists. Whether you get food, a home, medical care, legal status or an education can come down to timing, paperwork, the caseworker you happened to get, and luck.
So we built the lottery. Scratch & Pray turns that feeling into an object: a kitschy, glowing scratch-off ticket, half state-lottery and half prayer candle, that promises to solve your problem if you're lucky enough.
| You prayed for… | You won… |
|---|---|
| A meal | Leftovers from the 3 Pizza dumpster on 14th St (crusts only, still warm-ish) |
| A green card | One (1) Get Out of ICE Free Card*, or a weekend trip to New Jersey |
| Surgery | One free ambulance ride to the wrong borough, or two ibuprofen and a "there there" pat on the head |
| Student loan forgiveness | An invitation to audit one night class at City College |
| Housing | A 4-year spot on the waitlist for the waitlist |
*Not valid anywhere.
The monkey's paw is the horror story at the center of this project: the wish that comes true in the worst possible way. For a lot of New Yorkers that isn't a campfire tale. It's the shelter bed that's two hours from your kid's school, the "affordable" unit that costs 80% of your income, and the insurance approval that arrives after the surgery date. The scariest thing in this city isn't a ghost. It's a form that says "Your application has been received."
Scratch & Pray is satire. It punches up, at systems, bureaucracy, landlords, insurers and agencies, and never at the person praying. The jokes are meant to sting a little, because the reality behind them does.
Every ticket, win or lose, ends with a sincere "For real, though" line that points to a real resource for that need, such as NYC Care, Legal Aid Society, Housing Court Answers, City Harvest or 311. If a prayer suggests someone is in crisis, the joke steps aside and the ticket shows 988 (Suicide & Crisis Lifeline).
The goal is awareness. Behind every prayer someone types into this thing is a real need that a lot of New Yorkers are waiting on right now, with odds a lot worse than 1 in 10.
If you need help right now: call or text 988 for crisis support, call 311 for NYC services, or visit nyc.gov.
your prayer ─▶ server-side RNG (1 in 10) ─▶ LLM writes the prize ─▶ image model paints the ticket ─▶ scratch-off in the browser
gpt-5.4-mini, constrained to a JSON schema) and paints the ticket (gpt-image-1.5). Tickets are stored in Cloudflare R2.npm install
npm run dev # node --watch server.js → http://localhost:5177
The local server has no runtime dependencies. It needs Node 18+ and OPENAI_API_KEY in .env.
prayer ─▶ RNG (crypto.randomInt, 1 in SP_JACKPOT_ODDS) ─▶ text model writes prize JSON ─▶ image model paints ticket art ─▶ UI
POST /api/pray (server.js locally, functions/api/pray.js on Cloudflare; both call lib/pipeline.js): { prayer }. The server rolls the jackpot, so the client can't cheat.SP_TEXT_MODEL with a strict JSON schema returns category, game_name, headline, prize, description, fine_print, real_help, crisis, symbols, card_theme. The tone rules live in SYSTEM_PROMPT.SP_IMAGE_MODEL at 1024×1536 renders an ornate border with an empty central window. The prompt asks for the window at about 41–78% of the height.public/index.html): finds the blank window in the art (findWindow, which looks for a flat or transparent region, because the model moves it around), puts the prize panel and a canvas foil layer there, and auto-reveals once about 55% of the foil is scratched. Includes scratch sound, haptics, confetti on a jackpot, a "for real, though" line pointing to a real resource, and 988 when crisis is true.Every ticket is saved to generated/<id>.json and .png.
| URL param | Effect |
|---|---|
?force=win / ?force=lose | Override the RNG |
?art=0 | Skip image generation (fast and cheap text-only iteration) |
?replay=<id> | Re-render a saved ticket from generated/, no API calls |
&scratch=0.85 | With replay, pre-scratch the foil by that amount (for screenshots like the one above) |
This is the beginning of the README. Read the rest at the original. Read the full README ↗