{% 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 (a field, a dashboard, a new look, a routine) and your own AI agent builds it in your data folder, one undoable commit each.
{{ 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 }}
Under launchd or systemd (hermitcrm schedule install --serve) the PATH is bare: 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 }} sets colours and fonts. Delete the file to go back to the default look.
Not in use. Ask your AI tool to write {{ theme_file.path }}, for example "make my Hermit CRM blue"; Help > Settings lists what you can change.
{{ theme_example }}
{% endif %}
Hermit CRM is free and open source, and stays that way. A tip on Ko-fi supports its development.
Opens {{ support_url | replace('https://', '') }} in your browser; Hermit CRM sends nothing to Ko-fi.
| Version | Hermit CRM v{{ about.version }}{% if up.kind == 'restart' %} — v{{ up.version }} is installed but this server still runs v{{ up.running }}.{% if up.can %}{{ m.upgrade_form(up) }}{% else %} {{ up.why_not }}{% endif %}{% elif up.kind == 'available' %} — v{{ up.version }} available:{% if up.can %}{{ m.upgrade_form(up) }}{% else %} {{ up.command }}{% if up.why_not %} ({{ up.why_not }}){% endif %}{% endif %}{% 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.
{%- call m.hint('bcc-gmail-help', 'Which address to use with Gmail') %} With Gmail, you+crm@gmail.com reaches your own inbox, so no second account is needed.{% endcall %}
Last import {{ ui_datetime(last_run.at) }} 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 %}
Send approved outreach from the Outreach page, now or spaced over the working day, from a mailbox of its own. {%- call m.hint('send-help', 'What goes out') %} You still approve every message. Mail is plain text only: no links, no tracking pixel.{% endcall %}
{% for problem in send_problems %}Config: {{ problem }}
{% endfor %} {% if send_cap_note %}{{ send_cap_note }}
{% endif %} {% if send_form.enabled %} {% if send_status.missing %}Not ready: {{ send_status.missing }}
{% endif %} {% endif %}{% if not state.calendar %}Optional. {% endif %}Logs past meetings with people at your companies.
Last meeting import {{ ui_datetime(calendar_last_run.at) }} 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 built-in ones, described in fields.toml.
{%- call m.hint('fields-values-help', 'Where the values live') %} Their values live in your records' front matter.{% endcall %}
| key | label | type | on | shown in |
|---|---|---|---|---|
{{ f.key }} | {{ f.label }} | {{ f.type }} | {{ f.applies_to }} | {{ f.show_in | join(', ') }} |
Which fields fill the team-size sentences in outreach drafts; with neither set, those sentences leave a line for you to fill in.
{%- call m.hint('draft-fields-help', 'Using your own fields in drafts') %} Any field of your own can also be used in a draft as {{ '{' }}key{{ '}' }}.{% endcall %}
Your own labels for tasks and next steps, used as filters. {%- call m.hint('task-types-help', 'What renaming and deleting do') %} Renaming a type renames it on every task; deleting one leaves it on its tasks, in grey.{% endcall %}
{{ step_errors('task-types') }}The steps a deal goes through, in order: the Pipeline columns, the filters and the funnel follow this list. {%- call m.hint('stage-roles-help', 'What each role means') %} 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.{% endcall %}
{{ step_errors('stages') }}One per line, in order: a detected reply counts as the first, silence past the message window as the last.
{{ step_errors('outcomes') }} {% if outcomes_offer %} {% endif %}{%- 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; the other folder is then no longer backed up.
In {{ lb.dest }}, outside your CRM folder, so deleting the folder keeps the backup. For another disk or a synced folder, set backup_dir in config.toml.
{{ line }}Pushed to {{ remote_url }} after every change.
The backup above is on the same disk as your data; push to a git remote after every change for a copy that survives a lost laptop.
{% endif %} {% if remote_warning %}{{ remote_warning }}
{% else %}The repository must be PRIVATE on GitHub, GitLab or Bitbucket: it holds your contacts and mail.
{% endif %}Your companies, contacts, interactions, tasks and stage history as a zip of CSV files, for a spreadsheet or another CRM.
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. Use a network you trust or a private one (Tailscale, WireGuard), not 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. {%- call m.hint('mcp-help', 'What an AI app can do here') %} It can show your pipeline and the replies you owe, brief you before a meeting and log the call afterwards, and make Hermit yours (fields, dashboards, routines, the look), each change one commit you can undo.{% endcall %}
Paste this into your AI app's MCP config; it starts the server itself, 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.