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 |
Configuration
Config File
Configuration is stored in ~/.config/ekphos/config.toml.
# ~/.config/ekphos/config.toml
= "~/Documents/ekphos"
= false
= "catppuccin-mocha"
= true
= "base16-ocean.dark"
[]
= true
| 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) | catppuccin-mocha |
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 |
Note: This configuration format requires v0.3.0 or later.
Themes
Experimental: Themes are still highly experimental. We expect to finalize the theme standard around v0.6.0 or v0.7.0.
Themes are stored in ~/.config/ekphos/themes/ and use the Alacritty color scheme format.
Bundled Theme
catppuccin-mocha(default)
Using Alacritty Themes
Ekphos is fully compatible with Alacritty Themes. To use any Alacritty theme:
- Browse themes at https://github.com/alacritty/alacritty-theme/tree/master/themes
- Download a theme file to your themes directory:
- Set the theme in your config:
= "dracula"
Custom Themes
Create a .toml file in the themes directory using the Alacritty color format:
# ~/.config/ekphos/themes/mytheme.toml
[]
= "#1e1e2e"
= "#cdd6f4"
[]
= "#1e1e2e"
= "#f5e0dc"
[]
= "#1e1e2e"
= "#f5e0dc"
[]
= "#45475a"
= "#f38ba8"
= "#a6e3a1"
= "#f9e2af"
= "#89b4fa"
= "#f5c2e7"
= "#94e2d5"
= "#bac2de"
[]
= "#585b70"
= "#f38ba8"
= "#a6e3a1"
= "#f9e2af"
= "#89b4fa"
= "#f5c2e7"
= "#94e2d5"
= "#a6adc8"
Then set in config:
= "mytheme"
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)
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) |
| 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
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 |
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 |
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 |
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