Desktop Django Starter¶
Minimal documentation for desktop-django-starter, a teachable Django-plus-Electron reference with a runnable development slice, a staged packaged-backend slice, a sign/notarization-aware Electron GitHub packaging slice, a minimal Electron connected updater path, and experimental Tauri and Positron shells for local comparison work. Electron remains the baseline release-oriented shell, while Tauri now has an experimental GitHub-hosted updater-artifact lane.
The current implementation includes a local Django app, an Electron shell that supervises it over localhost, a /health/ readiness check, a tiny CRUD demo, a background task visualization demo with animated indicators and live polling, a packaged-like staging flow with a bundled Python runtime plus collected static assets, and on-demand GitHub Actions workflows that build desktop artifacts for macOS, Windows, and Linux. macOS signing/notarization scaffolding, optional Windows signing inputs, Electron updater metadata, and optional draft GitHub Release publication are now documented and wired into packaging; Tauri now also has an experimental updater path with signed updater payloads when configured, while Positron remains a manual-only local replacement path.
Contents
- Desktop Django Starter Specification
- 1. Project Summary
- 2. Goal
- 3. Target Audience
- 4. Why This Exists Instead of “Just Combine Django and Electron Yourself”
- 5. Why This App Runs Locally Instead of as a Normal Hosted Web App
- 6. Product Shape for v1
- 7. Explicit Non-Goals
- 8. Minimum Feature Set for v1
- 9. Background Task Decision
- 10. Expected Architecture
- 11. Packaging Expectations
- 12. What Must Work on Windows
- 13. Signing, Notarization, and Updates
- 14. Continuous Integration Expectations
- 15. Extension Points for Existing Django Apps
- 16. Patterns We May Borrow From
djdesk - 17. What We Are Explicitly Not Copying From
djdesk - 18. What Should Be Documented Now vs Implemented Later
- 19. Acceptance Criteria
- 20. Guiding Principle
- Architecture Notes
- Decisions
- D-001: This repo is specification-first
- D-002: The starter is attendee-facing and minimal
- D-003:
djdeskis reference material, not the baseline - D-004: The example app stays generic
- D-005: Background tasks are deferred
- D-006: Windows is a required proof point
- D-007: Manual updates are acceptable for v1
- D-008: Coding agents are a first-class audience
- D-009: The update story must include air-gapped environments
- D-010: GitHub Actions is the baseline CI
- D-011: Tasks demo uses the original-author task backport with one database-backed worker
- D-012: Per-session shell-to-Django auth token for Electron
- D-013: Bootstrap cookie auth for Tauri and Positron
- Release and Update Guide
- Packaging Workflow
- Tauri Local Bundle Scope
- Tauri GitHub Workflow Scope
- Positron Local Bundle Scope
- macOS Signing and Notarization Inputs
- Windows Signing Inputs
- GitHub Actions Signed Binary Release Setup
- Checksum Files and Minimal Release Promotion
- Connected Release and Update Story
- Air-Gapped and Manual Installs
- What Survives Reinstall or Update
- Production Gaps
- Backlog
- Done
- Agent Use
- Electron Shell
- Tauri Shell
- Positron Shell
- Design Guide
- Tasks Demo Design
Local Development¶
just installinstalls the development environment withuvjust electron-installinstalls the Electron dependenciesjust devstarts Electron, which launches Django on a random localhost portjust tauri-installinstalls the Tauri shell dependenciesjust tauri-testcompile-checks the Tauri shelljust tauri-startstarts the Tauri shell, which launches Django on a random localhost portjust tauri-packaged-startlaunches the packaged-like Tauri path against.stage/backendjust tauri-buildbuilds a local Tauri host bundle, defaulting todmgon macOS,nsison Windows, andappimageon Linuxjust positron-installinstalls the Positron shell environmentjust positron-checkruns Django checks from the Positron shell environmentjust positron-startstarts the Positron shell, which runs Django and the optional task worker in-processjust positron-smokestarts the Positron shell and exits after the first page loadjust positron-package-dmgpackages a local macOS Positron DMG with Briefcase ad-hoc signingjust backend-devruns Django directly on127.0.0.1:8000just packaged-stagebuilds the staged packaged backend under.stage/backendjust packaged-startlaunches the packaged-like Electron path against the staged backend and bundled runtimejust packaged-smokeruns a packaged-like smoke launch and exits automatically after loadjust package-distbuilds a local packaged desktop artifact for the current host targetjust package-dist-dirbuilds an unpacked local desktop app for the current host targetjust github-packagetriggers the cross-platform GitHub Actions packaging workflow for the current branchjust github-package-download <run-id>downloads one packaging workflow run intodist/github-actions/<run-id>/just github-package-latest-runprints the latest successful packaging workflow run id for the current branchjust github-package-latest-pathprints the local path for the lastgithub-package-download-latestdownloadjust github-package-download-latestdownloads the latest successful packaging workflow run for the current branch and records it underdist/github-actions/latest-run.txt, with a best-effortdist/github-actions/latestsymlink when the platform allows itjust github-package-tauritriggers the Tauri GitHub Actions packaging workflow for the current branchjust github-package-tauri-download <run-id>downloads one Tauri packaging workflow run intodist/github-actions/tauri/<run-id>/just github-package-tauri-latest-runprints the latest successful Tauri packaging workflow run id for the current branchjust github-package-tauri-latest-pathprints the local path for the lastgithub-package-tauri-download-latestdownloadjust github-package-tauri-download-latestdownloads the latest successful Tauri packaging workflow run for the current branch and records it underdist/github-actions/tauri/latest-run.txt, with a best-effortdist/github-actions/tauri/latestsymlink when the platform allows itjust docsbuilds the documentation and opens it locallyjust docs-servestarts a live-reloading docs serverjust testruns the backend and docs test suitejust buildbuilds the Python package metadata scaffold
Staged Runtime Contract¶
The packaged-like staging flow now writes a concrete backend payload under .stage/backend/:
manage.pyremains at backend rootsrc/remains in normal source layoutpython/contains the bundled runtime and installed app dependenciesstaticfiles/contains collected static assets for packaged settingsruntime-manifest.jsonrecords the staged interpreter path and launcher metadata
Electron and Tauri packaged mode use that manifest to resolve the interpreter from the staged backend instead of falling back to the repo’s uv environment.
The GitHub packaging helpers use the GitHub CLI locally, require an authenticated gh session, and accept an optional first argument to target a different branch when the current checkout is not the branch you want to build or query. Electron downloads live under dist/github-actions/<run-id>/, while Tauri downloads live under dist/github-actions/tauri/<run-id>/. Both workflows currently build macOS arm64 plus Windows x64 and Linux x64 artifacts.
See release for the signing secrets, installer/update guidance, and the explicit boundary that Tauri’s hosted lane is still artifact-only and not release parity.