{% extends "base.html" %} {% import "macros.html" as m %} {% block title %}Settings{% endblock %} {% macro status(done, yes='done', no='pending') %}{{ yes if done else no }}{% endmacro %} {% macro step_errors(step) %}{% set errs = form_errors.get(step, {}) %}{% if errs %}
A few steps are still open below. Skip for now
{% endif %} {# ================================================================= General #} {{ group_start('general') }}Describe a change, such as a field, a dashboard, a new look or a routine, and your own AI agent builds it in your data folder. Every change is one commit you can undo.
{{ you.name }}
{% else %}Your name signs the drafts; mail from your addresses counts as outbound.
{% endif %} {{ step_errors('you') }}Fills a record's empty fields and answers questions about your CRM, using an AI command-line tool you already have.
{% if not enrich_status.available %}Unavailable: {{ enrich_status.reason }}
Started by launchd or systemd (hermitcrm schedule install --serve), Hermit CRM has a bare PATH: put the CLI in /usr/local/bin, /opt/homebrew/bin or ~/.local/bin, or give its full path as the command below.
In use: {{ theme_file.path }}. It changes colours and fonts on top of the default. Delete the file to go back to the default look.
Not in use. To change colours or fonts, ask your AI tool to write {{ theme_file.path }}, for example "make my Hermit CRM blue". It is one block like this; Help > Settings lists what you can change.
{{ theme_example }}
{% endif %}
Hermit CRM is free and open source, and stays that way. If it earns its place in your week, you can support its development with a tip on Ko-fi.
Opens {{ support_url | replace('https://', '') }} in your browser. Nothing in the app depends on it, and Hermit CRM sends nothing to Ko-fi.
| Version | Hermit CRM v{{ about.version }}{% if update_notice and update_notice.available %} — v{{ update_notice.available }} available: {{ update_notice.hint }}{% elif about.update_note %} ({{ about.update_note }}){% endif %} Changelog |
|---|---|
| Data folder | {{ about.data_dir }} |
| Data format | {% if about.data_format is none %}unknown{% else %}{{ about.data_format }}{% if about.data_format != about.latest_format %} (this Hermit CRM writes {{ about.latest_format }}; run hermitcrm migrate){% endif %}{% endif %} |
| Help | All help topics, or hermitcrm help |
BCC {{ bcc_form.address }} when you email a prospect, or forward a thread to it, and the mail is logged on the right company.
Put a tracking address in BCC when you email a prospect, and the mail is logged on the right company. With Gmail, you+crm@gmail.com reaches your own inbox, so no second account is needed.
Last import {{ last_run.at | replace('T', ' ') }} failed: {{ last_run.error }}
{% endif %} {% else %} {% endif %} {% if inbox_alert and last_run and last_run.ok %}{{ inbox_alert }}
{% endif %}Keeps these copies out of your inbox. In Gmail: Settings → Filters → Create new filter.
{{ gmail_filter }}
{% endif %}
{% if not state.calendar %}Optional. {% endif %}Logs past meetings with people at your companies.
Last meeting import {{ calendar_last_run.at | replace('T', ' ') }} failed: {{ calendar_last_run.error }}
{% endif %} {% else %} {% endif %}What you sell, to whom, and how you write (MESSAGING.md), one part per approach.
{%- if playbook_status.problem %} {{ playbook_status.problem }}.
{%- elif playbook_status.ready %} Ready for the outreach bot: {{ playbook_status.ready | join(', ') }}.
{%- else %} No approach is ready for the outreach bot yet.{% endif %}
{%- set waiting = playbook_status.approaches | reject('in', playbook_status.ready) | list %}
{%- if waiting and playbook_status.ready %} Not ready yet: {{ waiting | join(', ') }}.{% endif %}
Fields of your own, on top of the ones Hermit CRM has. Their values live in your records' front matter; fields.toml describes them.
| key | label | type | on | shown in |
|---|---|---|---|---|
{{ f.key }} | {{ f.label }} | {{ f.type }} | {{ f.applies_to }} | {{ f.show_in | join(', ') }} |
Outreach drafts can use any field of your own as {{ '{' }}key{{ '}' }}. These two also fill the sentences about team size; with neither set, those sentences leave a line for you to fill in.
Your own labels for tasks and next steps, used as filters. Renaming one renames it on every task; deleting one leaves it on its tasks, in grey.
{{ step_errors('task-types') }}The steps a deal goes through, in order: the Pipeline columns, the filters and the funnel follow this list. Each stage has a role that tells Hermit what it means. open is a column on the board (the first one is where new companies start and where a requalified one returns). won and lost end a deal (lost needs a reason). closed is any other end, such as disqualified. parked is out of the pipeline for now, with a date to come back. Renaming a stage renames it on every company and in its history; deleting one asks where its companies go.
{{ step_errors('stages') }}One per line, in order. The first is what a detected reply counts as; the last is what silence past the message window counts as.
{{ step_errors('outcomes') }}{%- if lb.level == 'ok' and lb.age_minutes is not none -%} Last backup {{ 'just now' if lb.age_minutes < 1 else lb.age_minutes ~ ' min ago' }} ({{ lb.size }}). {%- elif not lb.last_ok -%} No backup yet. {%- else -%} {{ lb.summary }} {%- endif -%} {% if lb.last_ok and not schedule.backup_installed %} It does not repeat on its own yet.{% endif %}
{% if schedule.backup_elsewhere %}This computer's backup job is set up for another folder, {{ schedule.backup_elsewhere }}; there is one per computer. To back up this folder instead, run hermitcrm --data {{ about.data_dir }} schedule install; that folder is then no longer backed up.
In {{ lb.dest }}, outside your CRM folder, so deleting the folder does not delete the backup. To keep it somewhere else, such as another disk or a synced folder, set backup_dir in config.toml.
{{ line }}Pushed to {{ remote_url }} after every change.
The backup above lives on the same disk as your data. For a copy that survives a lost laptop, push the folder to a git remote after every change.
{% endif %} {% if remote_warning %}{{ remote_warning }}
{% else %}The repository must be PRIVATE on GitHub, GitLab or Bitbucket: it holds your contacts and mail.
{% endif %}These are set up from a terminal. This tab shows what is running and the commands to copy.
A daily job runs hermitcrm sync --apply: the BCC import, then the calendar import.
{{ line }}Daily at 07:00; --at HH:MM changes the time, and without --serve the web app is left to you.
{{ schedule.install_command }}
Hermit CRM has no password. Anyone who can reach that port can read and write your CRM, so use it on a network you trust, or a private one (Tailscale, WireGuard) rather than public Wi-Fi.
{% endset %} {% if access.on_network %}The app answers on your network: open {{ access.lan_url }} on a phone on the same Wi-Fi.
The app is bound to {{ access.host }}, which only this machine can reach.
{{ access.serve_command }}
Then open {{ access.lan_url }} on the phone. To make it permanent, set host = "0.0.0.0" in config.toml.
Lets Claude Desktop, ChatGPT desktop or Cursor on this computer read and write this CRM: your pipeline, the replies you owe, a brief before a meeting, and logging the call afterwards. It can also make Hermit yours (fields, dashboards, routines, the look), each change one commit you can undo.
Your AI app starts it for you: paste this into its MCP config. It talks over stdin and stdout, so the app must run on this computer.
{{ access.mcp_config }}
The command on its own: {{ access.mcp_command }}
hermitcrm --data {{ about.data_dir }} doctor
Add --online to try the IMAP login as well.