Skip to content

Production Readiness

Overview

SpeedPy intentionally ships demo and placeholder content as teaching examples: a Product CRUD app, demo API endpoints, a demo Celery task, placeholder pages, and a DEMO_MODE login shortcut. These are valuable while learning the framework but should be removed or replaced before going to production.

This guide explains what demo content exists, why it is there, and how to safely remove it from your fork.

What SpeedPy Ships as Demo Content

Category Artifact Purpose
Django app demoapp/ with Product CRUD at /demo/products/ Canonical example for building CRUD screens
API endpoint GET /api/v1/products/ Example read-only business resource API
API endpoint POST /api/v1/jobs/demo/ Example async job creation (202 + status URL)
Celery task run_demo_job Example long-running background task
Setting DEMO_MODE Shows hardcoded credentials on the login page
Deploy config appliku_demo.yml Pre-configured demo deployment
Template sections SpeedPy UI preview demo links, login credentials block Demo navigation and credentials
Scopes read:products OAuth2/PAT scope for demo Product API
Examples CLI/MCP product commands Integration starter code referencing demo endpoints

Tools for Stripping Demo Content

SpeedPy provides three complementary tools:

1. Human Checklist (PRODUCTION_READY.md)

A step-by-step checklist in the project root covering every removal action. Organized by component with separate guidance for fresh forks (no production data) and existing databases.

2. Demo Manifest (demo-content.json)

A machine-readable JSON file listing every demo artifact with:

  • Category (django_app, api_endpoint, celery_task, setting, template, etc.)
  • Paths to the relevant files
  • Settings entries to remove
  • Routes to delete
  • Removal action: safe_remove (always safe), review (decide case-by-case), or replace (provide your own content)
  • Verification terms for confirming removal

3. Agent Skill (/strip-demo)

An audit-first workflow for AI coding agents. It:

  1. Reads the manifest and scans for SPEEDPY_DEMO markers
  2. Cross-references with the current working tree
  3. Presents a removal plan organized by severity
  4. Waits for explicit confirmation before making any changes
  5. Executes approved removals and verifies the result

The skill ships inside the SpeedPy boilerplate (.claude/skills/strip-demo/) so fork owners inherit it automatically.

Searchable Markers

All demo artifacts are marked with SPEEDPY_DEMO comments in the source code. Quick audit:

rg SPEEDPY_DEMO

Every marker corresponds to an entry in demo-content.json. The manifest is the authoritative list — broad keyword searches should not drive deletion decisions.

Key Decisions for Fork Owners

AsyncJob: Keep or Remove?

The AsyncJob model and JobStatusView implement a reusable 202 Accepted + status URL polling pattern. The demo job (DemoJobCreateView, run_demo_job) is just an example entry point.

  • Keep AsyncJob if your app has background tasks that need progress tracking
  • Remove only the demo entry point (DemoJobCreateView, run_demo_job, /api/v1/jobs/demo/)
  • Remove everything only if you have no async job use case at all

Test Dependencies

Several shared tests use /api/v1/products/ as a convenient authenticated endpoint:

  • test_api_pagination.py — pagination behavior
  • test_api_throttle.py — rate limiting
  • test_api_request_id.py — request correlation IDs

Before removing the Product API, migrate these tests to use one of your own domain endpoints. The /strip-demo skill will flag these dependencies.

Placeholder Pages

The welcome and pricing pages are functional placeholders. Replace them with your own content rather than deleting them — the root URL (/) must resolve to something.

Database Considerations

  • Fresh fork (no production data): Delete migration files and drop tables freely.
  • Existing database: Write removal migrations or reset the database before deleting model code. Never delete a model file while its table still exists in a production database.

Step-by-Step Guide

For the detailed removal steps, see PRODUCTION_READY.md in the project root. The sections cover:

  1. Remove demoapp/ (Product CRUD)
  2. Remove Product API and scopes
  3. Remove demo job entry points (keep or remove AsyncJob infrastructure)
  4. Remove DEMO_MODE setting and template blocks
  5. Remove appliku_demo.yml
  6. Replace placeholder pages
  7. Clean up SpeedPy UI preview demo links
  8. Update CLI/MCP examples
  9. Update documentation references
  10. Verify with automated checks

Verification

After stripping demo content, verify your fork is clean:

# No remaining demo markers (exclude guidance files that legitimately reference the marker)
rg SPEEDPY_DEMO --glob '!PRODUCTION_READY.md' --glob '!demo-content.json' --glob '!AGENTS.md' --glob '!README.md' --glob '!.claude/skills/strip-demo/*'

# No remaining demo references
rg "demoapp" --type py --type html
rg "/api/v1/products/" --type py
rg "run_demo_job" --type py
rg "DEMO_MODE" --type py --type html

# Django checks pass
python manage.py check

# All tests pass
python manage.py test

# OpenAPI schema validates
python manage.py spectacular --file /tmp/speedpy-openapi.yaml --validate

See Also