This AI agent is designed to serve as a fully private, locally running personal assistant that helps users manage and understand their digital workspace without relying on external services. Its core aim is to provide a free, secure alternative to cloud-based tools by enabling intelligent operations on local documents (such as searching for information, summarizing files or entire folders, classifying and organizing content, and ranking documents by relevance) while also augmenting its capabilities with internet-based research. By combining local data access with AI-driven reasoning, it allows users to efficiently navigate and act on their information while keeping full control over their data.
Domo is your personal assistant on your computerStart the app with:
./run_app.shRun the job workflow directly with:
.venv/bin/python -m tools.job.mainProcess a single local job folder with:
.venv/bin/python -m tools.job.main data/inputs/jobs/my-jobNotes:
- Open the local URL shown by Streamlit, typically
http://localhost:8051. - The Streamlit assistant now uses a session-scoped chat UI with three panes:
- chat for clarification and confirmation
- a context panel showing retained parameter values, their source, and their status
- an activity panel showing agent decisions and workflow progress, with raw workflow output available per run
- Domo always asks for confirmation in chat before executing a workflow.
- This repo must be run with the local
.venv, not a global Streamlit install. ./run_app.shuses.venv/bin/streamlitexplicitly, which avoidsModuleNotFoundErrorfrom Anaconda/global Python.- If you prefer the raw command, use
.venv/bin/streamlit run app/streamlit_app.py --server.port 8051. - Use the
streamlitCLI to run the app, notpython app/streamlit_app.py. - Start Ollama on
http://localhost:11434before using the assistant or the job workflow. python -m tools.job.mainwith no argument runs the default ATS search usingconfig.yaml.python -m tools.job.main <folder>accepts a folder containingjob_description_raw.txt,cleaned_job_description.txt,job_description.txt,job description.txt,job_description.pdf, orjob description.pdf.- You can also pass a company-name-style hint like
checkr; the workflow will searchdata/inputs/jobs/and pick the closest dated matching folder. - Input folders now live under
data/inputs/.... The agent may read project files anddata/, but it may only create new files underdata/outputs/. - Any assistant-managed write under
data/outputs/is normalized underdata/outputs/YYYYMMDD_HHMMSS/, for exampledata/outputs/20260322_134649/. - The assistant policy now refuses to overwrite existing files and does not delete files.
- Generated artifacts are written under timestamped folders in the configured outputs folder, which defaults to
data/outputs/YYYYMMDD_HHMMSS/. - Main application settings now live in
config.yaml, including paths, debug mode, Ollama settings, and job-search parameters. - The assistant can also inspect project files, inspect
data/, and search the internet through thesearch_webworkflow. - In the assistant,
run_job_agentis the general job workflow: it runs online job search when nofolder_pathis provided, or processes a local job folder whenfolder_pathis provided. create_job_filesis the dedicated local-folder workflow for generating output files from an existing job folder, a company-name hint that resolves underdata/inputs/jobs/, or a stageddata/outputs/YYYYMMDD_HHMMSS/working folder created from pasted job text.- The assistant can also override
job_search.role,job_search.location,job_search.ignore_location, andjob_search.remote_onlyfor a single run based on your prompt. - The allowed per-prompt overrides are listed explicitly in
config.yamlunderprompt_overrides; currently onlyrun_job_agenthas overrideable fields, whilecreate_job_filesandmatch_cvare empty.
domo/
├── README.md
├── config.yaml
├── pyproject.toml
├── requirements.txt
├── run_app.sh
├── app/
│ └── streamlit_app.py
├── assistant/
│ ├── audit.py
│ ├── domo_agent.py
│ ├── policy.py
│ ├── registry.py
│ ├── router.py
│ ├── runtime.py
│ └── schemas.py
├── integrations/
│ └── ollama_client.py
├── img/
│ ├── domo_blue.webp
│ └── domo_yellow.webp
├── tools/
│ ├── job/
│ │ ├── __init__.py
│ │ ├── clean_job_description.py
│ │ ├── create_job_files.py
│ │ ├── discover_jobs.py
│ │ ├── export_job_pdf.py
│ │ ├── filesystem.py
│ │ ├── generate_application_materials.py
│ │ ├── main.py
│ │ ├── models.py
│ │ ├── prompts.py
│ │ └── run_job_agent.py
└── data/
├── inputs/
│ ├── cvs/
│ ├── documents/
│ └── jobs/
└── outputs/
└── logs/
assistant/runtime.pynow manages a conversational session, retains structured context values, prepares confirmations, and records structured activity events before dispatching tools.assistant/policy.pyvalidates tool arguments, allows read-only inspection of project files anddata/, and restricts new file creation todata/outputs/without overwriting.tools/job/run_job_agent.pylaunches the online job-search workflow through the project.venv.tools/job/create_job_files.pylaunches the local job-folder workflow through the same processor.tools/job/main.pysupports three modes:- no argument: search ATS sources using the parameters in
config.yaml - folder containing
job_description_raw.txt: clean the raw job ad, generate a PDF, and generate application materials - folder containing
cleaned_job_description.txt: skip cleaning and generate the remaining outputs from the cleaned text - folder containing
job_description.txtorjob description.txt: normalize the text in memory, stage the derived files under the run output folder, then continue through the normal flow - folder containing
job_description.pdforjob description.pdf: extract the PDF text in memory, stage the derived files under the run output folder, then continue through the normal flow
- no argument: search ATS sources using the parameters in
- Main configuration lives in
config.yaml, including:debug.enabledpathsollamajob_workflowprompt_overridesjob_search
- Job search parameters in
config.yamlinclude:rolelocationignore_locationremote_onlysourcescompaniesmax_jobsmax_results_per_sourcemax_company_attempts_per_source
- Batch search stages discovered job inputs directly under the configured outputs folder, which defaults to
data/outputs/. - Local folder mode can resolve a company-name hint such as
checkrto the closest dated matching folder under the jobs directory. - The assistant workflow
create_job_filesuses that local-folder mode directly and writes the generated files under the outputs directory. - The assistant can also use
search_webfor general internet lookup, andread_documents/summarize_documents/evaluate_documentsagainst project files ordata/. - Generated artifacts are written under timestamped folders in the configured outputs folder, which defaults to
data/outputs/. - Current generated files are:
job_description_raw.txtjob_metadata.jsoncleaned_job_description.txtjob_description.pdfinfo.txt
- CV matching writes
best_cv.txt,cv_match_analysis.json, andcv_match_summary.txtinto a new output folder underdata/outputs/. - The workflow can search and prepare documents, but it does not currently submit applications through portals or monitor application status.
This project is licensed under the MIT License.
