Private Client Work

Vizball

Bilingual federation website for Vizball, a Cameroonian team sport: news, forum, shop, club map and admin dashboard, on a custom Express + Bun + SQLite backend.

Vizball

About This Project

Vizball Play Pro is the official bilingual (French/English) website for Vizball, a team sport created in Cameroon. It brings the federation's news, community forum, equipment shop, club locator map, event calendar, governance documents and video tutorials into one site, with an admin dashboard to run it all. I took over an app that had been prototyped on Base44, a no-code backend platform. Once its SDK was removed, data persistence, login and file uploads all stopped working. I replaced that layer with a custom Express + Bun + SQLite backend, then shipped the site to production through roughly six weeks of client feedback.

At a Glance

15

REST modules

~535

FR/EN UI strings

13

releases in 6 weeks

~16.5k

lines of JS/TS

Role
Full-stack developer, working directly with the client: backend rebuild, frontend features, translation, SEO and production deployment.
Timeline
July – August 2026 · 6 weeks
Status
Live in production

Technologies Used

ReactViteTailwind CSSExpress.jsBunSQLiteJWTNginxGroq APILeaflet

Frontend

React 18, Vite 6, React Router 6, Tailwind CSS, shadcn/ui

15 pages, bilingual UI with ~535 translation keys, custom typography

Backend

Express 4 on Bun, TypeScript

15 REST route modules, one per resource

Data

SQLite via bun:sqlite

Schema, migrations and automatic seeding on first run

Auth & security

JWT, bcrypt, role-based access

Admin and forum login, env-based secrets, per-IP rate limiting

AI

Groq API (Llama 3.3 70B)

On-demand translation of articles, forum posts and events

Hosting

Ubuntu VPS, Nginx, systemd, HTTPS

Reverse proxy, process supervision, backups, deployment guide

Key Features

  • •News and articles managed from the admin dashboard
  • •Community forum with user registration and login
  • •Equipment shop with product pages, ratings and a browser-side cart
  • •Interactive club locator map built on Leaflet
  • •Events calendar for tournaments and federation events
  • •Video tutorials by category and skill level, plus a field diagram
  • •One-click AI translation of articles, forum posts and events (FR ⇄ EN)
  • •Admin dashboard for content, products, clubs, events, gallery, messages and forum moderation
  • •SEO tooling: per-page meta tags, generated sitemap and a pre-launch gate

Challenges & Solutions

01Replacing a removed no-code backend

With the Base44 SDK gone, nothing saved, nobody could log in and uploads failed. I wrote a new Express + Bun backend with one route file per resource, and a fetch-based API client that mirrors those routes one to one, so the frontend needed few changes.

02Keeping hosting simple and cheap

The client runs one small VPS. SQLite through Bun's built-in driver means there is no database server to run; the database creates and seeds itself on first start.

03Translating user content without blowing the budget

Interface text uses a static dictionary, but articles and forum posts are written by people. A translate button backed by a Groq-hosted Llama model accepts only known content types and languages, caps input length, and limits each IP to 20 requests per 10 minutes.

04Securing a public deployment

The API listens only on localhost; Nginx handles HTTPS and proxies /api and /uploads. Secrets live in environment variables, passwords are hashed with bcrypt, and only ports 22, 80 and 443 are open. I documented it all in a step-by-step deployment and backup guide.

05Iterating on client feedback

Several release rounds were driven by client review: spacing, type sizes, heading weights, navbar overflow at large breakpoints and chat widget theming. I also moved the site to a custom typeface and made the chat widget follow the visitor's light or dark setting.

Outcome & Lessons

The site went from a broken prototype to a production-ready, self-hosted app in about six weeks. It runs on one VPS with no paid backend services beyond optional AI translation.

  • •Owning the backend pays off: moving off a no-code platform removed a single point of failure and gave the client full control of their data.
  • •Simple infrastructure is a feature: SQLite, systemd and Nginx kept hosting costs and maintenance low for a small federation.
  • •Guardrails come first with AI features: allow-lists, length caps and rate limits kept translation safe to expose publicly.
  • •Short feedback loops build trust: frequent, small releases let the client see and steer progress.

Project Gallery

Vizball - Image 1
Vizball - Image 2

Project Links

Source code is private client work