BugNote is a small file-based issue tracker with a React/Vite frontend and a Python file-storage API. The heavier browser features now lean on mature packages: Uppy handles upload, paste, drag-drop, webcam photo capture, and webcam video recording; marker.js handles image annotation before upload.
Docker Compose pulls the published habib926653/bugnote image, starts BugNote, exposes port 9201, and keeps the current project's issues/, media/, and settings files available through /data.
The published port binds only to 127.0.0.1, so BugNote is not directly exposed on the server's public network interfaces. A local reverse proxy can safely provide HTTPS and authentication.
docker compose pull
docker compose up -dOpen http://127.0.0.1:9201. View logs or stop the app with:
docker compose logs -f
docker compose downRebuilding or removing the container does not delete the project data. To store data somewhere else or change the host port:
BUGNOTE_DATA_DIR=/path/to/bugnote-data BUGNOTE_PORT=8080 docker compose up -dFor example, BUGNOTE_PORT=9202 makes BugNote available to a reverse proxy at http://127.0.0.1:9202 without exposing port 9202 publicly.
The data directory must be writable and will contain issues/, media/, settings.json, and github_settings.json.
The three Docker-related files have separate roles:
compose.yamlis the only file users run. It pulls the published image and starts BugNote.Dockerfileis the image recipe used by maintainers and GitHub Actions. End users do not run it directly..github/workflows/docker-publish.ymlruns on GitHub and publishes images built from the Dockerfile. End users do not run it.
For an occasional local source build, use the Dockerfile directly:
docker build -t bugnote:local .
docker run -d --name bugnote-local -p 9201:9201 -v "$(pwd):/data" bugnote:localThe GitHub Actions workflow publishes multi-platform images to habib926653/bugnote after pushes to main, version tags such as v0.2.0, or a manual workflow run. Add a GitHub Actions repository secret named DOCKERHUB_TOKEN containing a Docker Hub personal access token.
To deploy a fixed version rather than latest:
BUGNOTE_VERSION=v0.2.0 docker compose up -d- Docker Engine with Docker Compose (recommended), or
- Node.js 20+ and Python 3.10–3.12 for a manual installation.
No database or third-party Python packages are required. Remote camera and microphone access require HTTPS; browsers permit them on localhost for development.
Install frontend dependencies once:
npm installFor day-to-day frontend development, run the Python API and Vite in two terminals:
python3 server.py
npm run devThen open:
http://127.0.0.1:5173
For a production-style local run, build the frontend and let Python serve the compiled app:
npm run build
python3 server.pyThen open:
http://127.0.0.1:9201
By default, the server listens on 0.0.0.0:9201. You can change that with environment variables:
HOST=127.0.0.1 PORT=8000 python3 server.py/ issues dashboard
/issues issues dashboard, normalized to /
/settings settings page
The server returns the same app shell for these routes so refreshes and direct links work.
- Create, edit, and delete issues.
- Track title, reporter, assignee, status, tags, description, created date, and updated date.
- Manage reporters, assignees, tags, tag colors, and statuses from Settings.
- Optionally sync saved issues to a GitHub repository.
- Attach images and videos through Uppy by upload, paste, drag-and-drop, webcam photo capture, or webcam video recording.
- Annotate image uploads with marker.js before saving them to the issue media folder.
- Filter issues from one search field.
- Show visible issue counts while filtering.
Plain text search matches issue number, title, description, reporter, assignee, status, tags, and dates.
Scoped filters can be mixed with plain text:
reporter:habib
assignee:husnain
tag:bug
status:open
is:fixed
created:2026-06-22
updated:jun
Examples:
status:open tag:bug
assignee:husnain upload error
reporter:habib created:2026
BugNote stores data as files in the project folder.
settings.json settings
github_settings.json GitHub repo, token, and assignee mapping
issues/issue-0001.json issue data
media/issue-0001/photo.png media for an issue
media/issue-0001/video.webm
Existing issue files are read on startup. Older settings that only have reporters are still accepted; assignees are initialized from that list for compatibility.
GitHub sync is configured from Settings. BugNote stores the token in github_settings.json, creates missing GitHub labels from BugNote tags, maps BugNote assignees to GitHub usernames, and keeps the GitHub issue number in the local issue JSON. fixed closes the GitHub issue as completed; not doing and closed but not fixed close it as not planned. Images and videos remain in media/; GitHub issue bodies link back to those files.
Upload and JSON payload limits can be changed with environment variables:
MAX_JSON_BYTES=524288 MAX_UPLOAD_BYTES=262144000 python3 server.pyThe default upload limit is 250 MB.
BugNote does not include built-in authentication. For a small internal deployment, put it behind a reverse proxy and add authentication there.
Simple options:
- Nginx Basic Auth for the whole site.
- Caddy
basicauth. - A private VPN or tunnel with access control.
- Route-based auth at a reverse proxy if only some paths should be protected.
Example Nginx shape:
location / {
auth_basic "BugNote";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://127.0.0.1:9201;
}Use HTTPS at the proxy when exposing BugNote beyond a trusted local network.
Back up these paths:
settings.json
issues/
media/
You can copy them directly, sync them with rsync, or use a tool such as rclone.
Example cron job:
*/10 * * * * cd /path/to/bugnote && rclone sync issues remote:bucket/issues && rclone sync media remote:bucket/media && rclone copy settings.json remote:bucket/index.html Vite app shell
src/ React frontend
package.json frontend dependencies and scripts
server.py Python HTTP server and API
issues/ issue JSON files
media/ uploaded issue media