The Kudos board had been running for some time now when someone from my work mentioned asked about standing up a version for the company. I’d built it for personal use, a little recognition tool where anyone can post appreciation cards to a board, confetti on submit, email digest once a week. The question came up almost casually: “Can we set something like this up for the company?”
I said sure. Then I thought about what that actually meant.
My Kudos instance lives in my personal AWS account. It uses my Supabase instance for the database. It sends email through Resend because AWS had denied my SES production access request (personal accounts hit that wall; corporate accounts almost certainly don’t). Those are three different services wired together around one set of credentials, designed by one person for one person. Handing someone the repo wouldn’t give them a working Kudos board. It would give them a bunch of references to my infrastructure.
So I built the fork.
Not a copy. A template. “Something that works for me” and “something anyone can deploy” turns out to be different design problems, and conflating them is where most personal projects fall apart when they try to travel.
The whole stack moved to AWS-native. DynamoDB instead of Postgres, because the access patterns are simple enough and it scales to zero between uses. Cognito for auth, with a SAML/OIDC slot so a corporate team can wire in their existing identity provider with a few Terraform variables. SES for email, because that’s what an enterprise AWS account will have available. Six Node 20 Lambdas, one EventBridge Scheduler for the weekly digest. Everything else event-driven or TTL-driven.
In the original codebase, I’d patched a board-deletion bug with a cron job. For the fork, I replaced the cron with DynamoDB TTL and structured the item keys so cleanup cascades automatically. No scheduler. No edge case where the job fires at the wrong time because I configured it wrong on a Sunday night.
I haven’t run terraform apply yet. It still needs to pass a security review. But that wasn’t the point. The point was to answer the design question: what does “portable” mean for an app that wasn’t originally designed to move?
The original Kudos board has good reasons behind every decision. Almost none of them are written down anywhere. They lived in my head, which is fine when I’m the only operator. The fork required me to make those reasons legible to someone who wasn’t there when I built the thing.
That’s the actual work. Not the Terraform. Not the DynamoDB schema. Making the knobs findable by someone who doesn’t know why the knobs exist.