★ Project Briefing ★
「 WHEN YOUR TICKETS WON'T CHAMBER 」
"The help desk that slaps. Literally."
AI-powered ticket management for the firearms industry.
Branding Workflow Tech Plan App Mockup
Section 01
THE BRAND
Forward Assist isn't just a ticket app. It's a ticket app that knows what a forward assist actually is. Mil-spec aesthetic. Meme-lord energy. Professional where it counts, irreverent everywhere else.

Brand Identity

  • Name references AR-15/M16 forward assist button — "tap it when things won't go into battery"
  • Dark, tactical aesthetic — think armory meets SaaS dashboard
  • Stencil typography (Bebas Neue) for headers — feels stamped on a pelican case
  • Monospace (JetBrains Mono) for data — like reading a mil-spec data sheet
  • Humor is baked into the UI language, not just slapped on

Tone & Voice

  • Self-aware and irreverent — Gun Slaps "your wife's boyfriend" energy
  • Inside jokes the community gets: "send it", "LARP", "just as good", "two world wars"
  • Professional in customer-facing responses — the memes stay internal
  • Never punching down — humor is for the team, not at customers' expense
  • Think: if Garand Thumb built a SaaS product

Target Audience

  • Small-to-mid firearms manufacturers and parts makers
  • Mil-spec / defense contractors with small sales teams
  • Gun shop owners who are terminally online
  • Anyone in the industry who's tired of Zendesk looking like a dentist's office

Competitive Edge

  • No other ticket system speaks this language
  • AI that actually understands firearms context (parts, specs, compliance)
  • Branding that makes the team WANT to use the tool
  • Self-hosted option — these guys don't love cloud dependencies

Color Palette — "Armory After Dark"

OD Green + FDE + midnight. If Magpul made a dashboard.

Midnight
#0D0D0D
Cerakote Dark
#1E1E1E
OD Green
#4A5D23
OD Light
#6B8C3E
FDE
#C4A265
Coyote
#8B7355
Tracer Red
#C0392B
Stainless
#E8E8E8

UI Language — "Boring to Based"

Every button, label, and status is an opportunity.

Submit SEND IT
Approved CLEARED HOT
Rejected MISFIRE
Pending Review IN THE CHAMBER
Closed BRASS POLICED
Urgent DANGER CLOSE
New Ticket INCOMING
Assigned ON TARGET
Dashboard THE ARMORY
Settings FIELD STRIP
AI Draft SPOTTER CALL
Knowledge Base THE MANUAL

Tagline Candidates

"When your tickets won't chamber."
Primary — references the literal forward assist function
"The help desk that slaps."
Secondary — double meaning with Gun Slaps reference
"Customer service. Full send."
For marketing — "send it" is universal gun meme
"Smack that bolt home."
Aggressive variant — for stickers/merch
"Your AI spotter never misses."
AI-focused — for the tech-forward pitch
"Steal underpants → Forward Assist → Profit"
Internal only — Eric knows what's up
Section 02
THE WORKFLOW
Email comes in. AI drafts a response. Human approves. Response goes out. Brass policed. That's it. No LARP required.
📧
INCOMING
Customer emails sales@xyz.com (Google Workspace)

IMAP/webhook
🎯
TICKET CREATED
Auto-parsed: subject, body, sender, thread ID, attachments

immediate
🤖
SPOTTER CALL
AI reads ticket + knowledge base, drafts response

queued
IN THE CHAMBER
Draft queued for human review. Edit, approve, or reject.

approved
CLEARED HOT
Response sent via SMTP through Google Workspace

auto
🧹
BRASS POLICED
Ticket closed or awaiting reply. Thread tracked.

Detailed Flow

📧 Email Ingestion

  • Poll Google Workspace via IMAP IDLE or use Google Pub/Sub push notifications
  • Parse: sender, subject, body (HTML → plaintext), attachments, Message-ID, In-Reply-To
  • Thread detection: group by In-Reply-To / References header → same ticket
  • Dedup: ignore auto-replies, out-of-office, own outbound
  • Store raw email + parsed version

🤖 AI Draft (Spotter Call)

  • Trigger: new ticket or new reply on existing ticket
  • Context window: ticket history + knowledge base articles + customer profile
  • System prompt: product-specific (parts catalog, lead times, compliance, specs)
  • AI provider: configurable — Claude API, OpenAI API, or local LLM (Ollama)
  • Output: draft response + confidence score + suggested category/priority
  • Draft is NEVER auto-sent — always queued for approval

⏳ Approval Queue (The Chamber)

  • Side-by-side view: original email | AI draft
  • Inline editing: operator can modify the draft before approving
  • Actions: Cleared Hot (send as-is), Edit & Send, Misfire (reject + write manual reply), Reassign
  • Optional: auto-approve for low-risk categories (FAQ, order status) after trust is built
  • Audit trail: who approved, what was edited, when

