A desktop template editor built with Python, pywebview, and a local HTML/CSS/JS UI. It stores templates as individual JSON files, opens as a standalone GUI window, and can export filled reports to PDF.
python -m pip install -r requirements.txtpython app.pyOr on Windows:
start-template-workspace.bat
Enable verbose desktop logging and pywebview debug output if needed:
python app.py --verboseBuild a local package for the current platform with:
python scripts/package_release.py build-current --version snapshot --output release-artifacts --cleanWrite checksums for local artifacts with:
python scripts/package_release.py write-checksums --version snapshot --output release-artifactsTypical local output on Windows looks like:
release-artifacts\TemplateWorkspace_snapshot_Windows_x86_64.zip
release-artifacts\TemplateWorkspace_snapshot_checksums.txt
Official releases are tag-driven:
git tag v1.0.0
git push origin v1.0.0The GitHub Actions workflow then builds Windows, Linux, and macOS artifacts on native runners, generates checksums, and publishes them directly to the GitHub Release for that tag.
Manual workflow_dispatch runs are also supported for snapshot testing without publishing a GitHub Release.
PyInstaller remains the actual app builder, and the checked-in spec files stay the packaging source of truth:
TemplateWorkspace.spec: Windows/LinuxonedirpackagingTemplateWorkspace.macos.spec: macOS.apppackaging
The shared packaging helper used by both local packaging and CI is:
python scripts/package_release.py build-current --version <version> --output release-artifacts --cleanapp.py: desktop entrypoint, template persistence, JS bridge, and PDF exportweb/: frontend loaded inside the desktop windowweb/Report-Template-builder.html: app markupweb/Report-Template-builder.css: app stylesweb/Report-Template-builder.js: app logic and desktop bridge callsreport-templates/: saved template JSON filesrequirements.txt: runtime and build dependenciesTemplateWorkspace.spec: Windows/Linux PyInstaller packaging definitionTemplateWorkspace.macos.spec: macOS PyInstaller app-bundle definitionscripts/package_release.py: cross-platform packaging helper used by local packaging and CI.github/workflows/release.yml: GitHub Actions release workflow
- Build templates with editable sections, fields, placeholders, select options, and date defaults
- Reorder sections and fields with drag and drop
- Duplicate templates from the sidebar
- Inline-edit field labels, field types, placeholders, select options, and date defaults
- Fill templates and see a live preview
- Copy the rendered report as Markdown or export it to PDF
- Sort templates by recent,
A-Z, orZ-A - Autosave template changes through the Python desktop bridge and browser cache
- Launch without a local web server or browser tab
Ctrl/Cmd + S: save the current templateCtrl/Cmd + Shift + D: duplicate the current templateCtrl/Cmd + 1: switch to Template BuilderCtrl/Cmd + 2: switch to Fill & Preview
Templates are stored as individual .json files in report-templates/.
The desktop app keeps this storage model unchanged:
- one template per file
- filenames generated from the current template name on save
- duplicate IDs skipped with warnings
- atomic writes when saving
Example manual template:
{
"id": "incident-report",
"name": "Incident Report",
"narrative": "Title: {{Overview.Title}}",
"sections": [
{
"name": "Overview",
"open": true,
"fields": [
{
"label": "Title",
"type": "text",
"placeholder": ""
}
]
}
]
}If id is missing, the desktop app will generate one from the filename on load.
- Use
Reload Templatesafter manually adding or editing template files. - The packaged desktop app reads/writes
report-templates/next to the executable. - Bundled starter templates are copied into the executable-adjacent
report-templates/folder on first launch if needed. - Windows stays
onedirbecause startup is faster than a self-extractingonefileexecutable.

