A local full-stack web application for organizing user-provided OSINT notes into clean analyst-style dossier PDFs. It does not scrape, enrich, look up accounts, or collect external intelligence. All data is entered manually by the user.
- FastAPI backend with JSON APIs
- SQLite storage through SQLAlchemy
- Plain HTML, Tailwind CSS, and vanilla JavaScript frontend
- Dynamic dossier templates from JSON files
- Person, company, Telegram, social profile, crypto wallet, phone, email/username, and custom templates
- Evidence upload for images and PDFs
- Dossier-level target photo upload with file picker, drag and drop, and clipboard paste
- Structured relatives/associates mini-profiles inside person dossiers
- Browser preview using the report layout
- PDF export with WeasyPrint
- Flexible custom sections per dossier
- Runtime localization for English, Ukrainian, and Russian
- Portable JSON dossier export/import for offline collaboration
Create and activate a virtual environment, then install dependencies:
python -m venv venv
source venv/bin/activate
pip install -r requirements.txtRun the app:
uvicorn app.main:app --reloadOpen:
http://127.0.0.1:8000
SQLite data is stored in dossiers.db. Uploaded files are stored in uploads/. Generated PDFs are written to generated_pdfs/.
- Open the dashboard.
- Choose
Create dossier. - Select a template.
- Fill the structured fields.
- Add custom sections if needed.
- Add a target photo if needed.
- Save the dossier.
- Add evidence items from the editor sidebar.
- Use
Previewto inspect the report. - Use
Export PDFto download the PDF. - Use
Export JSONto share a complete portable dossier with another investigator.
Use JSON on the dashboard or Export JSON in the editor to download the
current dossier as a pretty-formatted JSON file. The export includes the dossier
data, custom sections, evidence metadata, target photo, and uploaded evidence
files when those files are available locally.
Another investigator can use Import JSON on the dashboard to recreate the
dossier locally and continue editing. Imported dossiers behave like locally
created dossiers and can be exported again for another handoff.
Evidence items support:
- Title
- Source URL
- Description
- Date found
- Confidence level
- Tags
- Optional image or PDF attachment
Uploads are limited to images and PDFs up to 8 MB. Filenames are replaced with safe generated names before storage.
Create a new JSON file in app/dossier_templates/:
{
"id": "example",
"name": "Example Dossier",
"description": "A short description.",
"fields": [
{
"name": "subject",
"label": "Subject",
"type": "text",
"required": true
},
{
"name": "summary",
"label": "Summary",
"type": "textarea",
"required": false
}
],
"sections": ["Summary", "Evidence", "Analyst Notes"]
}Supported field types:
texttextareanumberdatelisttableurlemailphoneselectmarkdown
Restart the app after adding or changing templates. Template definitions are cached for speed.
GET /api/templatesGET /api/templates/{template_id}GET /api/dossiersPOST /api/dossiersGET /api/dossiers/{dossier_id}PUT /api/dossiers/{dossier_id}DELETE /api/dossiers/{dossier_id}GET /api/dossiers/{dossier_id}/exportPOST /api/dossiers/importPOST /api/dossiers/{dossier_id}/evidenceDELETE /api/evidence/{evidence_id}GET /api/dossiers/{dossier_id}/previewGET /api/dossiers/{dossier_id}/pdf
This application is for organizing data you already have permission to process. Verify sources before including them in a dossier.
