A group adopts Scrap, a small salvaged robot who runs on signal. Every honest check-in from a member keeps him powered. Overnight, while nobody is watching, he writes a short log entry about the day in his own voice, and it is waiting in the morning.
The rule: Scrap is powered by honesty, not by happiness. A terrible day powers him exactly as much as a great one. He only runs low when nobody says anything at all. He never dies; with no signal he sleeps, and wakes the moment someone checks in.
Built solo in one weekend for the AWS Builder Center Weekend Creative Agent Challenge (Aug 21–24, 2026), on top of Undercurrent.
Live app: [TODO: Signalcraft Amplify URL — step 7] · Article: docs/article.md
- Check in once a day. A score and an optional note, anonymous by schema: the row with your score has no author, and the row with your name has no score.
- Scrap's power comes from who showed up, never from what they said. Five states (asleep, waking, low, steady, bright) computed from unique members in the rolling 24 hours, by a Lambda that reads a table with no mood column.
- Every night he writes. An EventBridge Scheduler wakes a Lambda that asks Claude Haiku 4.5 on Amazon Bedrock for three to five sentences in Scrap's voice and stores them keyed to the date, never overwritten.
Architecture in one line: React + Vite on Amplify Hosting; Amplify Gen 2 (Cognito
groups, AppSync + DynamoDB with subscriptions); a Node Lambda on the PingReceipt stream
for power; an EventBridge Scheduler driving a Python 3.12 Lambda that calls Bedrock and
writes LogEntry rows. Scrap is SVG in React with named parts; Bedrock writes only what is
around him.
This is a concept build with a seven-day life. It runs through Sun Aug 30, 2026. On Mon Aug 31: disable both EventBridge schedules (the nightly log and the hourly power tick), delete the Amplify app, confirm zero Bedrock invocations remain, delete the $5 budget, keep this repo public. An unattended nightly job is the failure mode for a hackathon project, so the date is here where future-me will see it.
Demo history is seeded. Log entries dated Aug 18–22 were
generated by scripts/backfill-log.ts, which runs the same Bedrock generator against five
days of synthetic aggregates so the archive looks lived-in from day one. The first
autonomous entry is scheduled for 00:30 ET on Aug 24 (dayKey 2026-08-23); until it lands,
every entry you can see is seeded and labeled.
npm install
npx ampx sandbox # personal cloud backend; writes amplify_outputs.json (needs `aws login`)
npm run dev # http://localhost:5173Before pushing: npx tsc -p amplify/tsconfig.json && npm run build — the root build does not
type-check amplify/.
Five demo accounts share one group (demoN@signalcraft.local, ask for the password):
demo1 is ana, the lead; demo2–demo5 are kai, mira, theo, june. A sixth,
dev@signalcraft.local, is in the dev group and gets the dev tab (forget today's
check-ins, reset, cycle Scrap's states). They live in this app's own Cognito pool —
scripts/create-cast.sh creates them.
All npx tsx scripts/<name>.ts; set OUTPUTS=<path> to target another backend's
amplify_outputs.json (defaults to the local sandbox).
| Script | Env | What it proves / does |
|---|---|---|
prove-log.ts |
member creds | the scheduler tick → Python Lambda → Bedrock → a dated LogEntry lands; fails on fallback bodies |
backfill-log.ts |
AWS CLI session | five days of seeded log entries for the demo group (deterministic ids; reruns add nothing) |
create-cast.sh |
USER_POOL_ID, DEMO_PASSWORD |
creates the demo cast in this app's user pool with groups (idempotent) |
checkin-as.ts EMAIL SCORE [NOTE] |
DEMO_PASSWORD |
check in as any cast member from the terminal — how the demo reaches "bright" |
show-robot.ts |
member creds | prints the Robot row (power state, unique members) |
prove-realtime.ts |
TEST_EMAIL, TEST_PASSWORD |
check-in → stream → Lambda → AppSync mutation → subscription event in 30s |
seed-members.ts |
DEMO_PASSWORD |
names and poses for the five-member cast |
reset-demo.ts |
DEV_EMAIL, DEV_PASSWORD |
forget today's check-ins / wipe / reseed |
PLAN.md the weekend schedule · docs/MAP.md codebase map · NOTES.md the build log, every decision and bug as it happened · docs/learn/ the React + system-design journal · docs/marketing/ Scrap's voice guide and copy · docs/undercurrent/ what this is built on.