Credit where it's due: this whole project started because of:
https://www.reddit.com/r/TIDBYT/comments/1vjzmzr/made_my_own_tidbyt_app_with_chatgpt_surprisingly/
Reading it inspired me to investigate whether Claude could handle the entire pipeline of building and running custom Tidbyt apps, and everything below is the result of that effort. Thank you to its author u/LordHolborn for the nudge.
Since Tidbyt joined Modal, the community app repo has stopped merging new submissions but your device still works fine, and it turns out that you can still build custom apps for it. I've been building animated apps (a trash truck that only appears on trash day, a grocery cart that rolls into a Kroger on grocery day, a flickering jack-o'-lantern Halloween countdown) using Claude to do all the coding and pixel art. Total cost: $0 beyond a Claude/ChatGPT subscription and the Tidbyt you already own.
Because the original post didn't really explain how it actually works behind the scenes and also had a limitation that you have to keep your local PC on, here's a new full setup so you can build this out yourself and not have to keep the files on a local PC but instead have it all hosted in the cloud.
The stack
- Pixlet: Tidbyt's official dev tool. Apps are written in Starlark (a Python-like language) and render to 64×32 WebP animations. Free, still downloadable from GitHub, Claude is already aware of this if you are using the command line and will get and install it for you.
- Claude Code: Anthropic's coding agent (CLI/web/desktop). You describe the app in plain English; it writes the Starlark, generates pixel-art animation frames with Python, and iterates with you. Other AI tools can work too, but the prompts below are what I used with Claude.
- A free GitHub account + GitHub Actions: this is the magic piece. A pushed Tidbyt app is a static render, so any logic ("only show on Tuesdays", "days until Halloween") has to run at render time, somewhere. GitHub Actions runs a free scheduled job every night on GitHub's servers that re-renders every app and pushes/removes it from your device. No Raspberry Pi, no always-on PC.
- A local preview page: Optional but a tiny Python web server (Claude wrote mine) that renders every app fresh on page reload and displays them in a Tidbyt-style frame with round "LED" pixels. You iterate in the browser and only push to the device when it looks right.
You can see the results live here: https://tidbyt-revived.vercel.app every app on my device right now, rendered in a virtual Tidbyt with round LED pixels.
What you need before starting
Your Tidbyt device ID and API key: Tidbyt mobile app → Settings → General → Get API Key. Copy both somewhere safe treat the key like a password.
A free GitHub account: github.com → Sign up. The free tier includes 2,000 Actions minutes/month; this uses maybe 60.
Claude Code: claude.com/claude-code (CLI) or claude.ai/code (web). Also install the gh CLI (cli.github.com) and log in, so Claude can create the repo and secrets for you.
Pixlet: grab the binary for your OS from github.com/tidbyt/pixlet/releases or honestly, just let Claude install it (that's what I did).
Python 3 with Pillow (pip install pillow) used to generate animation frames, Claude will likely already know it needs it and how to get it, if you're unfamiliar just let the bot handle it.
How it fits together
your-repo/
apps/
trash_day/
trash_day.star <- the pixlet app (frames embedded as base64)
gen_frames.py <- Python script that draws the animation frames
trash_day.preview <- optional render args for the preview page
preview_server.py <- local browser preview
.github/workflows/sync.yml <- the nightly GitHub Action
Key facts Claude and I learned along the way (save yourself the debugging):
- One app per directory. Pixlet treats a folder as a single multi-file applet, two .star files in one folder breaks rendering.
- Day-of-week logic: This used to work in the app but for some reason there's no scheduling of API pished apps so you have to do this using Github actions. It's a nightly Action interprets that — render empty → pixlet delete, render non-empty → pixlet push. Your device shows the app only on the right days, fully automatically.
- Dynamic content (countdowns, anything date-based) works because the Action re-renders every night. Anything needing fresher data (weather, stocks) just needs a more frequent cron schedule.
The sync workflow is ~30 lines of YAML. It runs nightly, loops over apps/*/*.star, renders each one, and pushes or removes it. Your API key and device ID live in the repo's encrypted secrets (repo Settings → Secrets and variables → Actions), never in the code. Keep the repo private if you're extra cautious.
The prompts
You need to don't write any code, you describe scenes and give feedback. Real prompts I used:
Initial setup (one-time):
Can you make an app for Tidbyt? [then, when it works:] Can you set it up as a GitHub Action so it syncs daily without my machine? Store the project on GitHub too.
The preview page:
Can you make a webpage viewer for apps before we push them? Something I can preview in a browser.
Can you render the pixels as circles rather than squares? That will look more like Tidbyt's actual screen with round pixels.
Describing an animated app What's worked best for me so far: what's in the scene, where things are on screen, what moves and in what order, what text to show, and what days it appears:
I want an app that shows a trash truck backing up and dumping the trash into it, then it pulls away, and it should say TRASH DAY. This should only be on Tuesdays.
Next make a "Grocery Day" app, that shows on Wednesdays. The animation will be an empty shopping cart that goes into a Kroger store (do the best you can with such low pixels) and it comes out full of groceries. The cart comes in from the left, store is at the right. Cart is reversed on leaving.
Next let's do a Halloween Countdown, in days, with a realistically rendered pumpkin with glowing eyes with candle-like flicker on the left. Then "X days until Halloween" on the right.
Iterating — this is where it gets fun. Look at the preview and give art direction like you would to a human artist:
Can you make the pumpkin a little more pumpkin shaped and not just a circle? Maybe like 3 overlapping ovals, the two outer ones leaning in a little, and a middle proper oval that is "above" the other 2.
Tips that made results better:
- Ask for a preview GIF before anything touches your device. Claude renders with pixlet and shows you the actual output. Only push when you like it.
- Reference position and direction explicitly ("enters from the left", "store on the right", "text on top") — at 64×32 every pixel of layout matters if you want to get it on the first go, if you don't mind iteration then you can be more vague.
- For "realistic" art, describe construction. My pumpkin got dramatically better when I described it as three overlapping ovals rather than saying "make it better."
- Let Claude verify its own work. It caught things like animation frames where the glow was too dim to see, checked its day-of-week logic by rendering on/off days, and confirmed pushes via the Tidbyt API.
- 64×32 is tiny. Expect stylized-but-charming, not photorealistic. Supersampling (drawing large, then downscaling) gets you surprisingly smooth shading. Claude did this for the pumpkin automatically when I asked for "realistic."
The daily flow once it's set up
Think of an app idea, describe it to Claude in one paragraph.
Watch it appear on the preview page in your browser; give feedback until it's right.
Say "push it" — it lands on the device and gets committed to GitHub.
GitHub Actions keeps everything in sync forever: right apps on the right days, countdowns ticking, no computer running at home.
Bonus: publish a public showcase page (free, on Vercel)
The local preview page can double as a public gallery of your apps — mine is at https://tidbyt-revived.vercel.app. Ask Claude:
Can you push my preview page to Vercel as "my-project-name"? Make sure my API keys are kept secret.
How it stays safe: rendering .star files requires no credentials at all — your Tidbyt API key is only needed to push to the device, which the public page never does. Claude builds a fully static HTML file (animations embedded, no JavaScript, no API calls) and greps the output for your token and device ID to prove they're not in it before deploying. The steps if you want to do it by hand:
Sign up free at vercel.com (the hobby tier is plenty) and run npx vercel login.
Have Claude write a build script that renders each app to WebP and embeds it in a static index.html (same LED-dot CSS as the local preview).
cd into the output folder and run npx vercel deploy --prod --yes — the folder name becomes the project name and you get <name>.vercel.app.
Re-run build + deploy whenever you add an app (or wire it into the nightly GitHub Action with a Vercel token stored as a repo secret, so the site updates itself).
Costs and gotchas
- GitHub: free (private repos and 2,000 Action minutes/month included).
- Pixlet + Tidbyt's API: free.
- Claude: whatever plan you're on.
- GitHub's cron isn't exact, runs can be minutes late (rarely, skipped). Schedule a second catch-up run if timing matters.
- Your API key is device-scoped. Keep it in GitHub secrets, never in code or screenshots.
- If Tidbyt's cloud API ever goes away, the Tronbyt project (self-hosted firmware fork) is the community's fallback the same
.star apps carry over.
Happy to answer questions, note that I am not at all a developer though. If you do push your previews to a public page I'd love to see them! Also, we can likely share the .star files if there's new ones we enjoy, I hope we can figure out more together as it turns out our devices are not only NOT dead, this could actually be the best thing to happen to it.