All projects
CASE 01 · WEB PRODUCT FOR A DETAILING STUDIO

VÉLOX Detailing Studio

A website, online booking, admin panel and Telegram bot for a car detailing studio. Every channel shares one database and one set of booking rules.

Role
Full-stack development
Scope
Website · Admin panel · Bot
Core
Python · FastAPI · PostgreSQL
Product language
Russian
01

The problem

The studio needed to take bookings from both the website and Telegram, manage staff schedules and services, update site content without a developer, and make sure the same time slot can’t be taken through two different channels.

02

The solution

A single product built on FastAPI and PostgreSQL. The website, admin panel and Telegram bot share one database and one set of booking rules. The architecture supports multiple studios: every booking belongs to its studio.

ClientsWebsiteJinja2 · JavaScript
StudioAdmin panelRoles and access
Clients and studioTelegram bot and Mini Appaiogram 3
BackendFastAPI · shared booking rulesAPI · service layer · Pydantic 2
DataPostgreSQL 17SQLAlchemy 2 async · Alembic migrations
Based on the repository structure: app/web, app/bot, app/api, app/services, app/models.
03

Client-facing website

A responsive studio website: services and prices, before/after work, reviews, gift certificates and contacts. The owner edits texts, photos and prices in the admin panel. Screenshots show the product in Russian, its original language.

04

Online booking

  1. 1ServiceChosen from the studio catalogue
  2. 2SpecialistPicked by the client where the service allows it
  3. 3TimeOnly available slots
  4. 4Contact detailsName, phone, car model optional
  5. ConfirmationBooking number, calendar file and a cancellation page available until the deadline

The website, admin panel and bot validate bookings against the same rules; overlapping slots are additionally guarded by database-level constraints.

05

Admin panel

The studio’s workspace, from schedules and staff workload to site content. Access is split by role.

  • Schedules and staff workload
  • Services, prices and specialists
  • Clients and bookings
  • Site content, media and reviews
  • Settings and staff access
  • Roles: owner, administrator, specialist
  • Client data deletion on request (Russian Federal Law 152-FZ)
  • Daily backups
06

Telegram bot

For clients

  • Book a service
  • Mini App with a calendar of free slots
  • “My bookings” section
  • Reschedule or cancel
  • Ask the administrator a question
  • Reminders 24 hours and 2 hours ahead

For the studio

  • New requests arrive in the administrators’ chat
  • “Confirm”, “Assign specialist” and “Decline” buttons
07

Tech stack

Backend

Python 3.12FastAPIPydantic 2

Data

PostgreSQL 17SQLAlchemy 2 asyncAlembic

Bot

aiogram 3Telegram Bot API

Interface

Jinja2HTML & CSSJavaScript

Media

PillowAVIFWebP

Quality

pytestruffGitHub Actions
08

Testing and quality

The pytest suite is split into unit, integration, API and bot tests, with an isolated environment of its own: a separate Docker Compose stack. Code is linted with ruff, and checks run in GitHub Actions.

tests/unittests/integrationtests/apitests/botcompose.test.yaml
pytest · Oct 22219testsFresh run in the isolated stack: all tests pass.
pytest-cov · Oct 2292%line coverageMeasured with pytest-cov (coverage.py) over the app package, line coverage.
GitHub · Oct 22127commits on mainA supporting indicator of development history, not a quality metric.
09

Infrastructure and deployment

Docker Compose

Separate configurations for development, testing and production; memory limits are set for the server.

Migrations

The database schema is versioned with Alembic.

Backups

Daily database and media backups, plus a copy before every update.

Documentation

Installation, updates and backups are covered in docs/deployment.md.

Personal data

Client data deletion on request, in line with Russian Federal Law 152-FZ.

Server addresses, keys and credentials are not published in this case study.

Need a similar system?

Tell me about the problem and we’ll work out how to solve it.