Building a User Interview Tracker in an Afternoon (with Gadget)



This content originally appeared on DEV Community and was authored by Nate Sharma

Lately, I’ve been leaning into building small internal tools for my team. Things that aren’t glamorous, but make our process smoother. One of the most useful was a user interview tracker: just a lightweight web app where we could log interview notes, tag them by feature or theme, and revisit them later.

I built it in a few hours using React + Gadget, and it’s one of those tools that quietly changed how we work.

Why Build One?
We’d been doing user interviews in Notion and Google Docs, which worked fine… until we wanted to do anything with that data. Finding patterns across interviews, tagging insights, or just tracking who said what, it was all friction.

I didn’t want to build a whole CRM or research platform. Just a place to:

  • Log interview notes (timestamped and associated with a user)
  • Tag entries by themes (like “onboarding friction” or “mobile nav”)
  • Search and filter by tags or date
  • Keep things private but sharable with the team

Enter Gadget:
I’d used Gadget before for a painpoint journal app and was impressed by how much backend boilerplate it cut out. For this tool, I wanted to go a little deeper multi table relationships, filtering, and some conditional logic.

Gadget gives you:

  • Built in Postgres DB (via a visual schema editor)
  • Auth (already wired up)
  • File storage (handy if we want to upload transcripts later)
  • Auto generated REST + GraphQL APIs
  • A backend code editor (runs server side, uses JS/TS)
  • Free tier with generous limits

All I had to do was hook up a React frontend, and I was off.

A Quick Breakdown of the Build

  1. Schema setup
    I created models for Interview, User, and Tag. Gadget’s schema editor made this painless, and relationships between models (e.g., many interviews per user, many tags per interview) were easy to define visually.

  2. Auth
    Out of the box, users can sign in with email/password or Google. I just stuck with email login. Didn’t write a single line of auth code.

  3. API
    Every model gets a GraphQL and REST API auto generated so I just queried/interacted from my React app with Apollo.

  4. Backend logic
    I used Gadget’s built in JS backend to handle things like auto tagging interviews if certain keywords appeared, and flagging stale entries after 30 days. The background job setup was surprisingly painless.

What Went Wrong (But Not Really)
There were a couple of small hiccups:

  • Nested filtering in GraphQL took a minute to figure out. I wanted to get “all interviews tagged with ‘onboarding’ from the last month” and had to poke around a bit to structure the query right.
  • I briefly messed up the permissions config. My own fault, not Gadget’s and accidentally let anyone delete entries. Luckily, their UI makes it easy to review access rules.
  • Styling took longer than it should have (because I fuss over UI too much).

But honestly? Nothing broke. I never got stuck debugging some weird auth middleware or tracking down CORS issues. It felt like working downhill.

Final Thoughts
The user interview tracker is now used by design, product, and support. People log stuff casually after a call, tag it, and move on. During planning, we can quickly pull up real user voices sorted by theme.

It’s simple. And it works.
And I actually enjoyed building it.


This content originally appeared on DEV Community and was authored by Nate Sharma