EXPERIMENT // 09  // BL-009
● ACTIVE / STABLE
Contact Intelligence System // Self-Hosted // Docker

SAVE
STATE

Support tickets accumulate. Contacts multiply. The same problems return under different names, on different days, submitted by people who believe they are the first to discover them. They are not.

SaveState remembers everything, so you don't have to pretend to.

VIEW ON DOCKER HUB ↗ DOCKER HUB: DB ↗ GITHUB ↗ SCREENSHOTS ↗

Experiment 09 was authorized after a researcher spent forty-five minutes locating a contact record that was, in fact, in three separate spreadsheets simultaneously. None of them agreed on the phone number. The lab considered this professionally unacceptable. By the following Tuesday, a Docker image existed. By Thursday, it had a glassmorphic UI and three operational modes. The spreadsheets were archived. The lab does not miss them.

LAB-SERVER-09>$ // BL-009 // SAVESTATE // FIELD REPORT
Researcher Notes // Field Observations

Experiment 09 — designated SaveState — is a self-hosted web application for support teams, solo operators, and anyone whose job involves remembering things about people and problems. It tracks support tickets, maintains a searchable contact vault, monitors known issues against incoming tickets in real time, and provides a structured environment for the kind of institutional memory that usually lives inside one person's head until that person goes on holiday.

The system runs in Docker. Two compose services, two files to deploy. MySQL provides the persistence layer. PHP provides the application layer. The lab provides the aesthetic. The glassmorphic UI is non-negotiable and the lab is at peace with this. 14 visual themes are included, selectable from a custom swatch picker. The entire field structure — dropdowns, checkboxes, labels, placeholders — is driven by a single company.conf file mounted at runtime. No rebuild required to reconfigure for a different org.

A fuzzy search engine crawls the vault for partial matches on ticket number, notes, reason, and location simultaneously. A known issues module cross-references every new ticket against the established issue registry the moment it is submitted. A returning customer detector watches the ticket number field in real time — on a match, it auto-populates the form and pins a flag in the fuzzy panel before the researcher has finished typing. The system recognizes people. This is the point.

Tickets support image attachments — screenshots, error dialogs, photographic evidence. Files are stored to a persistent host volume and served back through an authenticated endpoint. Import and export pipelines handle bulk data for both tickets and known issues. The audit trail does not negotiate with operators who want entries deleted quietly. There is a log. There is always a log.

Chief Science Officer advisory: "SaveState was designed to function as a local network tool with no authentication overhead. It was subsequently equipped with a full password system for public-facing deployments, on the grounds that leaving a contact database open to the internet is, in the lab's assessment, a choice with consequences. The OOBE will ask. The answer persists. It does not ask again."
Designation SaveState
Experiment No. BL-009
Status ACTIVE / STABLE
Type Web App / CRM
Delivery Docker
Backend PHP 8.1+ / MySQL 8.0+
Port 5473 (configurable)
Auth Modes Local / Public
Op. Modes Lab · Business · Arcade
Themes 14 (configurable)
Config company.conf
Hazard Rating LOW
Disposition METICULOUS
Observation Log
BL-009-1A First ticket logged. Data persisted. MySQL confirmed. Researcher satisfied.
BL-009-3C Arcade mode XP awarded on ticket close. Lab slightly concerned by engagement metrics.
BL-009-5F Vault fuzzy search operational. Five fields. Simultaneous. The vault does not forget.
BL-009-7B OOBE deployed. Mode persisted to system_settings. Does not prompt again. Good.
BL-009-9D Public auth enforced. Password hashing confirmed. Profile list suppressed on login.
BL-009-11A Known Issues cross-reference active on ticket submission. The system is watching.
BL-009-13C Returning customer detection deployed. Ticket number lookup auto-populates form. 🔁 flag pinned.
BL-009-15E Image attachments active. Ticket photos stored to persistent volume. 8 MB limit. Four formats.
BL-009-17G Arcade RPG system fully operational. Buffs, poison debuff, word combos, 8-bit audio. Lab concerned.
01

What It
Does

A complete operational profile. The lab does not believe in feature lists that omit the interesting parts.

