A dark-neon corporate website built with Flask. Features a full admin CMS backend, multi-product showcases, and an aesthetic that screams "we let an AI build this and we're proud of it."
# Clone the repo
git clone https://github.com/viibeware/viibeware-website.git
cd viibeware-website
# Create your environment file
cp .env.example .env
# Edit .env — at minimum, change SECRET_KEY and ADMIN_PASS
# Launch
docker compose up -dThe site will be available at http://localhost:8899
Admin panel: http://localhost:8899/admin (default: admin / admin). The first login with the default password forces you to choose a new one (≥12 chars, with upper/lower/digit).
The dashboard server widget tries to read /host/etc/os-release before falling back to the container's own release file. To make it show the real host OS (e.g. Ubuntu 24.04.4 LTS) instead of the container's base image (Debian 13), add a read-only bind mount under volumes: in your docker-compose.yml:
services:
viibeware-web:
volumes:
- viibeware-data:/app/data
- viibeware-uploads:/app/static/uploads
- /etc/os-release:/host/etc/os-release:ro # ← host OS readoutSafe to omit — if the file isn't mounted the widget just shows the container OS.
If you have an existing systemd-based install at /opt/viibeware, the migration script handles everything:
cd viibeware-website
chmod +x migrate-to-docker.sh
./migrate-to-docker.sh /opt/viibewareThis will stop the old systemd service, start the Docker container, copy your content.json and uploaded images into the Docker volumes, and verify the container is healthy. Your old install is left untouched until you manually remove it.
viibeware/
├── app.py # Flask application + content migration layer
├── Dockerfile # Container image definition
├── docker-compose.yml # Docker Compose (dev — builds from source)
├── requirements.txt # Python dependencies (Flask)
├── migrate-to-docker.sh # Bare-metal → Docker migration script
├── .env.example # Environment variable template
├── CHANGELOG.md # Version history
├── data/
│ ├── content.json # Live site content (excluded from deploys)
│ └── content.example.json # Default content (copied on first run)
├── static/
│ ├── css/
│ │ ├── style.css # Frontend styles (dark neon / cyberpunk)
│ │ └── admin.css # Admin panel styles
│ ├── js/
│ │ └── main.js # Frontend interactions
│ └── img/ # Logos, screenshots, OG images
└── templates/
├── index.html # Homepage (dynamic section rendering)
├── macros.html # Jinja2 macros for product/install sections
├── admin_dashboard.html # Admin CMS dashboard
├── admin_login.html # Admin login page
└── admin_raw.html # Raw JSON content editor
| Variable | Default | Description |
|---|---|---|
SECRET_KEY |
change-me-in-production |
Flask session secret — generate with python3 -c "import secrets; print(secrets.token_hex(32))" |
ADMIN_USER |
admin |
Admin login username |
ADMIN_PASS |
admin |
Admin login password — first login with this value forces a password change stored as a hash in data/auth.json |
GUNICORN_WORKERS |
2 |
Number of gunicorn worker processes |
GUNICORN_PORT |
8899 |
Port the app listens on |
Access at /admin/login. The dashboard provides visual editors for every section of the site.
Page Layout — Drag-and-drop section reordering, visibility toggles, label and subtitle editing for all sections.
Navigation — Add, remove, and reorder nav links with drag handles.
Hero — Edit headline, subheadline, and CTA button text.
About — Edit title, body text, and the four principle cards.
Stats — Edit the stat values and labels in the counters grid.
Products (Garage Logbook & Warehouse Manager) — Each product has editors for name, version, tagline, description, logo upload, featured image upload, draggable feature list, repository links (GitHub / Docker Hub) with toggles, and screenshot gallery uploads.
Install Sections — Per-product tabbed install instructions with tab visibility/label toggles and full step editors (title, description, command) for Docker Compose, YOLO Mode, and Manual install methods.
Metrics — Edit the metrics dashboard title and individual metric cards (label, value, change, direction).
Social / Open Graph — Edit the title, description, URL, and image used for social sharing link previews.
Footer — Edit tagline and toggle/configure GitHub, Bluesky, and Email links.
Raw JSON Editor — Full access to content.json for advanced edits.
content.json stores all site content and is excluded from deploy archives. Code updates never overwrite your content. The load_content() function in app.py includes a migration layer that auto-backfills any missing fields with sensible defaults, so new features never cause 500 errors on existing installs.
| Route | Description |
|---|---|
/api/content |
Full site content as JSON |
/api/content/<section> |
Single section (e.g., /api/content/product) |
Built with Flask, Jinja2, vanilla JS, and a lot of conversations with Claude. No frontend framework, no build step, no node_modules. Just HTML, CSS, and vibes.
Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).
Because this is a web application, the AGPL's network-use clause applies: if you run a modified version of viibeware Web on a server that users interact with over a network, you must make your modified source available to those users. See the LICENSE file for the full terms.
© 2026 viibeware Corp.