Personal website showcasing projects, self-hosted services, and an AI-assisted visitor terminal.
Delivered as a TypeScript monorepo that pairs a Next.js 16 frontend with a Hono API backend.
- Overview
- Highlights
- Architecture
- Terminal Experience
- Screenshots
- Getting Started
- Environment Variables
- Production Deployment
- Project Structure
- Tech Stack
- Community & Policies
- Maintainer
The website blends storytelling with real-time integrations. Visitors can explore professional highlights, current activity, curated tooling, and an interactive terminal that moderates and publishes community messages. All user-facing copy supports German and English through next-intl.
- Interactive terminal: Submit moderated messages that flow into a multilingual message feed with rate limiting and session persistence.
- AI moderation pipeline: Orchestrated with LangChain and OpenAI, using Toon Format prompts to minimise token usage.
- Live data integrations: Background jobs pull from GitHub, Spotify, Jellyfin, and other services for the activity and self-hosted sections.
- Two-language experience: Server and client components read from
apps/www/src/locals, offering a consistent bilingual UI. - Dynamic accent system: Visitors can switch the accent palette, driving a site-wide glow theme showcased in the tools section.
- Self-hosted showcase: Dedicated section for infrastructure projects, powered by the same API that operates the terminal.
- Monorepo managed by Turborepo with shared TypeScript config and Biome formatting.
- Web app (
apps/www): Next.js 16, Tailwind CSS, motion animations, server actions for data fetching, and localized content. - API (
apps/api): Hono server running on Bun with Drizzle ORM, PostgreSQL for persistence, Redis for terminal session state, and LangChain-driven OpenAI moderation. - Infrastructure:
compose.ymlprovisions PostgreSQL, Redis, the API, and the web frontend as separate services. - Shared tooling: pnpm workspaces, Turbo pipelines, and a centralized environment file simplify local and production setup.
The terminal is a core feature that mixes UX polish with backend automation:
- Each visitor receives a signed cookie-backed session with configurable quotas.
- Messages pass through an OpenAI moderation step before persisting to PostgreSQL.
- Redis tracks rate limits, and the API returns translated content for the live feed.
- LangChain chains prompts and system context while Toon Format compresses payloads to keep OpenAI token consumption predictable.
- The plan below summarizes the moderation and publishing flow implemented in
apps/api/src/services/terminal-*:
Show gallery
Every screenshot from docs/assets is included below to illustrate the major flows.
Hero Preview
Accent Color Controls
Activity Feed
Projects Overview
Self-Hosted Services
Language Switcher
Terminal Message Entry
Terminal Approval State
Terminal Awaiting Review
Terminal Rate Limit
Terminal Rejection
Terminal IBAN Preview
Terminal IBAN Rejection
Terminal Language Feed
- Node.js >= 20
- pnpm >= 10 (declared in
package.json) - Docker (optional, required for running PostgreSQL and Redis locally via Compose)
pnpm install- Run both apps concurrently:
pnpm dev
- Start the frontend only:
pnpm www:dev
- Start the API only:
pnpm api:dev
Additional scripts for linting, formatting, and database tasks live in the root package.json.
Copy the template and fill in your secrets before running any service:
# macOS / Linux
cp env.example .env
# Windows PowerShell
Copy-Item env.example .envKey variables for production are documented in env.example. The snippet below shows the syntax expected by the Docker services:
# Core URLs
NEXT_PUBLIC_API_URL=https://example.com/api
NEXT_INTERNAL_API_URL=http://api:3001
# Database
DATABASE_URL=postgresql://turborepo:password@localhost:5436/turborepo
DATABASE_URL_INTERNAL=postgresql://turborepo:password@postgres:5432/turborepo
# Redis
REDIS_HOST=localhost
REDIS_HOST_INTERNAL=redis
REDIS_PASSWORD=redis_password
# Integrations
SPOTIFY_CLIENT_ID=
SPOTIFY_CLIENT_SECRET=
DISCORD_USER_ID=
GITHUB_TOKEN=
PTERODACTYL_API_URL=
PTERODACTYL_API_KEY=
JELLYFIN_BASE_URL=
JELLYFIN_API_KEY=
# Terminal
TERMINAL_SESSION_COOKIE_NAME=user_id
TERMINAL_SESSION_TTL_SECONDS=86400
TERMINAL_SESSION_TEXT_LIMIT=3
TERMINAL_SESSION_COOKIE_DOMAIN=
TERMINAL_SESSION_COOKIE_SAME_SITE=None
OPENAI_API_KEY=
TERMINAL_OPENAI_MODEL=gpt-4.1-miniThe repository ships with a Docker Compose workflow tailored for production:
- Fill
.envwith production-ready secrets and correct public URLs. - Build and start the stack:
docker compose up -d --build
- Services exposed by
compose.yml:postgreson port5436(maps to5432inside the container)redison port6380apion port3001wwwon port3000
- Configure your reverse proxy or platform with:
NEXT_PUBLIC_API_URLpointing to the public API host (e.g.https://api.example.com)NEXT_INTERNAL_API_URLreferencing the internal Docker network URL (http://api:3001)
For upgrades, pull the latest code, rebuild the images, and rerun docker compose up -d --build.
apps/
api/ # Hono API with Drizzle ORM and Redis-powered services
www/ # Next.js frontend with motion-enhanced sections and i18n
docs/
assets/ # Marketing and product screenshots
plan/ # Terminal moderation diagram
env.example # Environment variable template
compose.yml # Production-ready Docker Compose stack
- Frontend: Next.js 16, React 19, Tailwind CSS, motion/react, next-intl, Phosphor Icons.
- Backend & AI: Hono, Drizzle ORM, PostgreSQL, Redis, LangChain, OpenAI, Toon Format.
- Tooling: Turborepo, pnpm, Biome, TypeScript, Bun.
- Infrastructure: Docker Compose, multi-stage Dockerfiles under
apps/wwwandapps/api.
- Read our Contributing Guidelines before opening a pull request.
- Participation is governed by the Code of Conduct.
- Responsible disclosure steps are outlined in SECURITY.md.
- The project is licensed under GPL-3.0.
Built and maintained by Skeptic. Reach out through the repository issue tracker for questions or feedback.