📋
Ticket Engine
Log, track, resolve, and reopen support tickets. Per-user assignment, status tracking, timestamps, and a full history trail. Tickets do not vanish. They graduate to closed, or they remain open until addressed.
🗄️
Contact Vault
A searchable repository of all logged tickets — fuzzy search across ticket number, notes, reason, and location simultaneously. One query. No column hunting. Full export pipeline.
⚠️
Known Issues
Document recurring problems once. SaveState cross-references every incoming ticket against the registry in real time and flags matches as you type. Bulk CSV import supported. The researcher sees the pattern before they file a duplicate.
🔁
Returning Customer Detection
The ticket number field watches for prior contact. On a match, it auto-populates the form with previous data and pins a returning customer flag in the fuzzy panel — before the form is submitted. The system recognizes people.
🖼️
Image Attachments
Attach screenshots, error dialogs, and photographic evidence directly to tickets. Files are stored to a persistent host volume and served through an authenticated endpoint. JPEG, PNG, GIF, and WebP. 8 MB limit per file.
🔐
Auth System
Two modes, chosen once at first run. Local Network: click a profile, you're in — zero friction for trusted environments. Public Network: full password authentication, bcrypt hashing, no profile list exposed.
⚙️
company.conf
The entire field structure is driven by a single mounted config file — dropdowns, checkboxes, labels, placeholders, and default theme. Swap it out to deploy SaveState for any org without touching the image. No rebuild. No redeploy.
📊
Import & Export
JSON and CSV import pipelines for bulk ticket and known issue data. Export your vault at any time. The system does not hold data hostage. What goes in can come back out in a format you can read without a decoder ring.
🎨
14 Themes
From iHeart and Cyberpunk to Final Fantasy VI, Castlevania, and Metroid. Selected from a custom swatch picker. Preferences stored server-side per user — switching devices does not reset your configuration. The lab has opinions about theming.
02

Three
Operational Modes

The same data. Three different presentations. Switch at any time. Your preference persists.

🧪
Mode 01
Laboratory
The default. Clean, structured, methodical. Every field visible. Every action deliberate. Designed for operators who know what they are doing and would prefer the interface to stay out of the way while they do it. The lab uses this one.
Dense Layout All Fields Full Control
📋
Mode 02
Business
Professional. Streamlined. The interface that does not alarm visitors. Terminology adjusted for client-facing environments. The glassmorphic aesthetic remains — the lab's position on this has not changed — but the presentation is composed enough to survive a screen share.
Clean Layout Pro Vocabulary Client-Safe
🎮
Mode 03
Arcade
Experience points. Levels. A streak counter. A buff system with SVG icons and tooltips. A poison debuff with a drain mechanic and a cure. A Killer Instinct-style word combo system that fires when you type fast enough. 8-bit typing sounds via the Web Audio API. The lab acknowledges this is an unusual feature for support software. The lab also acknowledges it works. Ticket resolution rates during the testing period were statistically notable. The forms were filed.
XP System Buffs & Debuffs Word Combos 8-bit Audio Streak Counter
03

Deployment &
Configuration

Five steps. Two files. One command. The lab attempted to make this as frictionless as a database-backed web application can reasonably be.

01
Step One
Install Docker
SaveState runs entirely inside Docker. Docker Desktop for Windows or macOS, or Docker Engine for Linux. No PHP installation required. No MySQL configuration on the host. No Node.js. The container brings everything it needs. The lab has strong opinions about dependency sprawl.
02
Step Two
Download the Two Deploy Files
Use the download buttons in the section above to grab docker-compose.yml and company.conf. Put both files in the same folder on your machine. The compose file references two pre-built images: belmontlabs/savestate (nginx + PHP-FPM) and belmontlabs/savestate-db (MySQL 8, schema pre-loaded). Docker will pull them automatically — no build step, no source code.
03
Step Three
Run It — Test Data Included
Open a terminal in the folder containing both files and run:

docker compose up -d

That's it. Docker pulls both images, MySQL initializes from the pre-loaded schema, and SaveState is live at http://localhost:5473 in about ten seconds. The lab recommends patience. The Belmont Labs company.conf ships with test data flavoring out of the box — you can poke around immediately. Optionally, import belmont-known-issues.csv from Settings → Known Issues to see the Heads Up system in action.
04
Step Four
Complete First-Run Setup
The First-Run Setup screen appears automatically on first access. Choose your network mode — Local (no passwords) or Public (bcrypt auth). The choice is written to the database and will not be asked again. Create your first profile and begin.
05
Step Five
Edit company.conf for Your Org
Open company.conf in any text editor. Set your company name, field labels, dropdown options, checkboxes, and default theme. Save the file and restart the web container:

docker compose restart web

