This site is driven by two keys, like the machine it came from. Reading: j and k scroll, d and u move half a page, gg goes to the top, G to the bottom, H and L switch windows, ? opens the help. Space is the Neovim leader and handles content: Space then h home, r research, p projects, g gear, a about, / tags, or Space then a digit to jump to that window. Home is the tmux prefix and handles windows: Home then c opens a terminal, Home then & closes a window, Home then space goes to the next one. While focus is on the keyboard, h j k l move between keys and Enter opens one.

ResearchR AboutA Gear — G for gear — keyboard, terminal, editor, homelab.G
    ProjectsP Tags — / as in vim: search./
    ×
    Menu

    Lemme

    Lemme is an AI-assisted quiz app. Users upload screenshots of quizzes, OCR extracts the question text, and multiple LLM providers generate candidate answers along with their reasoning...

    Lemme is an AI-assisted quiz app. Users upload screenshots of quizzes; OCR extracts the question text, then multiple LLM providers generate candidate answers along with their reasoning.

    Stack

    LayerTechnology
    BackendGo 1.24, Fiber v2, MySQL, Redis, WebSocket, Google OAuth
    FrontendSolid.js, Vite, PandaCSS / Park UI, TypeScript
    Reverse proxy / TLSCaddy
    Deployment targetDebian homelab at lemme.arisjirat.com

    Architecture

    Browser
      -> Caddy (80/443, TLS termination)
          -> UI container (Nginx, static Solid build)
          -> API container (Go Fiber)
               -> MySQL (quiz/user/session data)
               -> Redis (session + OCR cache + locks)
               -> OCR + LLM providers (OpenAI/Anthropic/Gemini)

    Caddy sits in front of the entire stack and handles TLS termination. Behind it:

    • UI — a static Solid build served by Nginx.
    • API — a Go Fiber service that talks to MySQL, Redis, and external OCR/LLM providers.

    Local Development

    The whole stack runs via Docker Compose.

    1. Configure the environment

    Copy the root and backend env templates, then fill in the required secrets:

    cp .env.example .env
    cp lemme_service/.env.production.example lemme_service/.env

    2. Start the services

    make dev

    3. Run migrations (if needed)

    make migrate

    4. Verify

    EndpointURL
    UIhttp://localhost:3000
    API healthhttp://localhost:9090/healthz

    Production Deployment

    1. Prepare the host

    On the Debian server, run the setup script:

    ./scripts/setup-server.sh

    2. Clone and configure

    Clone the repository into /opt/lemme, then create the following env files:

    • /opt/lemme/.env
    • /opt/lemme/lemme_service/.env

    3. Deploy

    ./deploy.sh

    4. DNS and networking

    Point the lemme.arisjirat.com A record at the host’s public IP, then forward ports 80 and 443.

    5. TLS

    Caddy provisions and renews certificates automatically — no manual steps required.

    Environment Variables

    Templates are available at:

    • .env.example — root compose env
    • lemme_service/.env.production.example — backend production env

    Core variables

    GroupVariables
    DatabaseMYSQL_ROOT_PASSWORD, MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD
    RedisREDIS_PASSWORD
    BackendDB_DSN, REDIS_ADDR, SESSION_COOKIE_SECRET, JWT_SECRET
    OAuthGOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, GOOGLE_REDIRECT_URL
    Frontend build argsVITE_API_URL, VITE_WS_URL, VITE_FRONTEND_URL, VITE_FEEDBACK_GFORMS_URL

    Common Commands

    make dev       # build + up
    make up        # up without rebuild
    make down      # stop all services
    make build     # build all images
    make migrate   # run DB migrations
    make logs      # tail logs
    make backup    # run backup script
    id en
    rss gh in