个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证The digital family calendar for screens you already own — a TV, an old tablet, or a Raspberry Pi. Claude writes it fresh every morning.
翻译准备中
正在加载完整 README。 以下为已保存的摘录。
The digital family calendar for screens you already own — a TV, an old tablet, or a Raspberry Pi.
DinkyDash merges your calendars into one agenda, works out whose turn each chore is, counts down to the next birthday, and once a day asks Claude for a headline. Then it puts the lot on a screen at home — light or dark, sized to read from across the kitchen.
Self-hosted (this repo). Free, MIT-licensed, runs on your own hardware with your own Anthropic API key. Setup takes an afternoon and some comfort with a terminal.查看完整 README ↗The digital family calendar for screens you already own — a TV, an old tablet, or a Raspberry Pi.
Website: dinkydash.co
DinkyDash merges your calendars into one agenda, works out whose turn each chore is, counts down to the next birthday, and once a day asks Claude for a headline. Then it puts the lot on a screen at home — light or dark, sized to read from across the kitchen.
Self-hosted (this repo). Free, MIT-licensed, runs on your own hardware with your own Anthropic API key. Setup takes an afternoon and some comfort with a terminal.
Self-hosting is community-supported. Issues and pull requests are welcome, but there's no support commitment — if you need it to just work, use the hosted version.
Hosted. Start a free 14-day trial. No card required. After that it's $39 a year or $6 a month, and nothing is charged unless you choose to subscribe. Built from this same repo, in cloud mode — see Two modes, always.
Configure all of it from your phone at /settings, or by editing config.yaml directly — they are
the same file, and the UI keeps your comments.
[cron every 5m] → generate.py --tick → every hour by default: re-fetches every iCal feed
→ once a day at a time you set, 06:00 by default
(and at once on the first run): calls Claude
→ saves dashboard_data.json
[browser] → web/routes/board.py → recomputes chores, countdowns and today's agenda
→ renders the dashboard
Only the headline comes from the model. Ages, countdowns, chore turns and the agenda are recomputed on every render, so if a day's run fails the times and turns on the wall are still today's — the headline is one worked out from the day, and the dashboard says so.
You can see the real dashboard in about two minutes, with no API key and nothing to pay for.
git clone https://github.com/caspii/dinkydash.git
cd dinkydash
python3 -m venv venv && source venv/bin/activate
pip install -r requirements.txt
cp config.example.yaml config.yaml # edit by hand, or from /settings once it runs
python sample_board.py # a dashboard for today; calls no API, costs nothing
python app.py
The chore turns, ages and countdowns are computed from the config.yaml you just made, so
editing it and reloading shows your own family. Only the headline is canned until
you add an Anthropic API key.
Then follow the getting started guide — it has the API key step, where to find your calendar's iCal link for Google, iCloud and Outlook, and the whole Raspberry Pi build with systemd, kiosk mode and the screen schedule.
There is no login. The dashboard and the settings UI are both served without authentication, so anyone who can reach the port can read your family's agenda and rewrite
config.yaml— names, birthdays, and every calendar link in it.That is deliberate rather than unfinished: DinkyDash is a config file with a web form on it, and the file has no login either. It assumes it is on your home network, the same as a printer.
So keep the port off the public internet. Do not forward port 5000 on your router. If you need it from outside the house, reach it over a VPN such as Tailscale or WireGuard, or put a reverse proxy with basic auth in front of it.
Hosted mode is a different matter — it authenticates every request and is scoped per family. See Hosted mode raises the stakes.
| What you want | Where it is |
|---|---|
| Install it, and put it on a Raspberry Pi | dinkydash.co/getting-started |
| Every config key, with comments | config.example.yaml |
| Living with it: the daily cycle, the two buttons, what to check when something looks wrong | doc/running-it.md |
| Coming from an older version | doc/upgrading.md |
| Working on the code, and how the hosted build shares it | CLAUDE.md |
| Product terms and UI wording | doc/terminology.md |
The install and Pi guides live on the website rather than here, so there is one copy of each to keep right.
Conductor's dev run action starts the hosted dashboard and marketing website
together. The same command outside Conductor is venv/bin/python dev.py.
See local development for the required development database
and session key, ports, sign-in, and how Conductor picks up the run configuration.
The self-hosted quickstart above is unchanged.
pip install -r requirements-dev.txt # adds pytest and the website build; not needed on the Pi
python -m pytest tests/ -q
The suite runs in seconds. It covers leap years, timezone conversion, event ordering, chore rotation, the stale-dashboard logic, the config round-trip, and the settings routes that write it.
GitHub Actions runs the same command on every push and pull request, on Python 3.11
(.github/workflows/test.yml), alongside a gitleaks scan of
the full history. Every requirements file is pinned with ==, so a clean pip install gets the
versions CI passed on. A pull request that fails either check shows a red X.
| Path | Purpose |
|---|---|
dinkydash/ | The engine. Pure functions plus the model call — no clock, no file reads |
dinkydash/context.py | Ages, birthdays, countdowns, chore rotation |
dinkydash/calendars.py | iCal fetch, parse, recurrence, merging feeds |
dinkydash/board.py | Turns config + payload into what the dashboard renders |
dinkydash/runner.py | The two halves of the cycle: refresh_calendars and write_brief |
dinkydash/schedule.py | due() — which of the two the clock and the config owe right now |
dinkydash/store.py | Where the config, the dashboard and the note history are kept |
migrations/ | The hosted schema, plain SQL. Self-hosting needs none of it |
web/ | Flask app — dashboard, settings UI, templates |
web/templates/board.html | The dashboard itself, light and dark, all screen sizes |
generate.py | Command-line skin over dinkydash.runner — this is what cron calls |
app.py | Flask entry point |
config.yaml | All configuration. The settings UI writes this same file |
config.example.yaml | Template config, documenting every key |
tests/ | The test suite. Run it before committing |
doc/ | Running it day to day, and upgrading from an older version |
design/ | Mockups for the dashboard and settings UI, with the reasoning |
.env | ANTHROPIC_API_KEY (not in git) |
.env.example | The template for it — copy to .env |
.github/workflows/test.yml | CI: pytest and gitleaks, on every push and pull request |
Pull requests are welcome. The codebase is one monorepo serving both the self-hosted and the hosted build, so a change has to work in both modes — read CLAUDE.md before starting anything structural, and open an issue first for larger changes.
Known rough edges are listed under "Known issues" in CLAUDE.md.
MIT — see LICENSE.
.gitleaks.toml| Secret-scanning rules, including one for iCal secret addresses |
dashboard_data.json | The generated payload (not in git) |
content_history.json | A rolling record of the last 30 days' runs (not in git) |