Version: 1.5.2
Simple Python desktop app for tracking EMS attendance, responses, vitals, and weekly manual attendance exports.
- One-button time in/time out with automatic total calculation.
- Manual shift entry and editing, including previous days.
- Alarm-style shift time controls with bounded hour/minute fields and AM/PM buttons.
- Overnight shifts are split at the manual attendance boundary.
- Robbery/distress and vitals logs with direct type buttons.
- Persistent responder name field for log exports.
- Optional multiple image attachments for response and vitals logs.
- Attached images are copied into
attachments/so logs survive if the original file is deleted. - Ctrl+V in the log prompt attaches clipboard images, with a preview and remove button before saving.
- Individual logs support a two-step Discord flow:
Copy Log Detailsfor text, thenCopy Imagefor the first attached screenshot. config.cfgcan switch response/vitals entry between simple +/- counters and detailed log capture.- In simple mode, responses and vitals use compact side-by-side counters with direct number editing.
- History window for opening saved and recent weekly data.
- History window backup tools can export/import the current SQLite database and
config.cfg. - Older saved weeks show
VIEWING OLD LOGSand require confirmation before editing. - Export copies the weekly manual format to clipboard and saves a
.txtfile. - Verbose event logs are written asynchronously to
logs/. - Startup update checks can download and run the latest GitHub Release installer.
Create and use the local virtual environment:
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pipThe runner installs dependencies into .venv when needed. Pillow is used for faster clipboard image paste/export.
.\.venv\Scripts\python.exe famd_tool.pyFor quick testing on Windows, double-click run.bat or run:
.\run.batBuild a Windows distribution zip:
.\tools\build_release.ps1Or double-click/run:
.\build_release.batOutput:
dist/FAMDTool/FAMDTool.exedist/FAMDTool/config.cfgdist/FAMDTool/assets/FAMDTool.icorelease/FAMDTool-v1.5.2-windows.ziprelease/FAMDTool-v1.5.2-windows-setup.exe
The release uses a one-folder layout so config.cfg, famd_data.sqlite3, attachments/, exports/, and logs/ stay beside the executable. This is intentional for operational deployments where the config may need to be edited without rebuilding the app.
The setup installer is a per-user installer built with Inno Setup. It installs under %LOCALAPPDATA%\FAMDTool, preserves an existing config.cfg, and creates Start Menu shortcuts without requiring administrator rights.
famd_tool.pyis a compatibility launcher and public re-export layer.config.cfgstores user-editable runtime settings next to the main launcher.famdtool/config.pyloads paths, labels, option lists, and behavior flags fromconfig.cfg.famdtool/models.pystores shared dataclasses.famdtool/time_utils.pystores date/time parsing, formatting, and shift splitting.famdtool/attachments.pystores clipboard, image, and Discord-card helpers.famdtool/database.pystores SQLite persistence.famdtool/event_log.pystores async verbose event logging.famdtool/reports.pystores weekly totals and manual export generation.famdtool/tasks.pystores Tk-safe background task dispatch.famdtool/image_preview.pystores thumbnail loading for UI previews.famdtool/windowing.pystores popup placement helpers.famdtool/dialogs.pystores modal input dialogs and reusable time controls.famdtool/managers.pystores shift/log/history manager windows and log detail views.famdtool/main_window.pystores the main Tkinter app window and launcher.famdtool/app.pyre-exports UI classes for compatibility.assets/FAMDTool.icoandassets/FAMDTool.pngstore the app icon.tools/generate_icon.pyregenerates app icon assets.famd_tool.spec,packaging/FAMDTool.iss, andtools/build_release.ps1define Windows executable and installer packaging.
.\.venv\Scripts\python.exe -m unittest discover -s testsOptional Tk smoke tests are disabled by default. Run them manually with:
$env:FAMD_RUN_GUI_TESTS='1'
.\.venv\Scripts\python.exe -m unittest tests.test_ui_smoke -v- Persistent app data is stored in
famd_data.sqlite3. - Runtime settings are stored in
config.cfg. - The app repairs stale
config.cfgversion metadata on startup so preserved configs from older installs do not cause repeated update prompts. - Database/config backups exported from History are saved as
FAMD_Backup_YYYYMMDD_HHMMSS_microseconds.zipinexports/. - Copied/pasted log images are stored in
attachments/. - Exported attendance text files are saved in
exports/. - Verbose app event logs are saved in
logs/. - These are intentionally ignored by git because they are local user data.
Edit config.cfg before launching the app:
logging.verbose_event_logs: set tofalseto disable JSON event log files underlogs/.workflow.non_detailed_logs: set totruefor quick stat tracking and manual attendance export. Response/vitals controls become simple increment/decrement buttons, while detailed fields stay hidden.- Set
workflow.non_detailed_logstofalsefor department-workflow style detailed response/vitals capture with postal, type, responders, notes, and attachments. - Simple mode still writes normal blank log rows, so setting it back to
falselater makes those rows visible and editable. types.responseandtypes.vital: comma-separated button options for detailed log entry.paths.icon: icon file used by the app window.updates.enabled: enables/disables startup update checks.updates.latest_api_url: GitHub Releases API endpoint used for update metadata.updates.asset_pattern: installer asset name pattern. Keep this compatible with release assets, e.g.FAMDTool-v{version}-windows-setup.exe.
This app checks GitHub Releases for a newer version on startup. For update checks to work without bundling a private token, the repository or at least the release metadata/assets must be publicly readable. The current updater expects the latest release to include:
FAMDTool-vX.Y.Z-windows-setup.exeFAMDTool-vX.Y.Z-windows.zip
Release steps for future agents:
- Update version values in
config.cfg,famdtool/config.py,packaging/version_info.txt,tools/build_release.ps1, tests, and README. - Keep the installer asset name compatible with
updates.asset_pattern. - Run
.\tools\build_release.ps1. - Launch-test
dist\FAMDTool\FAMDTool.exe. - Commit, tag
vX.Y.Z, push, and create a GitHub Release with both the setup exe and portable zip.
Windows installer best practices used here:
- Per-user install under
%LOCALAPPDATA%to avoid admin rights. - Preserve
config.cfgon upgrades withonlyifdoesntexist. - Do not package user data files like
famd_data.sqlite3. - Keep app data folders stable beside the installed executable.
- Embed the app icon in both the exe and installer.
- Prefer signed installers for wider department deployment.
Linux and macOS release recommendations:
- Build on each target OS in CI; do not cross-build from Windows.
- Linux: ship an AppImage for portable use, and optionally
.deb/.rpmpackages for managed installs. - macOS: ship a signed and notarized
.dmgor.pkg; unsigned apps will be blocked or heavily warned by Gatekeeper. - Keep the updater platform-aware before enabling it outside Windows; each OS should download a native installer/package asset.
- Use GitHub Actions matrix builds once release volume grows.