Getting Started with Epist
Installation
Section titled “Installation”Homebrew (macOS/Linux)
Section titled “Homebrew (macOS/Linux)”brew tap semos-labs/tapbrew install epistBuild from Source
Section titled “Build from Source”# Clone the repositorygit clone https://github.com/semos-labs/epist.gitcd epist
# Install dependenciesbun install
# Run the applicationbun run start
# Or in development mode with watchbun run devConnect Email
Section titled “Connect Email”Epist supports Gmail (OAuth) and IMAP/SMTP (any email provider). You can use both simultaneously — mix Gmail and IMAP accounts in a single client.
Option A: IMAP/SMTP (Any Provider)
Section titled “Option A: IMAP/SMTP (Any Provider)”Add your account to ~/.config/epist/config.toml:
[[accounts]]name = "Work"email = "me@work.com"provider = "imap"
[accounts.imap]host = "imap.work.com"port = 993security = "tls"username = "me@work.com"password_command = "security find-generic-password -a me@work.com -s epist -w"
[accounts.smtp]host = "smtp.work.com"port = 587security = "starttls"username = "me@work.com"password_command = "security find-generic-password -a me@work.com -s epist -w"Password options
Section titled “Password options”Pick one method for password_command:
| Method | Example |
|---|---|
| macOS Keychain | password_command = "security find-generic-password -a me@work.com -s epist -w" |
pass (GPG) | password_command = "pass show email/work" |
| 1Password CLI | password_command = "op read op://Personal/WorkEmail/password" |
| Bitwarden CLI | password_command = "bw get password work-email" |
| Environment var | password_command = "echo $WORK_EMAIL_PASSWORD" |
| Plain text | password = "hunter2" (not recommended) |
You can add multiple [[accounts]] blocks for multiple IMAP/SMTP accounts.
Option B: Gmail (OAuth)
Section titled “Option B: Gmail (OAuth)”Epist requires Google Cloud credentials to access Gmail.
Create a Google Cloud Project
Section titled “Create a Google Cloud Project”- Go to Google Cloud Console
- Create a new project (or select an existing one)
- Enable the Gmail API:
- Go to “APIs & Services” → “Library”
- Search for “Gmail API” and click “Enable”
- Also enable “Google Calendar API” and “People API” (for contacts)
Create OAuth Credentials
Section titled “Create OAuth Credentials”- Go to “APIs & Services” → “Credentials”
- Click “Create Credentials” → “OAuth client ID”
- If prompted, configure the OAuth consent screen:
- User Type: External (or Internal for Workspace)
- Add your email as a test user
- Add the following scopes:
gmail.modify(read/write mail and labels)gmail.send(send mail)calendar.events(read/write calendar events)calendar.readonly(read calendars list)contacts.readonly(read contacts)userinfo.emailanduserinfo.profile(get user info)
- Create OAuth client ID:
- Application type: Desktop app
- Name: “Epist” (or anything you like)
- Copy the Client ID and Client Secret
Configure Epist
Section titled “Configure Epist”Add your credentials to ~/.config/epist/config.toml:
[google]clientId = "your-client-id.apps.googleusercontent.com"clientSecret = "your-client-secret"Or use environment variables:
export EPIST_GOOGLE_CLIENT_ID="your-client-id.apps.googleusercontent.com"export EPIST_GOOGLE_CLIENT_SECRET="your-client-secret"Connect Gmail
Section titled “Connect Gmail”:loginFollow the OAuth flow in your browser. Epist supports multiple Google accounts — IMAP accounts are loaded automatically from config.toml.
Keybindings
Section titled “Keybindings”Navigation
Section titled “Navigation”| Key | Action |
|---|---|
j / ↓ | Next item |
k / ↑ | Previous item |
gg | First item |
G | Last item |
Tab / ` | Switch focus between list and view |
h / ← | Back to list (in view) |
l / → | Open email view |
Enter | Open / Select |
Email Actions
Section titled “Email Actions”| Key | Action |
|---|---|
s | Toggle star |
e | Archive |
D | Delete |
u | Mark as unread |
r | Reply |
f | Forward |
c | Compose new |
Global
Section titled “Global”| Key | Action |
|---|---|
: | Open command bar |
/ | Search emails |
? | Show help |
q | Quit |
Commands
Section titled “Commands”Type : to open the command bar, then enter a command:
| Command | Action |
|---|---|
inbox | Go to Inbox |
sent | Go to Sent |
drafts | Go to Drafts |
trash | Go to Trash |
starred | Go to Starred |
archive | Archive current email |
delete | Delete current email |
star | Toggle star |
login | Add Google account (OAuth) |
profile | Manage connected accounts (Gmail + IMAP) |
sync | Force sync with server |
help | Show keyboard shortcuts |
quit | Exit application |
Project Structure
Section titled “Project Structure”src/├── domain/ # Business logic and types│ ├── email.ts # Email types and helpers│ └── time.ts # Date formatting utilities├── keybinds/ # Keyboard handling│ ├── registry.ts # Centralized keybind definitions│ └── useKeybinds.tsx├── state/ # Jotai atoms and actions│ ├── atoms.ts # State definitions│ └── actions.ts # State mutations├── ui/ # React components│ ├── App.tsx # Main application│ ├── EmailList.tsx│ ├── EmailView.tsx│ ├── StatusBar.tsx│ ├── CommandPalette.tsx│ └── HelpDialog.tsx└── index.tsx # Entry pointNext Steps
Section titled “Next Steps”- Epist is under active development — see the overview for the full feature list and roadmap