An open source, lightweight, fast, terminal-based markdown research tool built with Rust.
- Rust 1.70+ (run
rustup updateto update) - A terminal emulator (for inline image preview: iTerm2, Kitty, WezTerm, Ghostty, or Sixel-compatible terminal)
git clone https://github.com/hanebox/ekphos.git
cd ekphos
make
sudo make installgit clone https://github.com/hanebox/ekphos.git
cd ekphos
docker build -t ekphos-ssh .
docker compose up -dAfter the container is up, SSH into the machine:
ssh ekphos@your-docker-container-ipIf installed with Cargo:
If installed with Make:
cd ekphos # navigate to the cloned repo
sudo make uninstall| Flag | Description |
|---|---|
-h, --help |
Print help information |
-v, --version |
Print version |
-c, --config |
Print config file path |
-d, --dir |
Print notes directory |
Configuration is stored in ~/.config/ekphos/config.toml.
# ~/.config/ekphos/config.toml
notes_dir = "~/Documents/ekphos"
welcome_shown = false
theme = "catppuccin-mocha"
show_empty_dir = true
syntax_theme = "base16-ocean.dark"| 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 |
Note: This configuration format requires v0.3.0 or later.
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.
catppuccin-mocha(default)
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:
curl -o ~/.config/ekphos/themes/dracula.toml \ https://raw.githubusercontent.com/alacritty/alacritty-theme/master/themes/dracula.toml - Set the theme in your config:
Create a .toml file in the themes directory using the Alacritty color format:
# ~/.config/ekphos/themes/mytheme.toml
[colors.primary]
background = "#1e1e2e"
foreground = "#cdd6f4"
[colors.cursor]
text = "#1e1e2e"
cursor = "#f5e0dc"
[colors.selection]
text = "#1e1e2e"
background = "#f5e0dc"
[colors.normal]
black = "#45475a"
red = "#f38ba8"
green = "#a6e3a1"
yellow = "#f9e2af"
blue = "#89b4fa"
magenta = "#f5c2e7"
cyan = "#94e2d5"
white = "#bac2de"
[colors.bright]
black = "#585b70"
red = "#f38ba8"
green = "#a6e3a1"
yellow = "#f9e2af"
blue = "#89b4fa"
magenta = "#f5c2e7"
cyan = "#94e2d5"
white = "#a6adc8"Then set in config:
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.
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
- 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.
- 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.
- Select a note or folder in the sidebar
- Press
rto rename - Edit the name and press
Enterto confirm (orEscto cancel)
- 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!
- 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)
- 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)
| 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) |
Code blocks with a language specifier are syntax-highlighted using syntect:
```rust
fn main() {
let message = "Hello, Ekphos!";
println!("{}", message);
}
```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
syntax_theme = "base16-mocha.dark"Use standard markdown image syntax:



Both local files and remote URLs (http/https) are supported.
Supported formats: PNG, JPEG, GIF, WebP, BMP
- Navigate to the image line in content view
- Click on the image or press
Enter/oto open in system viewer
For inline image preview, use a compatible terminal:
- iTerm2 (macOS)
- Kitty
- WezTerm
- Ghostty
- Sixel-enabled terminals
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
Use HTML <details> tags for collapsible/expandable sections:
<details>
<summary>Click to expand</summary>
Hidden content goes here.
This can include multiple lines.
</details>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.
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
| 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 |
| 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 |
| 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.
| 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 (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
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 |
Ekphos is open source and contributions are welcome.
git clone https://github.com/hanebox/ekphos.git
cd ekphos
make run| Branch | Purpose |
|---|---|
main |
Development branch |
release |
Stable release branch |
- Fork the repository
- Create a feature branch from
main - Make your changes
- Submit a PR to the
mainbranch
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.
We don't have socials yet, but things are open for discussion. Feel free to create a discussion in this repo.
MIT
