Ekphos
An open source, lightweight, fast, terminal-based markdown research tool built with Rust.

Table of Contents
Getting Started
Requirements
- Rust 1.70+ (run
rustup updateto update) - A terminal emulator (for inline image preview: iTerm2, Kitty, WezTerm, Ghostty, or Sixel-compatible terminal)
Installation
Using Cargo (Recommended)
Using Make
Using Docker
After the container is up, SSH into the machine:
Update
Uninstall
If installed with Cargo:
If installed with Make:
CLI Options
| Flag | Description |
|---|---|
-h, --help |
Print help information |
-v, --version |
Print version |
-c, --config |
Print config file path |
-d, --dir |
Print notes directory |
--reset |
Reset config and themes to defaults |
Resetting Configuration
If you encounter issues after a breaking update (e.g., theme format changes), you can reset your configuration:
This will:
- Delete your config file (
~/.config/ekphos/config.toml) - Delete your themes directory (
~/.config/ekphos/themes/) - Regenerate fresh defaults from the latest version
Your notes are not affected.
Configuration
Config File
Configuration is stored in ~/.config/ekphos/config.toml.
# ~/.config/ekphos/config.toml
= "~/Documents/ekphos"
= false
= "ekphos-dawn"
= true
= "base16-ocean.dark"
[]
= true
= 4
= 0
= 1
| Setting | Description | Default |
|---|---|---|
notes_dir |
Directory where notes are stored | ~/Documents/ekphos |
welcome_shown |
Show welcome dialog on startup | true |
theme |
Theme name (without .toml extension) | ekphos-dawn |
show_empty_dir |
Show folders that contain no .md files | true |
syntax_theme |
Syntax highlighting theme for code | base16-ocean.dark |
Editor settings:
| Setting | Description | Default |
|---|---|---|
editor.line_wrap |
Enable soft line wrapping in editor | true |
editor.tab_width |
Number of spaces to display for tabs | 4 |
editor.left_padding |
Left padding in editor (columns) | 0 |
editor.right_padding |
Right padding in editor (columns) | 1 |
Note: This configuration format requires v0.3.0 or later.
Themes
Ekphos uses its own theme format designed for simplicity and semantic color naming. Themes are stored in ~/.config/ekphos/themes/ as .toml files.
Bundled Theme
ekphos-dawn(default) - A smooth dark theme with blue accents
Theme Format
Ekphos themes use a clean, semantic structure with both base sections and component-specific overrides:
Base Sections:
| Section | Purpose |
|---|---|
[base] |
Core background and text colors |
[accent] |
Primary and secondary accent colors |
[semantic] |
Functional colors (error, warning, success, info) |
[ui] |
UI element colors (borders, selection, cursor) |
Component Sections (Optional):
| Section | Purpose |
|---|---|
[ui.statusbar] |
Status bar specific colors |
[ui.dialog] |
Dialog/popup specific colors |
[ui.sidebar] |
Sidebar specific colors |
[ui.content] |
Content view specific colors |
[ui.outline] |
Outline panel specific colors |
Base Color Reference:
| Color | Usage |
|---|---|
background |
Main background |
background_secondary |
Popups, code blocks |
foreground |
Primary text |
muted |
Secondary text, hints |
primary |
Focused borders, brand accent, headings |
secondary |
Secondary accent, visual mode |
error |
Error messages, invalid links |
warning |
Warnings, selected items |
success |
Success messages, valid states |
info |
Info messages, links |
border |
Unfocused borders |
border_focused |
Focused panel borders |
selection |
Text selection background |
cursor |
Cursor color |
Creating Custom Themes
Create a .toml file in the themes directory:
# ~/.config/ekphos/themes/mytheme.toml
[]
= "#1a1b26"
= "#24283b"
= "#c0caf5"
= "#565f89"
[]
= "#7aa2f7"
= "#bb9af7"
[]
= "#f7768e"
= "#e0af68"
= "#9ece6a"
= "#7dcfff"
[]
= "#3b4261"
= "#7aa2f7"
= "#283457"
= "#c0caf5"
# Optional: Component-specific overrides
[]
= "#1a1b26"
= "#c0caf5"
= "#7aa2f7"
= "#565f89"
= "#3b4261"
[]
= "#1a1b26"
= "#7aa2f7"
= "#7aa2f7"
= "#c0caf5"
[]
= "#1a1b26"
= "#c0caf5"
= "#e0af68"
= "#7dcfff"
= "#7dcfff"
[]
= "#1a1b26"
= "#c0caf5"
= "#7aa2f7"
= "#9ece6a"
= "#e0af68"
= "#bb9af7"
= "#7dcfff"
= "#f7768e"
= "#9ece6a"
= "#24283b"
= "#565f89"
= "#bb9af7"
[]
= "#1a1b26"
= "#7aa2f7"
= "#9ece6a"
= "#e0af68"
= "#bb9af7"
Then set in config:
= "mytheme"
Tip: All color values use hex format (
#RRGGBB). Component sections are optional - missing values fall back to base section colors, then to default ekphos-dawn colors.
Contributing Themes
Want to share your theme with the community? Here's how:
-
Create your theme file in the
/themesfolder of the repository:themes/your-theme-name.toml -
Follow the naming convention:
- Use lowercase with hyphens:
tokyo-night.toml,dracula.toml - Be descriptive:
nord-light.toml,gruvbox-dark.toml
- Use lowercase with hyphens:
-
Include a header comment with theme info:
# Theme Name - Brief Description # Author: Your Name (optional) # Inspired by: Original theme (if applicable) [] ... -
Test your theme by copying it to
~/.config/ekphos/themes/and setting it in your config -
Submit a PR to the
mainbranch with:- Your theme file in
/themes - A brief description in the PR
- Your theme file in
Theme Guidelines:
- Ensure sufficient contrast between background and foreground
- Test all UI elements (dialogs, status bar, editor, content, outline)
- Consider both focused and unfocused states for borders
- Component sections are optional but allow fine-grained customization
Usage
Layout
Ekphos has three panels:
| Panel | Position | Description |
|---|---|---|
| Sidebar | Left | Collapsible folder tree with notes |
| Content | Center | Note content with markdown rendering |
| Outline | Right | Auto-generated headings for navigation |
Use Tab or Shift+Tab to switch between panels.
Collapsible Panels:
- Press
Ctrl+bto collapse/expand the sidebar (shows ≡ icon with note count when collapsed) - Press
Ctrl+oto collapse/expand the outline (shows heading symbols ◆■▸ when collapsed)
Folder Tree
The sidebar displays a hierarchical folder tree that automatically detects subdirectories containing .md files:
- Folders are shown with
▶(collapsed) or▼(expanded) icons - Press
Enteron a folder to toggle expand/collapse - Folders and notes are sorted alphabetically together
- Folders start collapsed by default
Creating Notes
- Press
nto create a new note - Enter the note name
- Press
Enterto confirm
Notes are stored as .md files in your configured notes directory.
Context-aware: When your cursor is on a folder or a note inside a folder, pressing n will create the new note in that folder.
Creating Folders
- Press
N(Shift+N) to create a new folder - Enter the folder name
- Press
Enterto confirm - A dialog will appear to create the first note in the folder
- Enter the note name and press
Enter(orEscto cancel and remove the empty folder)
Context-aware: When your cursor is on a folder, pressing N will create the new folder as a subfolder.
Renaming
- Select a note or folder in the sidebar
- Press
rto rename - Edit the name and press
Enterto confirm (orEscto cancel)
Deleting
- Select a note or folder in the sidebar
- Press
dto delete - Confirm with
yor cancel withn
Warning: Deleting a folder will remove all notes inside it!
Searching Notes
- Press
/in the sidebar to start searching - Type your search query
- Results are highlighted in green, title shows match count
- Use
Arrow keysorCtrl+j/k/n/pto navigate between matches - Press
Enterto select and close search - Press
Escto cancel search
Features:
- Searches all notes recursively, including those in collapsed folders
- Auto-expands folders containing matched notes
- Border color indicates status: yellow (typing), green (matches found), red (no matches)
Editing Notes
- Select a note in the sidebar
- Press
eto enter edit mode - Edit using vim keybindings
- Press
Ctrl+sto save - Press
Escto exit edit mode (discards unsaved changes)
Editor Syntax Highlighting
The editor provides real-time markdown syntax highlighting while you type:
| Syntax | Style |
|---|---|
# H1 |
Blue + Bold |
## H2 |
Green + Bold |
### H3 |
Yellow + Bold |
#### H4 |
Magenta + Bold |
##### H5 |
Cyan + Bold |
###### H6 |
Gray + Bold |
**bold** |
Bold |
*italic* |
Italic |
`code` |
Green |
``` blocks |
Green |
[link](url) |
Cyan + Underline |
[[wiki link]] |
Cyan (valid) / Red (invalid) |
> blockquote |
Cyan |
- * + list markers |
Yellow |
1. 2. ordered list |
Yellow |
[ ] [x] task boxes |
Cyan |
Highlighting updates automatically as you edit, helping you visualize markdown structure without leaving edit mode.
Markdown Support
| Syntax | Rendered As |
|---|---|
# Heading |
◆ HEADING (blue) |
## Heading |
■ Heading (green) |
### Heading |
▸ Heading (yellow) |
#### Heading |
› Heading (mauve) |
##### Heading |
Heading (teal) |
###### Heading |
Heading (subtle) |
- item |
• item |
- [ ] task |
[ ] task (unchecked) |
- [x] task |
[x] task (checked) |
`code` |
Inline code (green) |
```lang |
Syntax-highlighted code |
 |
Inline image |
[text](url) |
Clickable link (cyan) |
[[note]] |
Wiki link (cyan/red) |
| table | |
Formatted table |
<details> |
Collapsible dropdown (cyan) |
Syntax Highlighting
Code blocks with a language specifier are syntax-highlighted using syntect:
```rust
fn main() {
}
```
Supported languages: Rust, Python, JavaScript, TypeScript, Go, C, C++, Java, Ruby, PHP, Shell, SQL, HTML, CSS, JSON, YAML, Markdown, and many more.
Code blocks without a language specifier render in a uniform green color.
Available syntax themes:
| Theme | Description |
|---|---|
base16-ocean.dark |
Dark ocean theme (default) |
base16-ocean.light |
Light ocean theme |
base16-eighties.dark |
Dark 80s retro theme |
base16-mocha.dark |
Dark mocha theme |
InspiredGitHub |
GitHub-inspired light theme |
Solarized (dark) |
Solarized dark theme |
Solarized (light) |
Solarized light theme |
Set in config:
# ~/.config/ekphos/config.toml
= "base16-mocha.dark"
Images
Adding Images
Use standard markdown image syntax:




Both local files and remote URLs (http/https) are supported.
Supported formats: PNG, JPEG, GIF, WebP, BMP
Viewing Images
- Navigate to the image line in content view
- Click on the image or press
Enter/oto open in system viewer
Terminal Image Support
For inline image preview, use a compatible terminal:
- iTerm2 (macOS)
- Kitty
- WezTerm
- Ghostty
- Sixel-enabled terminals
Links
Markdown links are rendered with underlined cyan text:
[Ekphos Website](https://ekphos.xyz)
[GitHub](https://github.com)
Opening links:
- Click on a link to open in your default browser
- Or navigate to the line and press
Space - Hover over a link to see the "Open ↗" hint
Multiple links on same line:
- Use
]to select next link,[to select previous - Selected link is highlighted with yellow background
Spaceopens the currently selected link
Wiki Links
Ekphos supports Obsidian-style wiki links for inter-document linking:
[[note name]]
[[folder/nested note]]
Syntax:
| Format | Description |
|---|---|
[[note]] |
Link to a note in the root directory |
[[folder/note]] |
Link to a note in a subfolder |
Preview Mode:
- Valid links appear in cyan with underline
- Invalid links (non-existent notes) appear in red
- Navigate to link and press
Spaceto open the linked note - If the target doesn't exist, you'll be prompted to create it
Edit Mode:
- Wiki links are syntax-highlighted (cyan for valid, red for invalid)
- Type
[[to trigger the autocomplete popup - Use
↑/↓to navigate suggestions - Folders are prefixed with
dir: - Press
Enterto insert the selected note/folder - Press
Escto close the popup - Selecting a folder inserts
[[folder/and continues autocomplete
Creating Notes from Links:
When you navigate to a wiki link that doesn't exist:
- A dialog appears asking if you want to create the note
- Press
yto create the note at the specified path - Press
norEscto cancel
This allows you to write links to notes you plan to create later, then create them when needed.
Collapsible Details
Use HTML <details> tags for collapsible/expandable sections:
Hidden content goes here.
This can include multiple lines.
Usage:
- Click on the details line to toggle open/close
- Or navigate with keyboard and press
Space - When collapsed, shows
▶indicator - When expanded, shows
▼indicator with content below
Use cases: FAQs, spoilers, optional information, long code examples.
Using the Outline
The outline panel shows all headings in your note:
- Press
Tabto focus the outline - Use
j/kto navigate headings - Press
Enterto jump to that heading
Keyboard Shortcuts
Global
| Key | Action |
|---|---|
j/k |
Navigate up/down |
gg |
Go to first item |
G |
Go to last item |
Tab |
Switch focus (Sidebar → Content → Outline) |
Shift+Tab |
Switch focus (reverse) |
Enter/o |
Open image / Jump to heading |
? |
Show help dialog |
q |
Quit |
Ctrl+b |
Toggle sidebar collapse |
Ctrl+o |
Toggle outline collapse |
R |
Reload files from disk |
Ctrl+Shift+R |
Reload config and theme |
Sidebar
| Key | Action |
|---|---|
n |
Create new note |
N |
Create new folder |
Enter |
Toggle folder / Open note |
r |
Rename note/folder |
d |
Delete note/folder |
e |
Edit note |
/ |
Search notes |
Content View
| Key | Action |
|---|---|
j/k |
Navigate lines |
Shift+J/K |
Toggle floating cursor mode |
gg |
Go to beginning of file |
G |
Go to end of file |
Space |
Toggle task / details dropdown / Open link |
]/[ |
Next/previous link (multi-link lines) |
Enter/o |
Open image in system viewer |
Click |
Open link or image |
Floating Cursor Mode: When enabled (yellow border, [FLOAT] indicator), the cursor moves freely within the visible area. The view only scrolls when the cursor reaches the top or bottom edge. Toggle with Shift+J or Shift+K.
Edit Mode
Normal Mode
| Key | Action |
|---|---|
i |
Insert before cursor |
a |
Insert after cursor |
A |
Insert at end of line |
I |
Insert at start of line |
o |
New line below |
O |
New line above |
v |
Visual mode |
h/l |
Move cursor left/right |
j/k |
Move cursor up/down |
w/b |
Move by word |
0/$ |
Line start/end |
g/G |
Top/bottom of file |
x |
Delete character |
dd |
Delete line |
dw |
Delete word forward |
db |
Delete word backward |
y |
Yank (copy) selection |
p |
Paste |
u |
Undo |
Ctrl+r |
Redo |
Ctrl+s |
Save and exit |
Esc |
Exit (discard changes) |
Delete Commands Flow
Delete commands (dd, dw, db) use a confirmation flow with visual feedback:
- Press
d- Title showsNORMAL d-with yellow border- Available:
d(line),w(word forward),b(word backward)
- Available:
- Press target key - Text is highlighted, title shows
NORMAL [DEL]with red border- Press
dto confirm deletion - Press
Escto cancel - Any other key cancels and performs its action
- Press
Visual Mode
Press v in normal mode to enter visual mode for text selection.
| Key | Action |
|---|---|
h/j/k/l |
Extend selection |
w/b |
Extend by word |
y |
Yank selection |
d/x |
Delete selection |
Esc |
Cancel |
Mouse Selection
In edit mode, use the mouse for quick text selection:
| Action | Result |
|---|---|
| Click | Position cursor |
| Drag | Select text (enters visual mode) |
| Right-click | Context menu (Copy / Cut / Paste) |
| Drag to edge | Auto-scroll while selecting |
Auto-scroll: When dragging near the top or bottom edge of the editor, the view automatically scrolls to allow selecting text beyond the visible area.
Contributing
Ekphos is open source and contributions are welcome.
Development Setup
Branch Strategy
| Branch | Purpose |
|---|---|
main |
Development branch |
release |
Stable release branch |
Workflow
- Fork the repository
- Create a feature branch from
main - Make your changes
- Submit a PR to the
mainbranch
Disclaimer
This project is in an early development stage. There may be frequent unexpected breaking changes throughout the pre-release, but things should remain usable throughout this stage.
Socials
We don't have socials yet, but things are open for discussion. Feel free to create a discussion in this repo.
License
MIT