📤 Outbound & Tracking

  • Send via Google Workspace SMTP (appears from sales@xyz.com)
  • Maintain thread: set In-Reply-To and References headers correctly
  • Track: open status, follow-up replies auto-attach to ticket
  • SLA tracking: time-to-first-response, time-to-resolution
  • Notifications: Slack/email alerts for DANGER CLOSE tickets

Edge Cases & Safety

Misfire Handling

  • Rejected AI drafts are logged for model improvement
  • If AI confidence is below threshold → skip draft, flag for manual response
  • ITAR/export control keywords → auto-flag, no AI draft, human only
  • Profanity/threats in inbound → alert team immediately

Thread Intelligence

  • Customer replies to sent response → ticket reopens automatically
  • AI sees full conversation history for context
  • Auto-merge: same customer, similar subject within 24h → same ticket
  • Customer profile builds over time: past orders, past issues, preferences
Section 03
TECHNICAL PLAN
Self-hosted on Ragnar. Docker-composed. Node.js backend because that's what we run. PostgreSQL because tickets deserve a real database. AI provider is pluggable.

Architecture

┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ │ Google Workspace│ │ Forward Assist │ │ AI Provider │ │ sales@xyz.com │──IMAP──│ │──API──│ │ │ │◄─SMTP──│ Node.js/Express│ │ Claude / OpenAI │ └─────────────────┘ │ + Bull queues │ │ / Ollama (local)│ │ │ └─────────────────┘ └────────┬─────────┘ │ ┌─────────────┼─────────────┐ │ │ │ ┌──────┴──────┐ ┌──────┴──────┐ ┌──────┴──────┐ │ PostgreSQL │ │ React │ │ Redis │ │ (tickets, │ │ Frontend │ │ (sessions, │ │ emails, │ │ (dashboard)│ │ queues) │ │ users) │ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ All containers on Ragnar (192.168.1.107) via Docker Compose Reverse proxy through existing Nginx Proxy Manager on HAOS

⚙️ Backend

  • Node.js + Express — REST API
  • Bull (Redis-backed) — job queues for email polling, AI drafting, sending
  • node-imap or imapflow — IMAP client for Google Workspace
  • nodemailer — SMTP outbound
  • mailparser — email parsing (HTML → text, attachments)
  • passport.js — local auth + optional Google OAuth
  • socket.io — real-time ticket updates in dashboard

🗄️ Database

  • PostgreSQL 16 — primary data store
  • Prisma ORM — schema management + migrations
  • Tables: users, tickets, messages, ai_drafts, approvals, knowledge_base, email_accounts
  • Full-text search on ticket subject + body (pg_trgm)
  • Redis — sessions, Bull queues, rate limiting, real-time pub/sub

🎨 Frontend

  • React + Vite — SPA dashboard
  • TailwindCSS — utility-first styling with custom "Armory" theme
  • React Router — client-side routing
  • TanStack Query — server state management
  • Socket.io client — live ticket updates
  • Dark mode only — this is the way

🤖 AI Layer

  • Pluggable provider interface — swap without code changes
  • Claude API (recommended) — best at nuanced, professional responses
  • OpenAI API — GPT-4o as fallback
  • Ollama (local) — for air-gapped / cost-conscious setups
  • Knowledge base: product catalog, FAQ, past responses fed as context
  • Confidence scoring: low confidence = skip auto-draft

🐳 Infrastructure

  • Docker Compose on Ragnar (Proxmox LXC or VM)
  • Containers: app, postgres, redis, (optional: ollama)
  • Reverse proxy: Nginx Proxy Manager on HAOS (192.168.1.140)
  • Domain: tickets.xyz.com or fa.xyz.com
  • SSL via Let's Encrypt through NPM
  • Backups: pg_dump cron → local + offsite
  • Git repo: git@git.jfamily.io:eric/forward-assist.git

👥 Multi-User & Roles

  • Admin — full access, manage users, configure AI, manage knowledge base
  • Operator — view tickets, approve/reject AI drafts, send replies
  • Viewer — read-only dashboard access (for managers/owners)
  • Ticket assignment — round-robin or manual
  • Activity log — who did what, when
  • Per-user notification preferences

Core Data Model