No rebuild. No redeploy. The config is mounted at runtime — the container picks up the changes immediately. To update SaveState itself: docker compose pull && docker compose up -d
?
Diagnostics
If Something Goes Wrong
Check container logs with docker compose logs -f savestate_web. Database issues will surface in docker compose logs -f savestate_db. MySQL takes a moment to initialize on first start — if the web container reports a database connection error immediately after launch, wait ten seconds and try again. The lab has documented this. The documentation is patient.
Configuration File
docker-compose.yml — set passwords before running
services: web: image: belmontlabs/savestate:latest container_name: savestate_web restart: unless-stopped ports: - "5473:8080" # Change left side to use a different host port volumes: - ./company.conf:/var/www/html/company.conf:ro # edit to match your org - ./uploads:/var/www/html/uploads:rw # ticket image attachments environment: - SS_DB_HOST=db - SS_DB_NAME=savestate - SS_DB_USER=savestate_user - SS_DB_PASS=changeme # ← set this depends_on: db: condition: service_healthy networks: - savestate_net db: image: belmontlabs/savestate-db:latest # schema pre-loaded container_name: savestate_db restart: unless-stopped environment: - MYSQL_ROOT_PASSWORD=changeme_root # ← set this - MYSQL_DATABASE=savestate - MYSQL_USER=savestate_user - MYSQL_PASSWORD=changeme # ← match SS_DB_PASS above volumes: - savestate_db_data:/var/lib/mysql # Persistent MySQL data — survives container restarts healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 10s retries: 10 networks: - savestate_net volumes: savestate_db_data: # Persistent MySQL data — survives container restarts networks: savestate_net: driver: bridge
Requirement
Docker Desktop (Windows/Mac) or Docker Engine (Linux). Nothing else on the host. PHP and MySQL run inside the container.
Architecture
linux/amd64 and linux/arm64 (Apple Silicon) supported via multi-platform image. The lab has tested both.
Data Persistence
MySQL data persists in the savestate_db_data Docker volume. Updating the image does not affect your data. The lab has opinions about data loss.
◈   First-Run Setup — Network Mode

On first access, SaveState presents a setup screen before any login is possible. The admin selects a network mode. This choice is written to the system_settings table in the database and is permanent for that installation. The setup screen does not appear again. A database reset is required to change it. The lab considers this a feature.

🏠 Local Network No Passwords

Designed for trusted environments — home labs, internal offices, private networks. Users log in by selecting their profile from a card list. No passwords. No barriers. Profile creation requires only a username. Appropriate for any deployment where the network boundary is the security layer.

🌐 Public Network Passwords Required

Designed for internet-facing or shared servers. No profile list is shown at login — users enter a username and password against a standard sign-in form. Profile creation requires a password of six or more characters. Passwords are bcrypt-hashed before storage. The lab recommends this mode for any deployment accessible outside a trusted network perimeter.

Live Instance // Belmont Labs Infrastructure
Dev Test Instance Available
A live deployment of SaveState is running on the Belmont Labs infrastructure. Poke at it. The lab is watching the logs.
Using the Dev Test? →
      BL-009 SAVESTATE: STATUS NOMINAL  ⋮  TICKET ENGINE: OPERATIONAL — ENTRIES LOGGED — AUDIT TRAIL ACTIVE  ⋮  RETURNING CUSTOMER DETECTION: ACTIVE — TICKET LOOKUP ON KEYSTROKE — FLAG PINNED  ⋮  IMAGE ATTACHMENTS: ONLINE — JPEG PNG GIF WEBP — 8MB LIMIT — VOLUME MOUNTED  ⋮  CONTACT VAULT: FUZZY SEARCH READY — FOUR FIELDS — SIMULTANEOUS QUERY  ⋮  KNOWN ISSUES MODULE: CSV IMPORT SUPPORTED — CROSS-REFERENCING IN REAL TIME  ⋮  COMPANY.CONF: MOUNTED — FIELDS CONFIGURABLE — NO REBUILD REQUIRED  ⋮  AUTH SYSTEM: NETWORK MODE PERSISTED — OOBE COMPLETE — WILL NOT ASK AGAIN  ⋮  THEMES: 14 AVAILABLE — SWATCH PICKER — PER-USER — SERVER-SIDE PERSISTENCE  ⋮  LAB MODE: ACTIVE — ARCADE MODE: BUFFS LOADED — COMBO SYSTEM: STANDING BY — BUSINESS MODE: PRESENTABLE  ⋮  ARCADE RPG: XP SYSTEM — BUFF SYSTEM — POISON DEBUFF — WORD COMBOS — 8-BIT AUDIO CONFIRMED  ⋮  MYSQL: NOMINAL — SCHEMA PRE-LOADED IN IMAGE — DATA VOLUME MOUNTED  ⋮  REMINDER: CHANGE YOUR PASSWORDS BEFORE RUNNING docker compose up  ⋮  THE LAB THANKS YOU FOR YOUR INTEREST IN MANAGED CONTACT INTELLIGENCE  ⋮  BL-009-17G: THE SYSTEM IS WATCHING. THIS IS FINE. THIS IS THE POINT.  ⋮