Context
Since COVID, working from home became the norm. But last year my workplace introduced a hybrid mandate: at least 50% office attendance, or risk losing our annual bonus.
We tap our cards to check in at the office — but the system doesn't share that data back to us. So everyone tracks it manually, juggling spreadsheets, calendars, and counts just to work out whether they're on target.
While exploring AI-assisted coding, I built Attendy to solve it.
Challenges
| Challenge | Why it matters |
|---|---|
| No visibility into your own attendance | The office card system tracks check-ins but never shares the data back. Everyone's held to a 50% target with no way to see where they stand. |
| No lightweight tool to fill the gap | Existing tools were heavy enterprise systems or generic calendars — nothing personal, most costly. |
| Real stakes, no safety net | Bonuses are tied to the target. A miscount isn't a small error — it's money lost on data you can't check. |
Goals
| Goal | Target outcome |
|---|---|
| Solve a real problem | Give colleagues a reliable way to track and prove attendance against the mandate |
| Validate the idea | Get real users and confirm the tool is useful beyond just me |
| Prove the build model | Show a designer who codes can ship a real product end-to-end, solo |
| Build in public | Use the project to grow visibility and share what I learned |
Results
| Metric | Result |
|---|---|
| Reach | 30,000+ across internal and LinkedIn |
| Signups | 599 |
| Monthly active users | ~150 |
| Support | ~20 coffees via Buy Me a Coffee |
The build
MVP
The MVP started from my own need and what I'd heard from colleagues. I prompted it into a draft in Claude Code, fast.
| Initial feature | What it does |
|---|---|
| Attendance breakdown | Office vs. home percentage across the month |
| Target status | Clear signal on whether you're meeting your working target |
| Real-world aware | Excludes annual leave and public holidays |
| Multi-region support | Multiple countries and regional public holidays |
| Fast onboarding | Up and running in under 3 minutes |
Tech stack
As a designer with a CS background, I owned the full build — lo-fi concept to deployed app. The stack favours speed and low maintenance: AI tooling to move fast, boring proven services where reliability matters most.
| Layer | Approach | Tools |
|---|---|---|
| UX / UI | Concept to lo-fi, fast — no over-designing | ChatGPT, Figma |
| Tech foundation | React Native early, for scalability and lower cross-platform maintenance | React Native |
| Style guide integration | Design tokens → components → code; visual rules became reusable patterns | Claude Code |
| Database & API | Schema-first, minimal backend overhead | Supabase, Claude Code |
| Authentication | Kept boring on purpose — reliable verification flows | Supabase Auth, Resend |
| Version control | GitHub from day one, for traceability and momentum | GitHub |
| Deployment | Cheap and quick to set up | Go Daddy, GitHub |
| Landing page | Fast signal over polish — ship quickly | Figma Make, Claude Code |
| Payment | Simple, hosted checkout for optional support — no custom billing logic | Stripe |
| Analytics | Lightweight product tracking — signups and basic usage, not a full event pipeline | PostHog |
Security
Handling data means real risk. I'm not a security expert, so I leaned on trusted tools rather than building from scratch.
| Risk | How I handled it |
|---|---|
| Data stolen or intercepted | Encryption at rest and in transit (AES-256, TLS) via Supabase |
| Users seeing each other's data | Row-Level Security enforced at the database — everyone sees only their own |
| No accountability | Admin access logged for a full audit trail |
| Users can't control their data | On-demand account deletion (GDPR/CCPA) |
Building on SOC 2-compliant infrastructure kept the data safe and let me focus on the product.
Getting it out
Landing page
A focused landing page prioritising fast signal over polish — clear value proposition, single call to action, built to validate interest quickly rather than to impress. Shipped fast with Figma Make + Claude Code.
Team showcase
I ran a 15-minute showcase for our division-level digital team (~50 people) in person — not just pitching the idea of vibe-coding, but demonstrating a real, shipped outcome. It turned a concept into something tangible the team could see working.
- ~28 signups came from the session, and
- 3 colleagues picked up vibe-coding themselves — subscribing to Claude Code and now sharing their own work with me regularly.
The deck I used in the showcase.
Internal platform
I shared Attendy on an internal social platform (with over 50k users).
| Metric | Result |
|---|---|
| Seen by | 25,480 |
| Reactions | 229 |
| Comments | 45 |
| Shares | 2 |
Takeaways
- Right audience. Colleagues who actually track attendance — the exact problem Attendy solves. ~5.5x my LinkedIn reach, to a crowd that cares.
- Real product signal. Alongside the encouragement, people asked for specific features and flagged real bugs.
- Visibility. 25,000+ colleagues saw a designer who ships working products, not mockups.
I ran a 4-post series documenting the project from launch to cost breakdown,
| Post | Impressions | Reactions | Comments |
|---|---|---|---|
| The launch | 1,242 | 30 | 0 |
| Getting first users | 667 | 12 | 6 |
| The tool stack | 1,902 | 19 | 4 |
| What it cost | 810 | 9 | 1 |
| Total | 4,621 | 70 | 11 |
Takeaways
- Above-average engagement. 4,621 impressions, 70 reactions across four posts — ~1.5% vs LinkedIn's ~0.4% average.
- Low conversion, as expected. My audience is peers and industry folk, not Attendy's users.
- Reach ≠ conversation. The launch post reached the most people and got zero comments. The smallest post got the most.
- Real value was visibility. Positioning myself as a designer who codes and ships.
- Proof-of-work beat opinion. Visual-led posts (tool stack, launch) travelled furthest.
Analytics
I set up PostHog for lightweight tracking, enough to see signups and usage, not a full event pipeline.
I didn't optimise the analytics or conversion; the initial aim was to prove the build, not grow a funnel. So the numbers here are directional.
Iterating on feedback
I iterated the MVP from two sources: in-app feedback, and social comments on the internal platform.
In-app feedback
The feedback loop has two connected sides:
Users land on a community board, not a blank form — they see what others suggested, vote with a tap, and add their own (feature or bug, signed-in or anonymous). Shipped ideas move to a public Resolved tab, so people know they were heard.
Customer side — Post, vote, and see what shipped on the public board.
Every submission lands in one filterable queue. I publish the best ideas to the board, reject or archive the rest, and mark shipped ones Resolved. Pending → Approved → Resolved.
Admin side — One queue: triage, publish, and mark shipped. 23 submissions came through the board — 17 shipped.
Feedback goes in → admin publishes → community votes → it ships → Resolved. Feedback in, transparency out.
Social comments
The post drew 45 comments. Plenty of likes, but enough were feature requests, bugs, and questions to work from. I triaged them the same way as in-app feedback.
| Type | Feedback | Opportunity |
|---|---|---|
| Feature | "Option for users to define their country specific PH — then this can be used for all countries." | Custom public holidays |
| Feature | "Import Public Holidays to support different geographic locations that are not standard, and give it a name." | Region-level holidays |
| Feature | "Would love to see if compressed weeks/fortnights could be incorporated as filter too." | Compressed week support |
| Feature | "Would like to see a running tally v planned attendance." | Forecast discoverability |
| Question | "How long will this app continue to exist? What happens to the data if discontinued?" | Data policy |
Snapshot
Running it
Cost
The entire cost was tooling. Most services are free to start and scale with usage, so running costs stay low until there's real traction.
| Tool | Cost |
|---|---|
| Figma | US$20 / month |
| ChatGPT Plus | US$20 / month |
| Claude Code Max | AU$169.99 / month |
| Supabase | Free to start (< 50k MAU) |
| Resend | Free → US$25 / month (after ~100 verifications/day) |
| GitHub | US$4 / month |
| Domain | AU$5 (year 1) → AU$24.66 (year 2) |
| Total | |
|---|---|
| Monthly | ~US$69 / ~AU$275 |
| Yearly | ~US$828 / ~AU$3,300 |
Takeaway: For a few hundred a month, a designer who codes can test a real product end-to-end.
Buy me a coffee
Attendy is free, and I chose not to monetise it.
A Buy Me a Coffee link offers optional support to help cover running costs — no paywall, no subscription, just a way for people who find it useful to chip in.
Payments run through Stripe's hosted checkout, kept deliberately simple.
Reflection
If I built an app again, a few things I'd do differently
| Area | What I'd do differently |
|---|---|
| Distribution | Go where the pain lives, industry forums, other companies, not just my own network. |
| Conversion | Push on conversion as its own problem, not just reach. The showcase converted ~40% of the room; the post seen by 25,000 converted a fraction of a percent. |
| Product-vs-work | Untangle IP and audience early, so monetisation stays an option. |
| Mindset | Be proactive and consistent. Exposure compounds — the more you ship in public, the more comes back. |
| Tooling | A .com/.app domain over .work (a real trust barrier), and Vercel over GitHub for smoother deploys. |
The build was never the hard part. Distribution, positioning, and small trust signals decide whether a good product reaches people.
