I’m not really good with web applications but had a need to build one quickly. Normally, I used to use Streamlit or Gradio but this was a little complex with respect to user interactions & user management.

The goal was to build an admin (to manage and observe user activity) & user (labelling tool for doctors) consoles.

I already knew the basics: FastAPI for backend, Docker to run it, SQLite for database. I knew that at any point, max concurrent users will be below 10. So, I don’t have to think wrt distributed systems.

The only part where I’m a novice is frontend & auth. I used Claude Opus (with high thinking mode) to start with my application objective & shared my backend preferences.

Here’s what Opus suggested:

Component Technology Reason
Backend FastAPI (Python) Async, auto API docs, easy testing
Frontend HTMX + Jinja2 No JS build step, server-rendered, reactive
Styling Tailwind CSS + DaisyUI Modern UI, dark mode, pre-built components
Database SQLite Simple, persistent, sufficient for 10 users
Auth Session-based (secure cookies) Simple, no JWT complexity
Charts Chart.js (via CDN) Completion rate over time
Progress Bar DaisyUI radial progress Built-in component
Deployment Docker (single container) One command: docker compose up
Testing pytest + httpx Easy API testing

Short explanation of a few components from Grok:

htmx is a lightweight JavaScript library that enables dynamic, AJAX-like interactions in HTML using attributes, allowing server-side updates without full page reloads or heavy JS frameworks.

Jinja2 is a templating engine for Python, used to generate dynamic text outputs like HTML by combining templates with data, featuring variables, loops, and filters.

Tailwind CSS is a utility-first CSS framework that provides low-level classes for styling directly in HTML, enabling rapid custom UI development without writing custom CSS.

DaisyUI is a component library built on Tailwind CSS, offering pre-built, customizable UI elements like buttons and modals to speed up web design with themes and plugins.

I’ll share my workflow using these tools in a separate post. For today, this is what I’ve learned.