WallpaperMachine
The wallpapers you love. A new home on your Mac.
Personal agents that plan parties and coffee dates for a friend circle, and ask you only for a yes.
LifestyleTypeScript · CSSGitHub @myselfsiddharthOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
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 ↗A personal agent for every student that plans the night for them. It spots the birthday, finds the evening everyone is free, hands out the jobs, and only comes to you when it needs a yes.
Built at DevHacks 2026 for the Cubbie Hackathon, Track 2: agents for different students that coordinate toward a shared outcome.
Add Rally to your Discord server, then in a channel your friends use:
/rally newcircle name:Dorm makes a circle and gives you a join code./rally join code:ABC123./rally plan occasion:hangout and everyone gets a message with buttons.On your own? Run /rally demo for three fictional friends who answer by themselves. Lost? /rally help shows the full guide, and the same list is on the website.
College friendships die of logistics, not dislike. Everyone is busy, nobody knows who is free when, the birthday plan stalls in a group chat, and nobody ever assigns the cake. Rally gives every student an agent that does the coordinating, so the plan actually happens.
Party mode. A birthday, Halloween or a concert becomes a plan: a time most people can do, a job for every need (cake, music, a ride, a place), a backup for each job, and an event on everyone's calendar. If someone passes on the cake, it moves to the best remaining person on its own. If nobody can do a job, the host is asked. At most one party per friend circle every 14 days; extra birthdays fold into a party already planned.
Pair mode. The agents keep noticing two friends who both have an open evening hour and have not met lately, and offer a coffee. Double opt-in: the second person is only asked after the first says yes, so nobody ever learns they were turned down. Two yeses put it on both calendars.
It plans on its own. Rally learns friends' birthdays from each connected Google Birthdays calendar (first name and day only), knows the major festivals (Halloween, Thanksgiving, New Year's Eve, St. Patrick's Day, Galentine's Day, and Diwali, Lunar New Year and Eid if a circle turns them on), and spots them two weeks ahead. Each circle chooses a mode with /rally auto: ask a likely host first (default), auto (start the plan, tell the channel, host gets a Stop button), or off. /rally festival switches individual festivals on or off.
The student stays in charge. Agents propose; students decide. Nothing goes on a calendar, and no job is anyone's, until they say yes.
Real life gets in the way, and the plan copes.
/rally demo adds three clearly labelled fictional friends whose agents answer on their own, so one person can watch a whole plan, including a job being handed over.npm run sim -- --seed 7 --students 30 --weeks 8 prints a labelled report from a simulated cohort.npm run dev, then open /sim to replay any of five simulated runs message by message: agents asking for free time, a proposal, a pass, the hand-over, the plan locking in.Everything in the replay is a simulation: the students and their calendars are made up, and the page says so. Every decision in it came from the same planning engine the Discord bot uses.
┌───────────────────────────── planning engine (pure TypeScript, no I/O) ─────────────────────────────┐
students │ governor slots tasks pairs protocol + state machines │
(Discord) │ 14-day cap, find the time Hungarian who should PartyPlan / PairPlan reducers, │
▲ │ │ invite caps, that leaves assignment + meet, friends event-sourced, idempotent, │
│ ▼ │ cooldowns, the fewest backups, fairness only, evenings privacy-safe message types │
┌───────────┐ │ quiet hours people out ledger, readiness of 60+ minutes │
│ Discord │◀─┤ │
│ bot │ └───────────────▲──────────────────────────────▲───────────────────────────────▲─────────────────────┘
└───────────┘ │ reduce(event) → messages │ │
▲ ┌───────────┴──────────┐ ┌──────────┴─────────┐ ┌──────────┴──────────┐
│ │ orchestrator │ │ simulator │ │ web control room │
│ │ ports: Calendar, │ │ fictional students │ │ replays a run as an │
└────────────┤ Platform, Store, Llm │ │ made-up calendars │ │ agent conversation │
└──┬────────┬──────┬───┘ │ seeded, reproducible│ └─────────────────────┘
Google Calendar│ Discord │ Supabase └────────────────────┘
(free/busy only) REST (key-value)
| Problem | How it is solved | Where |
|---|---|---|
| Fair, feasible job assignment | Minimum-cost assignment with the Hungarian algorithm. Each person has two slots; the second costs extra so work spreads. Heavy jobs cost more for people who did a lot recently (a decaying ledger). Cars, hosting and budgets are hard constraints. | src/engine/tasks.ts |
| A job nobody wants | Decline promotes the backup and picks a new backup. When nobody is eligible, the plan says so and asks the host (skip it, hand it to someone, or call it off). Never silence. | tasks.ts, party.ts |
| Finding a time | Candidate starts on a 30-minute grid; ordering is fewest left out, then lowest soft cost (weekday daytime and school nights cost more), then earliest. Reports exactly who was left out. DST-correct. | src/engine/slots.ts, time.ts |
| Not being annoying | One governor holds the 14-day party cap, daily and weekly invite caps, a 7-day cooldown after a decline, never-suggest lists and quiet hours. Messages made in quiet hours wait until morning. | src/engine/governor.ts, orchestrator.ts |
| Nobody learns they were turned down | Pair invites are asked one at a time. A "no" from the first person is never mentioned to the second. | src/engine/pair.ts |
| Privacy | The only calendar data that leaves a student's agent is free time. Message types have no field that can hold a label, and a property test checks random calendars and dietary needs against every message produced. | protocol.ts, tests/engine/privacy.test.ts |
| Surprise parties | The guest of honor is never given a job, and their agent is asked for availability silently. | party.ts |
| Information | The student's agent | Other agents | The group |
|---|---|---|---|
| Calendar titles and details | Reads them | Never | Never |
| When the student is free | Yes | Free windows for the dates in question only | The chosen time |
| Limits (quiet hours, invites a week, people to skip) | Yes | Only what a job needs, such as "no car" | Never |
| Dietary needs | Yes | Never | A generic "check what everyone can eat" |
| Who said no, and why | Their own | "Someone can't", never who | Never |
Before it starts planning something on their behalf, joins them to a plan, gives them a job, writes anything to their calendar, or sets up a coffee. Cancelling, passing and skipping are always one tap.
Five reproducible runs: 30 fictional students, 5 friend circles, 8 weeks around Halloween 2026. These are simulated: every number below comes from made-up students and calendars, run through the real engine.
| Run | Parties started | Locked in | Birthdays folded in | Jobs handed over | Minutes from a pass to a replacement saying yes | Coffee invites | Coffees confirmed | Caps broken | Details leaked | Double bookings |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 16 | 15 | 2 | 26 | 181 | 236 | 59 | 0 | 0 | 0 |
| 2 | 17 | 15 | 4 | 25 | 87 | 230 | 46 | 0 | 0 | 0 |
| 3 | 16 | 15 | 6 | 36 | 90 | 238 | 59 | 0 | 0 | 0 |
| 4 | 17 | 16 | 4 | 33 | 85 | 232 | 56 | 0 | 0 | 0 |
| 5 | 18 | 18 | 3 | 42 | 55 | 234 | 47 | 0 | 0 | 0 |
The three safety checks are computed from the raw message log by code that is independent of the planner, and the test suite runs them on ten more seeds. Plans lock in at 86 to 93 percent readiness on average. Reproduce any row with npm run sim -- --seed N.
npm install
npm test # 245 tests: engine, privacy and cap properties, simulation invariants, adapters
npm run typecheck
npm run sim -- --seed 7 --students 30 --weeks 8
npm run gen:sim # regenerate the five bundled replay runs
npm run dev # the web control room at http://localhost:3000
Requires Node 22 or newer.
The plain-language policy is at /privacy on the site. Rally reads only busy and free times from a calendar, never titles or details, and /rally forget removes a person everywhere.
CALENDAR_MODE=demo, every Discord user gets a made-up but believable weekly calendar (the same one every time), so the bot can be tried end to end. /rally status says plainly when a calendar is a demo./rally birthday) or, for connected Google users, the Birthdays calendar. The Google path is covered by tests against recorded-shape responses only; it has not been run against a real contacts calendar. Matching is by exact first name and skips ambiguous names.src/engine/ the planning engine (no I/O): time, governor, slots, tasks, pairs, protocol, party, pair
src/sim/ seeded simulator: personas, calendars, world, runner, metrics, CLI
src/app/ orchestrator, message wording, Discord interaction handler, wiring
src/adapters/ calendar (fake, Google, OAuth), platform (fake, Discord), store (memory, Supabase)
src/lib/ environment checks, hard-line filter, model interface
src/ui/ control room components and replay logic
app/ Next.js pages and API routes (/api/discord, /api/tick, /api/google/callback)
tests/ vitest
docs/ architecture, deploy steps, demo script, design spec and plan