Settings reference
Every Jotura desktop setting with a UI control, grouped as the settings screen groups them, with its effect, its default, and where it is stored on disk.
Settings open from the gear button at the top of the sidebar, or from the Open Settings command in the command palette (Cmd/Ctrl+Shift+P). Clicking the dimmed area outside the panel closes it too.
Escape also closes it, with one exception. The global Escape handler runs a strict cascade, and the command palette comes first. If the palette is open on top of Settings, the first Escape closes the palette and the second closes Settings.
There is no Save button. Every control writes through immediately, so the footer buttons labeled Close and Done do exactly the same thing, and a stray click outside loses nothing. The panel is a single scrollable column of section cards rather than a set of tabs.
How the screen is organized
| Section | What it covers |
|---|---|
| Appearance | Theme, fonts, and visual preferences. |
| Editor | How notes open and behave inside the editor. |
| Daily Notes | Calendar and task timing for the right sidebar. |
| Semantic search | Search by meaning alongside keyword search. The choice applies to the vault on every device, and devices that sync the vault share one index through an encrypted cache; embedding runs through OpenAI under your own key or on a local model, your choice. |
| Account & sync | End to end encrypted cloud sync. Notes are encrypted on this device before upload. |
| Advanced | Defaults, maintenance, and diagnostics you will not need often. |
| About | The app logo, the installed version number, and the tagline. |
Six sub groups start collapsed. Open one to reach the rows inside it.
| Sub group | Lives inside |
|---|---|
| Templates | Editor |
| Security & recovery | Account & sync |
| Files & folders | Advanced |
| Document conversion | Advanced |
| Diagnostics | Advanced |
| Command-line tool | Advanced |
Rows in this panel have three parts: a label on the left, a helper line under it, and a control on the right. The label and the button text often differ, so this page names both wherever they do.
Appearance
| Setting | Effect | Default |
|---|---|---|
| Theme | One of five built-in palettes: Jotura (the paper-and-ink palette from jotura.io), Graphite (neutral greys, steel-blue accent), Fjord (blue-grey, teal accent), Moss (green-grey, moss accent), and Contrast (pure white or black with 7:1 text for accessibility). Every theme has a light and a dark variant. |
Jotura |
| Mode | Match the operating system or pick a fixed variant. Options are System, Light, and Dark. |
System |
| Custom theme | Turns on a theme file stored in your vault. See below. | Off |
| Editor font family | The typeface used for the editor surface. The list is populated from the fonts installed on your machine, and the first option is literally (default monospace). |
ui-monospace, SF Mono, Menlo, Consolas, monospace |
| Editor font size | Text size in the editor, between 10 and 24 pixels. | 15 |
| Sidebar font size | Text size in the file tree and the search pane, between 10 and 20 pixels. | 14 |
| Safe graphics mode | Turns off GPU acceleration from the next launch. Try it if the window goes blank or Jotura closes on start. Setting JOTURA_SAFE_GRAPHICS=1 in the environment does the same, and the app turns it on by itself for one launch when the previous launch never rendered. |
Off |
| Low-resource mode | Auto, On, or Off. When on, background work such as indexing and conversion runs more gently. Auto turns it on for machines with 8 GB of memory or less, fewer than 4 cores, or a spinning disk. |
Auto |
Everything except Safe graphics mode applies live, with no restart. When Mode is set to System, the app watches the operating system’s light and dark preference and follows it as it changes.
Theme and Custom theme are vault settings: their rows read Applies to this vault on every device. and the values live in the vault’s Jotura/settings.json (see Settings stored in the vault). Mode, the font settings, Safe graphics mode, and Low-resource mode stay on the device.
Custom theme
Turning on Custom theme creates a Jotura folder at the root of your vault and writes Jotura/theme.json, seeded with the full palette of the theme you have selected. The file is an ordinary vault file: it opens in Jotura’s plain-text editor, the jotura CLI can edit it, and it syncs to your other devices. On another device, turn the switch on and the synced file is used as it is.
The file layers over the selected built-in theme. Any color you leave out falls through to the built-in, so a file that only changes the accent is valid:
{
"name": "My Jotura",
"light": { "accent": "oklch(48% 0.14 200)", "accent-contrast": "#fff" },
"dark": { "accent": "oklch(76% 0.13 200)" }
}
Rules:
lightanddarkare optional objects; at least one is required. A missing variant leaves that mode on the built-in.- Keys are token names, and these ten matter most:
bg,bg-sidebar,bg-hover,bg-active,fg,fg-muted,border,accent,accent-contrast,danger. Everything else (cards, hairlines, scrollbars, the source editor gutter, selection, syntax colors, diff colors, file badges) is derived from those or has a per-mode default, and can be overridden by name. - Values are any CSS color the app’s WebView accepts: hex,
rgb(),hsl(),oklch(),color-mix(). - Saving the file applies it immediately. Unknown keys and unusable values are skipped and listed under the switch in Settings; a file that is not valid JSON is ignored entirely, the built-in shows, and the parser error is listed instead.
- Turning the switch off stops using the file but never deletes it. If the file goes missing, Settings offers to recreate it.
Editor
| Setting | Effect | Default |
|---|---|---|
| Open in source mode | Show raw Markdown by default instead of the formatted view. You can still toggle either way per note with Cmd/Ctrl+Shift+E. | false |
| Load remote images | Allow images hosted on the web to load inside notes. This is off by default for privacy, because loading a web image reveals your IP address and your reading activity to whoever hosts it. | false |
Both rows are vault settings and read Applies to this vault on every device.
See The editor for what source mode changes and Keyboard shortcuts for the full chord list.
Templates
The Templates sub group stores no setting of its own. It manages template files, which live in your vault at .jotura/templates/<name>.md. A template body may use the variables {{date}}, {{time}}, {{datetime}}, {{filename}}, and {{title}}, plus {{date:FMT}} and {{time:FMT}} with a custom format. In a vault that has an Obsidian templates folder, set in .obsidian/templates.json, those templates are listed here too and can be applied, but they are edited as ordinary notes rather than from this group.
It needs a vault. With no vault open the group shows a single row reading Open a vault to manage templates. and no editor. With a vault open but no templates yet, it shows a No templates yet row and a New template… button.
Nested names such as work/standup are allowed. Renaming a template is not supported, so the name field is read only when you edit an existing one. Deleting asks you to confirm, and notes already created from that template are not affected.
The CLI reads and writes the same files:
jotura templates list --json
More on templates in Daily notes, tasks, and templates.
Daily Notes
| Setting | Effect | Default |
|---|---|---|
| Enable daily notes | Show the calendar sidebar and today’s daily note. Turning this off hides the settings below. | true |
| Create upcoming daily notes | Pre-create notes for the next few days when a vault opens. Off by default so nothing is written until you ask. Turning it on reveals the Auto-create window row. | false |
| Auto-create window | Number of upcoming days to pre-create on app start, from 1 to 60. Shown only while Create upcoming daily notes is on. | 14 |
| Task window | How far back to look for tasks in recently modified notes and recent daily notes, from 1 to 365 days. Tasks dated in the future always appear regardless of this value. | 30 |
Enable daily notes, Auto-create window, and Task window are vault settings (dailyNotesEnabled, dailyNotesAutoCreateDays, and taskListWindowDays in the vault’s Jotura/settings.json) and read Applies to this vault on every device. Create upcoming daily notes stays on the device as dailyNotesAutoCreate in the app’s settings.json, because it decides whether this device writes files when a vault opens.
This screen has no control for the daily notes folder. The folder is Daily unless the vault’s Jotura/settings.json names another one in dailyNotesFolder, which the jotura CLI also honors. A vault that has .obsidian/daily-notes.json uses the folder, date format, and template from that file instead, so daily notes in that layout appear in the calendar and new ones land beside them. See Daily notes, tasks, and templates.
Clicking any cell in the calendar creates that day’s note, including the grayed-out cells that belong to the previous or next month.
Semantic search
Semantic search finds notes related to your query even when the words differ. Its state comes from the vault’s own index and from model files on disk, outside the settings file, and the settings screen polls that state every two seconds while it is open.
Semantic search is off by default. When it is off, the section shows one row labeled Search by meaning with an Enable button. Enabling opens a chooser, because the first decision is where your notes get embedded. The rows below stay visible while semantic search is on, so you can change your mind later.
| Row label | Control | What it shows or does |
|---|---|---|
| Provider | Two cards, OpenAI and Local |
OpenAI is preselected and marked recommended: higher quality, uses your own API key, and note text and queries are sent to OpenAI. Local runs a small model on this device with no key and nothing sent anywhere. |
| Model and size | One select listing each model at each size, OpenAI only | text-embedding-3-small at 512, 1024, or 1536 dimensions (1536 preselected and recommended), or text-embedding-3-large at 3072. The helper line quotes the storage per chunk, 4 bytes per dimension. The local provider is fixed at 384. |
| API key | Save, then Replace and Remove |
Masked from the first keystroke. Save checks the format (sk- prefix, at least 20 characters, no whitespace), sends one single-input request to OpenAI to verify the key, and only then writes it to openai.json in the device’s secret folder: %LOCALAPPDATA%\jotura\ on Windows, encrypted for your Windows account, and <config dir>/jotura/ with owner-only permissions elsewhere. Afterwards the row shows only the last four characters. Replace takes a new key through the same check; Remove deletes the file. |
When OPENAI_API_KEY is set in the app’s environment, the API key row reads Provided by OPENAI_API_KEY and offers no Remove button. The variable takes precedence over the saved file, so change or unset it in your environment rather than here. The saved key is shared with the jotura CLI, is never included in the diagnostics bundle, and is redacted from every error message and log line. In a vault that syncs, an encrypted copy is also written to Jotura/provider-keys.json in the vault so your other devices receive it, and the row’s helper reads Saved to this vault and shared with your other devices rather than Saved on this device only. See Shared across devices.
With OpenAI selected and no key available, the Enable button stays disabled and its helper reads Add your OpenAI API key to continue. With Local selected it downloads the bge-small-en-v1.5-int8 embedding model, version v1, which is roughly 34 MB in two files, model.onnx and tokenizer.json.
Both files come from this base URL, and each is verified against a SHA-256 checksum:
https://releases.jotura.io/models/bge-small-en-v1.5-int8/v1/
They are stored at <config dir>/jotura/models/bge-small-en-v1.5-int8/v1/, where <config dir> is the same directory that holds settings.json (see Where settings are stored). While the download runs, the helper line reads Downloading the embedding model… <pct>% and the Enable button is replaced by that percentage. The app then builds the index in the background.
Once it is on, the section adds these rows and actions.
| Row label | Button | What it shows or does |
|---|---|---|
| Status | none | The provider that built the index, as OpenAI text-embedding-3-small (1536) or Local bge-small (384). For the local provider the compute backend follows: one of GPU (CUDA), GPU (DirectML), GPU (CoreML), CPU, or Unknown. The helper reads Applies to this vault on every device. |
| Index | none | The number of indexed chunks and the number still pending, plus an estimated time remaining while embedding is running, and · <n> skipped when notes were parked after a failure. In a vault that syncs, the helper reports when the index is being rebuilt from other devices’ embeddings, how many notes are waiting for vectors to arrive, or how many notes need an OpenAI key before they can be embedded. |
| Re-embed now (button in the Index row) | Re-embed now |
Present only when the index was built with a different provider, model, or size than the rows above now say, with the helper text Index was built with <old>; settings now say <new>. Deletes the index and rebuilds it with the current choice. |
| Re-index vault | Re-index vault |
Clears the existing chunks and rebuilds them in the background with the current provider, on every device that syncs the vault. On an OpenAI index this sends every chunk to OpenAI again. |
| Use the GPU for search by meaning | Switch | Windows only, and only for the local provider. Faster on machines with a dedicated graphics card; leave it off if Jotura closes while indexing. Off by default and kept on this device. |
| Turn off semantic search | Turn off & delete index |
Turns semantic search off for this vault on every device and deletes the local index. Your notes are untouched, and re-enabling rebuilds the index from scratch. This action asks you to confirm. |
Changing the provider, the model, or the size while semantic search is on re-embeds the whole vault. You are asked to confirm once. The confirmation names the provider, model, and size you are switching to, states that the existing index is deleted and every note re-embedded, and, when the target is OpenAI, that the rebuild sends every chunk to OpenAI under your key and costs money. Cancel and nothing changes. The choice is stored in the vault, in Jotura/settings.json, so it applies to this vault on every device that syncs it, and every one of them re-embeds or fetches the new index; the confirmation says so. The app’s own settings.json only remembers what you last picked, as the default the chooser preselects in the next vault you enable. A vault whose index was built differently from what its settings file says re-embeds the next time you open it. An index built before providers existed is treated as local and never migrated until you switch.
If enabling or indexing fails, a Last error row appears carrying the message, with the value Failed. The same pattern is used by the document conversion, sync, and command-line tool groups. A key that OpenAI rejects shows OpenAI rejected the API key and stops the queue until you replace it; a network failure or rate limit pauses the queue, which retries on its own with backoff. Both cases are covered in Troubleshooting.
With the local provider, nothing is sent anywhere beyond that one model download: the model runs on your machine and the index stays in the vault. OpenAI is used only if you pick it. Once you do, every chunk of every note and every semantic query is sent to OpenAI under your own key, while the index itself stays in the vault.
The CLI can query this index but never builds it, so notes written from the CLI are not findable by meaning until the desktop app indexes them. Running a semantic query with no index exits with code 13:
jotura search --mode semantic "onboarding decisions" --json
See Search and Reading and searching.
Account & sync
Sync is optional, and it requires a paid subscription. Pricing is on the pricing page.
When you are signed out, the section shows one row: label Status, helper Sign in to enable cross-device sync., and a Sign in button. Signing in asks for your email address and then a six digit code, which expires in 15 minutes. A Resend code button is limited to one send every 30 seconds.
When you are signed in, the section adds up to four account rows above the sync status.
| Row label | Button | What it does |
|---|---|---|
| Signed in as | Sign out |
The helper line is your email address. Signing out asks you to confirm first, then ends this device’s session on the server before clearing it here. |
| Other devices | Sign out other devices |
Ends every other session on your account; this device stays signed in. The helper reads Signs out every other device on this account. This one stays signed in. and afterwards reports how many sessions were signed out. |
| Plan | Manage billing |
Shown only while you have a subscription. The helper names the plan and its renewal, trial end, or cancellation date. The button opens https://jotura.io/account in your browser. |
| Restore vault from cloud | Restore from cloud |
Picks a vault from your account and downloads it into a local folder you choose. |
The sync status below those rows depends on where the current vault stands. The first matching case wins.
| Situation | What you see |
|---|---|
| No vault open | A Status row reading Open a vault to enable sync. |
| Signed in with no subscription | An upgrade card explaining what sync adds. |
| Sync not configured on this vault | A row labeled Enable sync with an Enable sync… button that sets a sync password and issues a recovery phrase. |
| Sync key not cached on this device | A row labeled Sync password needed with an Unlock sync… button. Its helper reads Sync is paused until you enter your sync password. Notes stay fully usable meanwhile. |
| Sync configured and running | A Status row plus an Actions row carrying Pause sync or Resume sync. |
In the running case the Status row’s helper is one of these ten sentences.
| Status helper | Meaning |
|---|---|
Idle. All changes pushed. |
Everything local is on the server. |
Registering vault on the server… |
First time setup for this vault is in progress. |
Syncing <n> of <n> notes… or Syncing… |
An upload pass is running. |
Pulling <n> of <n> notes… |
A download pass is running. |
Error: <message> |
The last pass failed. The message is shown verbatim. |
Offline. Will retry when online. |
The app has no network connection. |
Not registered. |
The vault has never been registered with the server. |
Not signed in. |
No account session on this device. |
Sync key needed. Unlock sync with your password. |
The key is not cached here. |
Paused. Server copy preserved. Resume to push pending edits. |
You paused sync. Edits queue locally. |
When sync reports an error, an extra row appears. It is labeled Last error, its helper carries the message, and its button reads Retry, which starts a fresh push. That row also appears for a transient failure from an action you just triggered. In the error state the Actions row is hidden, so Retry is the only sync control on screen.
Sync never blocks local work. Reading, writing, and search all keep working when sync is paused, offline, or missing its key.
Security & recovery
| Row label | Button | What it does |
|---|---|---|
| Change sync password | Change sync password… |
Opens three more rows: New sync password, Confirm new password, and Save. The minimum is 12 characters. The master key is re-wrapped on your device first, and only the wrapped result and the key derivation parameters go to the server. |
| New recovery phrase | New recovery phrase… |
Generates a fresh phrase and invalidates the old one. It asks for your current sync password first, and the phrase is shown once during the ceremony. The server side is updated before the local commit. |
| Forget key on this device | Forget key |
Clears the cached sync key and deletes the session file. Sync moves to the paused, password needed state until you enter your sync password or your recovery phrase again. Your notes stay fully usable on this device. This action asks you to confirm. |
| Sharing identity key | Reset identity key |
The helper says whether this device holds your sharing key. The button is enabled only when it does not. A reset emails you a six-digit code first, and the owners of shares you belong to get an email saying your key changed. See Key codes. |
The recovery ceremony shows 12 numbered words. It offers a Copy to clipboard button that copies them numbered and one per line, then asks you to type back three of them chosen at random.
More context in Sync and sharing and Sync and shares.
Advanced: Files & folders
These are the default locations for new notes and imported documents.
| Setting | Effect | Default |
|---|---|---|
| Default new-note directory | Where new notes are created, relative to the vault root. Leave it blank to use the root itself. | Blank, meaning the vault root |
| Default document folder | Where documents you drop or paste into the app are stored, relative to the vault root. | attachments |
| Confirm before deleting | Show a confirmation dialog before moving a note to the trash. | true |
All three are vault settings and read Applies to this vault on every device. The two folders also steer the jotura CLI (see What the CLI shares).
Deleting from the app is one way. A deleted note moves into <vault>/.jotura/trash/ rather than the operating system trash, and there is no trash browser in the desktop app. Listing, restoring, and permanently purging a trashed note are CLI-only:
jotura trash list --json
That side is covered in Creating, moving, and deleting.
Advanced: Document conversion
Imported documents such as PDFs, Word files, and spreadsheets are converted to searchable Markdown by a converter bundled with the app. The group header shows an Unavailable badge when that converter is missing, a Blocked badge with a Conversion blocked row when it cannot run safely on this machine, and an <n> failed badge when conversions have failed. With zero failures, which is the normal state, there is no badge at all.
The first row reports the converter itself.
| Row label | When it shows | What it says |
|---|---|---|
| Converter | The converter is present. | Its value reads Ready. |
| Conversion unavailable | The converter is missing. | Documents still import, but stay un-searchable until the converter is present. Reinstalling Jotura restores it. |
That second row is the one to look for when an imported document never becomes searchable.
Two stored settings sit below it. Allow unsandboxed conversion is always visible; Convert documents automatically appears while a vault is open.
| Setting | Effect | Default |
|---|---|---|
| Convert documents automatically | A vault setting, stored as autoConvertDocuments in the vault’s Jotura/settings.json. On, the app converts documents on vault open, on import, and when the watcher sees a document change. Off, nothing is written until you use one of the manual buttons below. A vault that contains .obsidian/ gets this switched off the first time Jotura opens a vault it has never opened before, no note is touched, and a notice offers Convert now when the vault holds convertible documents. A vault Jotura has opened before keeps converting as it did. A vault the jotura CLI has already written to counts as opened, because the CLI’s write lock creates the .jotura folder. The helper reads Applies to this vault on every device. When off, documents stay unconverted until you use Convert pending. |
true, or false in a vault with .obsidian/ |
| Allow unsandboxed conversion | Convert documents without operating system sandboxing on machines where no sandbox is available. Off by default, which means conversion is skipped rather than parsing an untrusted file with your full account privileges. Only turn it on if you trust every document you import. | false |
Everything else in the group is conditional. The status row and the four action rows appear only when the converter is present, a vault is open, and that vault has at least one imported document. In a vault with no documents you get a No documents in this vault row instead, reading Conversion options appear once a document is imported.
| Row label | Button | What it does |
|---|---|---|
| Conversion status | none | Reads <n> converted · <n> failed · <n> pending for the open vault. |
| Reconvert stale documents | Reconvert stale |
Re-runs conversion for documents whose source changed or whose conversion is out of date. |
| Reconvert all documents | Reconvert all |
Re-runs conversion for every document in the vault. This is heavy on a large vault. |
| Convert pending documents | Convert pending |
Runs the background sweep now for anything missing a searchable copy. Works whether or not automatic conversion is on. |
| Retry failed conversions | Retry failed conversions |
Re-runs the failed documents, bypassing the automatic backoff. Failures are usually corrupt or password protected files. |
The last row is nested inside a disclosure that appears only when something has failed. Its toggle reads Show <n> failed…, expands to the list of failed paths, and then reads Hide failed. While a reconversion runs, a Progress row counts documents converted, and when one finishes a Result row reports the outcome.
See Documents for how importing works.
Advanced: Diagnostics
Everything in this group stays on your machine. It has two halves: sync diagnostics at the top, then the support report and the log path.
Sync diagnostics
These rows appear only when you are signed in, a vault is open, and sync is configured on that vault. Signing in with a vault that has never had sync enabled shows none of them.
While the first reading is in flight you see a single Loading row reading Fetching sync state…. After that, the rows refresh every two seconds.
| Row label | What it shows |
|---|---|
| Account | The email this device is signed in with. |
| Device ID | The identifier of this install. Both devices must be signed in to the same account. |
| Vault ID | The server vault this device points at. Two devices must show the same ID for changes to sync. |
| Pending ops | Local changes queued for the next push. This should drop to zero shortly after you edit. |
| Server version | The last manifest version this device pulled. |
| Last push | How long ago the last push ran, with the number of operations in the helper. |
| Last pull | How long ago the last pull ran, with the number of operations applied. |
| Last push error | Shown only when a push has failed. The message is in the helper. |
| Last pull error | Shown only when a pull has failed. |
| Re-pull from server | The button reads Force re-sync. It resets the local cursor and re-fetches the entire manifest from the server, keeping your local pending edits. It asks you to confirm first, then reports what it applied in a Result row. |
Use Force re-sync when changes from another device are not appearing. Version history covers what the server keeps per note.
Support report and log
| Row label | Button | What it does |
|---|---|---|
| Diagnostics | Copy diagnostics |
Builds a support report and copies it to your clipboard. The button briefly reads Copied, or Copy failed if the clipboard write did not work. |
| Log file | none | Shows the full path to the app’s log file, or (unavailable) if there is no resolvable path. |
Read the report before you paste it anywhere public. It opens with the app version, your operating system and architecture, the CPU, memory, resource profile, and WebView version, then the app’s memory use, uptime, and whether the last session ended uncleanly. It then records whether a vault is open, whether sync is enabled, whether the sync key is loaded, how many notes are indexed and synced, and the semantic search setup. It ends with the converter’s availability and version, the sandbox in use, the conversion counts, and the most recent part of the log, newest first.
Your home folder, the vault path, note paths, and share names are redacted from it, and it holds no note contents and no keys. Nothing is sent anywhere, so you paste it into a bug report yourself.
The CLI has a broader health check that covers the same ground and more:
jotura doctor --json
Both are described in Troubleshooting and Watching and diagnostics.
Advanced: Command-line tool
Every desktop installer ships the jotura command line tool alongside the app. This group puts it on your PATH, and it appears on macOS, on Windows, and in the Linux AppImage build. It is absent in the Linux .deb build, where the tool already lands on the standard PATH.
The group has two rows. Status reports where the tool currently is, and the action row’s button reads Install or Reinstall depending on that status.
| Status | Meaning |
|---|---|
Not installed |
The tool is not on your PATH yet. |
Installed (<path> is on PATH) |
Windows only. The install directory is on your user PATH. |
Installed at <path> |
The link or copy points at the binary bundled with this app. |
Installed at <path> (points elsewhere; reinstall to update) |
Something else is answering to jotura, such as a separate build. Reinstall to point it at this app’s binary. |
Unable to detect |
The app could not read the install state. |
What the action does depends on your platform.
| Platform | What happens | How to remove it later |
|---|---|---|
| macOS | Creates a symlink at /usr/local/bin/jotura. This needs administrator rights, so macOS prompts you for your password. |
sudo rm /usr/local/bin/jotura |
| Windows | Adds Jotura’s install directory to your user PATH. New terminals pick it up automatically. If it fails, a Last error row reports Could not update PATH. |
Edit PATH under System Properties, Environment Variables. |
| Linux AppImage | Copies the binary to ~/.local/bin/jotura. Make sure that directory is on your PATH. |
rm ~/.local/bin/jotura |
On Windows and on the Linux AppImage, the app also offers to do this once at startup, but only when the tool is not already installed. That prompt records that it has been shown whether you accept or decline, so it never asks a second time and it cannot be reset from Settings. Use this Settings group if you dismissed it and later changed your mind. On macOS this group is the only offer.
Full setup notes are in Install and setup.
About
The About section shows the Jotura logo and wordmark, the installed version number, and the tagline Local-first markdown notes. There are no controls in it.
Where settings are stored
Settings are a single JSON file in your operating system’s configuration directory.
| Platform | Path |
|---|---|
| Windows | %APPDATA%\jotura\settings.json |
| macOS | ~/Library/Application Support/jotura/settings.json |
| Linux | ~/.config/jotura/settings.json |
If no configuration directory resolves at all, the app falls back to ./jotura/settings.json, relative to the process working directory. That is rare, but check it if your settings appear to live nowhere.
The file is written atomically, through a temporary file that is flushed and renamed into place, so a crash mid-write leaves the previous version intact. If the file cannot be parsed at start, the app keeps a copy beside it as settings.json.corrupt and starts from the defaults, so the symptom is your preferences resetting rather than an error message.
Field names are camelCase and each missing field falls back to its own default, so a settings file written by an older version still loads. A file from before the Create upcoming daily notes switch existed loads with that switch off, so an upgrade stops pre-creating daily notes until you turn it back on. The semantic search choice you last made is four of those fields: semanticProvider (openAi or local), openaiEmbedModel, openaiEmbedDims, and semanticSpecChosen, which flips to true the first time you enable or switch. They are only the defaults the chooser preselects; the choice that governs an open vault lives in that vault’s Jotura/settings.json. The API key is not in this file, and neither are the device and sharing identity keys, which live in keys.json in the protected folder described under What end-to-end encryption means here. The app refuses any settings change that names a key, the signed-in account or the API address, and on macOS and Linux writes the file with owner-only permissions. There is one migration in place: a stored API address pointing at the retired staging server is rewritten to https://api.jotura.io on load. The JOTURA_API_URL environment variable overrides the address for a single run and is never written back to the file.
The frontend applies your change straight away. If the backend refuses or fails the write, the control quietly reverts to its previous value without an error message. If a change keeps snapping back, check that the settings file is writable.
Settings stored in the vault
Thirteen settings describe the vault rather than the machine, so they live in the vault at Jotura/settings.json, beside the custom theme file and the semantic search block, and sync like any note. Their rows read Applies to this vault on every device.
Key in Jotura/settings.json |
Row |
|---|---|
themeName |
Theme |
customThemeEnabled |
Custom theme |
sourceModeDefault |
Open in source mode |
allowRemoteImages |
Load remote images |
dailyNotesEnabled |
Enable daily notes |
dailyNotesAutoCreateDays |
Auto-create window |
dailyNotesFolder |
No row; Daily unless the file says otherwise |
taskListWindowDays |
Task window |
highlightsFolder |
No row on the desktop; set as Highlights folder in the phone’s account sheet. Highlights unless the file says otherwise |
defaultNewNoteDir |
Default new-note directory (an empty string means the vault root) |
documentFolder |
Default document folder |
confirmBeforeDelete |
Confirm before deleting |
autoConvertDocuments |
Convert documents automatically |
The settings screen shows one value per row: the vault’s value when the file sets it, otherwise the value from the app’s own settings.json. Changing one of these rows while a vault is open writes the vault file; the copy in the app’s settings.json is left alone and is what a vault without a file falls back to. With no vault open the rows edit the app’s file as before.
The file is written only when something asks for it: the first change to one of these rows, turning the custom theme on, or a one-time migration when a vault opens that still has the older per-vault file <vault>/.jotura/vault-settings.json. That migration copies the older file’s keys and the device’s non-default values for keys the vault file does not already set, then deletes the older file. Without that older file, opening a vault writes nothing, and a vault that contains .obsidian/ never gets the migration, so a vault nobody customized never gains the file.
A change made on another device applies live once sync delivers the file: the daily folder, theme, and the conversion switch all follow without a restart. Everything else on this screen (mode, fonts, Safe graphics mode, Low-resource mode, the account, the sync key, the API address, the sandbox opt-in, the semantic chooser defaults, the GPU switch, and Create upcoming daily notes) stays on the device.
Preferences stored outside settings.json
Some preferences live in the app’s own browser storage instead. They are per device and are not synced.
| Preference | How you set it | Range and default |
|---|---|---|
| Sidebar width | Drag the divider between the sidebar and the editor. The handle is also keyboard reachable: Tab to it, then ArrowLeft and ArrowRight resize in 16 pixel steps, saved immediately. | 200 to 600 pixels, default 300 |
| Right sidebar width | Drag the divider on the right side. This one is mouse only, with no keyboard equivalent. | 200 to 500 pixels, default 300 |
| Right sidebar collapsed | Toggle the right sidebar. | Collapsed by default |
| Recently closed tabs | Built automatically as you close tabs. | 30 entries per vault |
| Show autosaves in history | The Autosaves filter chip in the version history tab. |
Off until you turn it on |
| History diff layout | The Unified and Split toggle in version history, covered in Version history. |
Unified |
What the CLI shares
The jotura CLI reads some of the same state, which is why the two surfaces agree without any extra configuration.
| Shared state | How the CLI uses it |
|---|---|
| Last opened vault | When you do not pass --vault and JOTURA_VAULT is unset, the CLI resolves the vault from the desktop app’s lastVaultPath in settings.json. |
| Sync key cache | Both surfaces cache the per vault sync key in the same session directory (%LOCALAPPDATA%\jotura\sessions\ on Windows, under your configuration directory elsewhere). Signing in to sync from either one resumes it for the other. |
| Templates | Both read and write .jotura/templates/ in the vault. |
| Daily notes folder | jotura today puts the day’s note in the dailyNotesFolder from the vault’s Jotura/settings.json when the file names one (an explicit --folder still wins, and an Obsidian daily-notes.json layout still takes precedence). |
| Document folder | jotura import without --folder lands the file in the documentFolder from the vault’s Jotura/settings.json, else attachments. |
| Semantic index | The CLI queries the index the desktop app builds. It never indexes, and it embeds queries with whichever provider built the index. |
| OpenAI API key | The key saved from the API key row lives in openai.json in the same secret folder (%LOCALAPPDATA%\jotura\ on Windows, <config dir>/jotura/ elsewhere) and the CLI reads it for OpenAI indexes. OPENAI_API_KEY in the environment takes precedence in both surfaces. |
| App version | jotura doctor reports the desktop app version it finds in settings.json. |
The CLI has environment variables of its own, including overrides for the session directory and the model directory, and those are covered in Install and setup. Its exit codes and JSON conventions are in Exit codes and JSON output.