users tickets messages ├── id (uuid) ├── id (uuid) ├── id (uuid) ├── email ├── ticket_number (FA-001) ├── ticket_id → tickets ├── name ├── subject ├── direction (inbound/outbound) ├── role (admin/op/viewer) ├── status ├── from_email ├── password_hash ├── priority ├── body_text └── created_at ├── assigned_to → users ├── body_html ├── customer_email ├── message_id (email) ai_drafts ├── customer_name ├── in_reply_to ├── id (uuid) ├── created_at ├── attachments (jsonb) ├── ticket_id → tickets ├── updated_at └── created_at ├── message_id → messages ├── resolved_at ├── draft_text └── sla_due_at knowledge_base ├── confidence ├── id (uuid) ├── provider (claude/gpt) approvals ├── title ├── model ├── id (uuid) ├── content ├── status (pending/ ├── ai_draft_id → ai_drafts ├── category │ approved/rejected) ├── user_id → users ├── embedding (vector) ├── approved_by → users ├── action (approve/reject) └── updated_at ├── approved_at ├── edited_text └── created_at └── created_at email_accounts ├── id (uuid) ├── email_address ├── imap_host / smtp_host ├── credentials (encrypted) └── polling_interval

Build Phases

🔫 Phase 1 — "First Round Downrange"

  • Docker Compose setup (Node + Postgres + Redis)
  • Email ingestion: IMAP polling → ticket creation
  • Basic dashboard: ticket list, detail view, manual reply
  • User auth (local, 2-3 users)
  • Thread tracking (replies attach to existing tickets)
  • SMTP outbound through Google Workspace

Goal: Working ticket system. No AI yet. Prove the plumbing works.

🤖 Phase 2 — "Spotter Online"

  • AI integration: pluggable provider (Claude/OpenAI/Ollama)
  • Auto-draft on new tickets + new replies
  • Approval queue UI (side-by-side, edit, approve/reject)
  • Knowledge base CRUD + vector search for context
  • Confidence scoring + auto-skip for low confidence
  • Audit trail for all AI actions

Goal: AI drafts responses. Humans stay in the loop. Trust builds over time.

💅 Phase 3 — "Full Send"

  • Full branding pass — Armory theme, all the fun UI language
  • Real-time updates (Socket.io)
  • SLA tracking + dashboards + metrics
  • Notification system (Slack, email alerts)
  • Customer profiles + history
  • Auto-approve rules for trusted categories

Goal: Production-ready. Looks amazing. Your buddy actually wants to use it.

🚀 Phase 4 — "Sustained Fire" (Future)

  • Multi-inbox support (sales@, support@, returns@)
  • ITAR/compliance flagging
  • Canned responses library
  • Customer-facing portal ("check my ticket status")
  • Reporting: response times, AI accuracy, volume trends
  • Mobile-responsive / PWA

Goal: Scale it. Maybe other shops want this too. 👀

Section 04
APP MOCKUP
What the dashboard could look like. Dark mode only. Mil-spec meets modern SaaS. The kind of app that makes Zendesk look like it was designed by someone who's never touched a rifle.
Forward Assist — The Armory

FORWARD ASSIST

ticket command center
🎯 The Armory
In The Chamber 3
📋 All Tickets
📖 The Manual
👥 Operators
🔧 Field Strip
EJ
Eric J.
ADMIN

THE ARMORY

Incoming Today
12
In The Chamber
3
Cleared Hot Today
8
Danger Close
1
Ticket Subject Customer Status Priority Age
FA-0042 Need lead time on BCG batch order (500 units) Mike T. — Tier 1 Defense DANGER CLOSE Critical 4h
FA-0041 AI draft ready: Return policy for cerakote defect Sarah K. — Sportsman's Supply IN THE CHAMBER High 6h
FA-0040 AI draft ready: Barrel threading specs question Jim R. — Personal IN THE CHAMBER Medium 8h
FA-0039 Invoice request for PO #7734 Dave L. — Patriot Arms LLC IN THE CHAMBER Low 1d
FA-0038 Confirmed: Gas block alignment specs sent Chris M. — AR Performance CLEARED HOT Medium 1d
FA-0037 Wholesale pricing inquiry — dealer application Tom B. — Liberty Firearms INCOMING High 2h

Approval Queue — "The Chamber"

Side-by-side: what the customer said vs. what the AI wants to say. You're the final trigger pull.

Forward Assist — In The Chamber (3 pending)
FA-0041 Return policy for cerakote defect
IN THE CHAMBER

📧 Customer Email

Hi,

I received my order of 50 buffer tubes last week and about 8 of them have cerakote flaking near the threads. These are going into builds for a local PD contract so I need them right. Can I get replacements sent out ASAP? Happy to send photos.

Thanks,
Sarah K.
Sportsman's Supply

🤖 AI Draft (Spotter Call)

CLAUDE-3.5-SONNET • CONFIDENCE: 92%

Hi Sarah,

Sorry to hear about the cerakote issue on those buffer tubes — that's not the standard we hold ourselves to, especially on a LE contract build.

Go ahead and send photos to this email and we'll get 8 replacements shipped out priority. No need to return the defective ones — toss 'em in the parts bin or send them back at our expense, your call.

I'll flag this batch for QC review on our end. If you need anything else to keep that PD build on schedule, let me know.

— [Your Name]