Detailed changes
@@ -0,0 +1,141 @@
+name: Generate Screenshots
+
+on:
+ workflow_dispatch:
+ release:
+ types: [published]
+
+permissions:
+ contents: write
+ pull-requests: write
+
+jobs:
+ generate-screenshots:
+ name: Generate Feature Screenshots
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v6
+ with:
+ ref: master
+ persist-credentials: false
+
+ - name: Set up Go
+ uses: actions/setup-go@v6
+ with:
+ go-version: "stable"
+
+ - name: Create Dummy Config
+ run: |
+ mkdir -p ~/.config/matcha
+ cat <<EOF > ~/.config/matcha/config.json
+ {
+ "accounts": [
+ {
+ "id": "demo-user",
+ "name": "Matcha Client",
+ "email": "matcha@floatpane.com",
+ "password": "dummy-password",
+ "service_provider": "custom",
+ "fetch_email": "matcha@floatpane.com"
+ }
+ ]
+ }
+ EOF
+
+ - name: Create Dummy Drafts
+ run: |
+ cat <<EOF > ~/.config/matcha/drafts.json
+ {
+ "drafts": [
+ {
+ "id": "draft-001",
+ "to": "team@example.com",
+ "subject": "Q1 Planning Document",
+ "body": "# Q1 Planning\n\nHere are the key objectives for Q1...",
+ "account_id": "demo-user"
+ },
+ {
+ "id": "draft-002",
+ "to": "alice@example.com",
+ "subject": "Re: Design Review Feedback",
+ "body": "Thanks for the review! I'll address the comments...",
+ "account_id": "demo-user"
+ }
+ ],
+ "updated_at": "2026-01-15T10:00:00Z"
+ }
+ EOF
+
+ - name: Build Matcha
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ LATEST_TAG=$(gh release view --json tagName -q ".tagName" 2>/dev/null || echo "dev")
+ echo "Using version: $LATEST_TAG"
+
+ git fetch --tags 2>/dev/null || true
+
+ COMMIT=$(git rev-parse --short HEAD)
+ DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
+ go build -ldflags="-s -w -X main.version=$LATEST_TAG -X main.commit=$COMMIT -X main.date=$DATE" -o matcha .
+ go build -o email_view ./screenshots/cmd/email_view
+ go build -o inbox_view ./screenshots/cmd/inbox_view
+
+ - name: Prepare Tapes
+ run: |
+ for tape in screenshots/*.tape; do
+ [ "$tape" = "screenshots/common.tape" ] && continue
+ sed -i 's|go run \./screenshots/cmd/email_view|./email_view|' "$tape"
+ sed -i 's|go run \./screenshots/cmd/inbox_view|./inbox_view|' "$tape"
+ sed -i 's|go run \.|./matcha|' "$tape"
+ done
+
+ - name: Install Dependencies
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y ffmpeg ttyd
+ mkdir -p ~/.local/share/fonts
+ wget -q https://github.com/ryanoasis/nerd-fonts/releases/download/v3.1.1/JetBrainsMono.zip
+ unzip -o JetBrainsMono.zip -d ~/.local/share/fonts
+ fc-cache -fv
+ go install github.com/charmbracelet/vhs@latest
+
+ - name: Generate Screenshots
+ env:
+ CLICOLOR_FORCE: "1"
+ run: |
+ mkdir -p docs/docs/assets/
+ for tape in screenshots/*.tape; do
+ [ "$tape" = "screenshots/common.tape" ] && continue
+ name=$(basename "$tape" .tape)
+ echo "==> Generating screenshot: $name"
+ TERM=xterm-256color vhs "$tape" || echo "Warning: $name failed"
+ done
+ # Move generated screenshots to public assets, clean up intermediate gifs
+ mv screenshots/*.png docs/docs/assets/ 2>/dev/null || true
+ rm -f screenshots/*.gif 2>/dev/null || true
+ ls -la public/assets/screenshots/
+
+ - name: Create Pull Request
+ uses: peter-evans/create-pull-request@v8
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
+ commit-message: "docs: update feature screenshots [skip ci]"
+ title: "docs: update feature screenshots"
+ body: |
+ This PR updates the feature screenshots based on the latest release version.
+
+ Generated automatically by the Generate Screenshots workflow.
+
+ ### Screenshots included:
+ - `main_menu.png` - Main menu / choice screen
+ - `compose_email.png` - Email composition with Markdown
+ - `compose_empty.png` - Clean compose interface
+ - `email_view.png` - HTML email with inline images and attachments
+ - `inbox_view.png` - Inbox with emails from various senders and dates
+ - `settings.png` - Settings / account management
+ - `drafts.png` - Draft management view
+ branch: "update-screenshots"
+ base: "master"
+ add-paths: public/assets/screenshots/
@@ -1,4 +1,4 @@
-.PHONY: build test run clean lint fmt vet build-full
+.PHONY: build test run clean lint fmt vet build-full generate_screenshots
BINARY_NAME=matcha
BUILD_DIR=bin
@@ -8,6 +8,18 @@ generate_gif:
vhs demo.tape
mv demo.gif public/assets/demo.gif
+generate_screenshots:
+ @mkdir -p docs/docs/assets/
+ @for tape in screenshots/*.tape; do \
+ [ "$$(basename $$tape)" = "common.tape" ] && continue; \
+ name=$$(basename "$$tape" .tape); \
+ echo "==> Generating screenshot: $$name"; \
+ vhs "$$tape" || echo "Warning: $$name failed"; \
+ done
+ @mv screenshots/*.png docs/docs/assets/ 2>/dev/null || true
+ @rm -f screenshots/*.gif 2>/dev/null || true
+ @echo "Screenshots saved to public/assets/screenshots/"
+
build:
go build -o $(BUILD_DIR)/$(BINARY_NAME) .
@@ -1,5 +1,7 @@
# Composing Emails
+ 
+
Matcha provides a clean, intuitive interface for writing emails.
## Features
@@ -1,5 +1,7 @@
# Draft Management
+
+
Manage your unfinished emails with ease.
## Features
@@ -1,5 +1,7 @@
# Email Management
+
+
Matcha provides comprehensive tools for managing your emails directly from the terminal.
## Key Features
@@ -15,7 +15,7 @@ hide_table_of_contents: true
Ready to dive in? Here are a few places to start:
-- 🚀 [Installation Guide](./Getting Started/installation.md) - Get Matcha running on your machine
+- 🚀 [Installation Guide](.//installation.md) - Get Matcha running on your machine
- 📖 [Usage & Shortcuts](./usage.md) - Learn how to navigate the interface
- ⚙️ [Configuration](./Configuration.md) - Set up your accounts and preferences
@@ -0,0 +1,2 @@
+# VHS intermediate output files
+*.gif
@@ -0,0 +1,86 @@
+// email_view is a small helper that renders a mock email with inline images
+// for screenshot generation. It creates a bubbletea program displaying a
+// realistic HTML email using the real EmailView component.
+package main
+
+import (
+ "fmt"
+ "os"
+ "time"
+
+ tea "charm.land/bubbletea/v2"
+ "github.com/floatpane/matcha/fetcher"
+ "github.com/floatpane/matcha/tui"
+)
+
+func main() {
+ email := fetcher.Email{
+ UID: 1001,
+ From: "Sarah Chen <sarah.chen@example.com>",
+ To: []string{"team@example.com"},
+ Subject: "New Dashboard Redesign - Preview & Feedback",
+ Date: time.Now().Add(-2 * time.Hour),
+ MessageID: "<dashboard-redesign-001@example.com>",
+ AccountID: "demo-user",
+ Body: `<html>
+<body>
+<h1>Dashboard Redesign Preview</h1>
+
+<p>Hi team,</p>
+
+<p>I'm excited to share the <b>new dashboard redesign</b> we've been working on!
+Here's a quick overview of the changes:</p>
+
+<h2>What's New</h2>
+
+<ul>
+<li><b>Simplified navigation</b> - We reduced sidebar items from 12 to 6</li>
+<li><b>Dark mode support</b> - Full theme switching with system preference detection</li>
+<li><b>Real-time updates</b> - WebSocket integration for live data refresh</li>
+<li><b>Responsive layout</b> - Optimized for mobile, tablet, and desktop</li>
+</ul>
+
+<h2>Screenshots</h2>
+
+<p>Here's the new main view:</p>
+<img src="cid:dashboard-main" alt="Dashboard main view" />
+
+<p>And the analytics panel:</p>
+<img src="cid:analytics-panel" alt="Analytics panel with charts" />
+
+<h2>Next Steps</h2>
+
+<ol>
+<li>Review the mockups above</li>
+<li>Leave comments in the <a href="https://figma.com/file/example">Figma file</a></li>
+<li>Join the feedback session on <b>Thursday at 3pm</b></li>
+</ol>
+
+<p>Looking forward to your thoughts!</p>
+
+<p>Best,<br/>
+Sarah</p>
+</body>
+</html>`,
+ Attachments: []fetcher.Attachment{
+ {
+ Filename: "dashboard-mockup.png",
+ MIMEType: "image/png",
+ Inline: false,
+ },
+ {
+ Filename: "analytics-export.csv",
+ MIMEType: "text/csv",
+ Inline: false,
+ },
+ },
+ }
+
+ ev := tui.NewEmailView(email, 0, 140, 45, tui.MailboxInbox, true)
+
+ p := tea.NewProgram(ev)
+ if _, err := p.Run(); err != nil {
+ fmt.Fprintf(os.Stderr, "Error: %v\n", err)
+ os.Exit(1)
+ }
+}
@@ -0,0 +1,187 @@
+// inbox_view is a small helper that renders a mock inbox with realistic emails
+// for screenshot generation. It wraps the real Inbox component in a model
+// that forwards window size events properly.
+package main
+
+import (
+ "fmt"
+ "os"
+ "time"
+
+ tea "charm.land/bubbletea/v2"
+ "github.com/floatpane/matcha/config"
+ "github.com/floatpane/matcha/fetcher"
+ "github.com/floatpane/matcha/tui"
+)
+
+// wrapper forwards all messages to the FolderInbox and ensures it renders correctly.
+type wrapper struct {
+ folderInbox *tui.FolderInbox
+}
+
+func (w wrapper) Init() tea.Cmd {
+ return w.folderInbox.Init()
+}
+
+func (w wrapper) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
+ m, cmd := w.folderInbox.Update(msg)
+ if fi, ok := m.(*tui.FolderInbox); ok {
+ w.folderInbox = fi
+ }
+ return w, cmd
+}
+
+func (w wrapper) View() tea.View {
+ v := w.folderInbox.View()
+ v.AltScreen = true
+ return v
+}
+
+func main() {
+ now := time.Now()
+
+ accounts := []config.Account{
+ {
+ ID: "demo-user",
+ Name: "Matcha Client",
+ Email: "matcha@floatpane.com",
+ FetchEmail: "matcha@floatpane.com",
+ },
+ }
+
+ emails := []fetcher.Email{
+ {
+ UID: 1012,
+ From: "Alice Park <alice.park@example.com>",
+ To: []string{"matcha@floatpane.com"},
+ Subject: "Quick sync on the API migration?",
+ Date: now.Add(-12 * time.Minute),
+ MessageID: "<api-migration-012@example.com>",
+ AccountID: "demo-user",
+ },
+ {
+ UID: 1011,
+ From: "GitHub <notifications@github.com>",
+ To: []string{"matcha@floatpane.com"},
+ Subject: "[floatpane/matcha] Fix: resolve inbox pagination issue (#281)",
+ Date: now.Add(-47 * time.Minute),
+ MessageID: "<gh-notif-281@github.com>",
+ AccountID: "demo-user",
+ },
+ {
+ UID: 1010,
+ From: "Sarah Chen <sarah.chen@example.com>",
+ To: []string{"team@example.com"},
+ Subject: "New Dashboard Redesign - Preview & Feedback",
+ Date: now.Add(-2 * time.Hour),
+ MessageID: "<dashboard-redesign-001@example.com>",
+ AccountID: "demo-user",
+ Attachments: []fetcher.Attachment{
+ {Filename: "dashboard-mockup.png", MIMEType: "image/png"},
+ },
+ },
+ {
+ UID: 1009,
+ From: "David Kim <david.kim@example.com>",
+ To: []string{"matcha@floatpane.com"},
+ Subject: "Re: Quarterly budget review notes",
+ Date: now.Add(-5 * time.Hour),
+ MessageID: "<budget-review-009@example.com>",
+ AccountID: "demo-user",
+ },
+ {
+ UID: 1008,
+ From: "Stripe <receipts@stripe.com>",
+ To: []string{"matcha@floatpane.com"},
+ Subject: "Your receipt from Acme Corp - Invoice #4821",
+ Date: now.Add(-23 * time.Hour),
+ MessageID: "<stripe-receipt-4821@stripe.com>",
+ AccountID: "demo-user",
+ },
+ {
+ UID: 1007,
+ From: "Maria Gonzalez <maria.g@example.com>",
+ To: []string{"matcha@floatpane.com"},
+ Subject: "Design system tokens - final version attached",
+ Date: now.Add(-1*24*time.Hour - 6*time.Hour),
+ MessageID: "<design-tokens-007@example.com>",
+ AccountID: "demo-user",
+ Attachments: []fetcher.Attachment{
+ {Filename: "design-tokens-v3.json", MIMEType: "application/json"},
+ },
+ },
+ {
+ UID: 1006,
+ From: "Linear <notifications@linear.app>",
+ To: []string{"matcha@floatpane.com"},
+ Subject: "MAT-342: Implement keyboard shortcuts for compose view",
+ Date: now.Add(-2*24*time.Hour - 3*time.Hour),
+ MessageID: "<linear-342@linear.app>",
+ AccountID: "demo-user",
+ },
+ {
+ UID: 1005,
+ From: "James Wright <j.wright@example.com>",
+ To: []string{"matcha@floatpane.com"},
+ Subject: "Onboarding docs are ready for review",
+ Date: now.Add(-3*24*time.Hour - 1*time.Hour),
+ MessageID: "<onboarding-005@example.com>",
+ AccountID: "demo-user",
+ },
+ {
+ UID: 1004,
+ From: "Vercel <notifications@vercel.com>",
+ To: []string{"matcha@floatpane.com"},
+ Subject: "Deployment successful: matcha-docs-8f3a2b1",
+ Date: now.Add(-4*24*time.Hour - 8*time.Hour),
+ MessageID: "<vercel-deploy-004@vercel.com>",
+ AccountID: "demo-user",
+ },
+ {
+ UID: 1003,
+ From: "Lena Muller <lena.m@example.com>",
+ To: []string{"matcha@floatpane.com"},
+ Subject: "Conference talk proposal - Rethinking TUI Design",
+ Date: now.Add(-5*24*time.Hour - 2*time.Hour),
+ MessageID: "<conference-003@example.com>",
+ AccountID: "demo-user",
+ },
+ {
+ UID: 1002,
+ From: "GitHub <notifications@github.com>",
+ To: []string{"matcha@floatpane.com"},
+ Subject: "[floatpane/matcha] Release v1.4.0 published",
+ Date: now.Add(-5*24*time.Hour - 14*time.Hour),
+ MessageID: "<gh-release-140@github.com>",
+ AccountID: "demo-user",
+ },
+ {
+ UID: 1001,
+ From: "Omar Hassan <omar.h@example.com>",
+ To: []string{"matcha@floatpane.com"},
+ Subject: "Re: Open source contribution guidelines",
+ Date: now.Add(-6*24*time.Hour - 5*time.Hour),
+ MessageID: "<oss-contrib-001@example.com>",
+ AccountID: "demo-user",
+ },
+ }
+
+ folders := []string{
+ "INBOX",
+ "Drafts",
+ "Sent",
+ "Archive",
+ "Receipts",
+ "GitHub",
+ "Trash",
+ }
+
+ folderInbox := tui.NewFolderInbox(folders, accounts)
+ folderInbox.SetEmails(emails, accounts)
+
+ p := tea.NewProgram(wrapper{folderInbox: folderInbox})
+ if _, err := p.Run(); err != nil {
+ fmt.Fprintf(os.Stderr, "Error: %v\n", err)
+ os.Exit(1)
+ }
+}
@@ -0,0 +1,14 @@
+# Common VHS settings shared across all screenshot tapes
+# This file documents the shared settings - each tape includes them directly
+# because VHS does not support tape imports.
+
+# Terminal settings:
+# Set FontSize 14
+# Set FontFamily "JetBrainsMono Nerd Font"
+# Set Width 1400
+# Set Height 800
+# Set Theme "Catppuccin Mocha"
+# Set Padding 20
+# Set WindowBar Colorful
+# Set WindowBarSize 40
+# Set BorderRadius 10
@@ -0,0 +1,71 @@
+# Screenshot: Email Composition
+# Shows the compose screen with Markdown content being written
+
+Output screenshots/compose_email.gif
+
+Set FontSize 14
+Set FontFamily "JetBrainsMono Nerd Font"
+Set Width 1400
+Set Height 800
+Set Theme "Catppuccin Mocha"
+Set Padding 20
+Set WindowBar Colorful
+Set WindowBarSize 40
+Set BorderRadius 10
+
+Hide
+Type "go run ."
+Enter
+Show
+
+Sleep 2s
+
+# Navigate to Compose Email
+Down
+Sleep 300ms
+Enter
+Sleep 1.5s
+
+# Type recipient
+Type "alice@example.com"
+Sleep 200ms
+Tab
+Sleep 200ms
+Tab
+Sleep 100ms
+Tab
+Sleep 200ms
+
+# Type subject
+Type "Weekly Project Update"
+Sleep 200ms
+Tab
+Sleep 300ms
+
+# Type email body with Markdown
+Type "# Project Update"
+Enter
+Enter
+Type "Hi team, here's our **weekly update**:"
+Enter
+Enter
+Type "## Completed"
+Enter
+Type "- Shipped new dashboard redesign"
+Enter
+Type "- Fixed authentication bug in production"
+Enter
+Type "- Added unit tests for core modules"
+Enter
+Enter
+Type "## In Progress"
+Enter
+Type "- API rate limiting implementation"
+Enter
+Type "- Database migration planning"
+Enter
+Enter
+Type "Best regards"
+Sleep 800ms
+
+Screenshot screenshots/compose_email.png
@@ -0,0 +1,29 @@
+# Screenshot: Empty Compose Screen
+# Shows the clean compose interface before typing
+
+Output screenshots/compose_empty.gif
+
+Set FontSize 14
+Set FontFamily "JetBrainsMono Nerd Font"
+Set Width 1400
+Set Height 800
+Set Theme "Catppuccin Mocha"
+Set Padding 20
+Set WindowBar Colorful
+Set WindowBarSize 40
+Set BorderRadius 10
+
+Hide
+Type "go run ."
+Enter
+Show
+
+Sleep 2s
+
+# Navigate to Compose Email
+Down
+Sleep 300ms
+Enter
+Sleep 1.5s
+
+Screenshot screenshots/compose_empty.png
@@ -0,0 +1,32 @@
+# Screenshot: Drafts View
+# Shows the drafts management screen
+
+Output screenshots/drafts.gif
+
+Set FontSize 14
+Set FontFamily "JetBrainsMono Nerd Font"
+Set Width 1400
+Set Height 800
+Set Theme "Catppuccin Mocha"
+Set Padding 20
+Set WindowBar Colorful
+Set WindowBarSize 40
+Set BorderRadius 10
+
+Hide
+Type "go run ."
+Enter
+Show
+
+Sleep 2s
+
+# Navigate to Drafts (3rd menu item when drafts exist)
+Down
+Sleep 300ms
+Down
+Sleep 300ms
+Enter
+
+Sleep 1.5s
+
+Screenshot screenshots/drafts.png
@@ -0,0 +1,24 @@
+# Screenshot: Email View with Inline Images
+# Shows an HTML email with formatted content, inline image placeholders,
+# attachments list, and hyperlinks
+
+Output screenshots/email_view.gif
+
+Set FontSize 14
+Set FontFamily "JetBrainsMono Nerd Font"
+Set Width 1400
+Set Height 800
+Set Theme "Catppuccin Mocha"
+Set Padding 20
+Set WindowBar Colorful
+Set WindowBarSize 40
+Set BorderRadius 10
+
+Hide
+Type "go run ./screenshots/cmd/email_view"
+Enter
+Show
+
+Sleep 2.5s
+
+Screenshot screenshots/email_view.png
@@ -0,0 +1,23 @@
+# Screenshot: Inbox View
+# Shows a populated inbox with emails from various senders and dates
+
+Output screenshots/inbox_view.gif
+
+Set FontSize 14
+Set FontFamily "JetBrainsMono Nerd Font"
+Set Width 1400
+Set Height 800
+Set Theme "Catppuccin Mocha"
+Set Padding 20
+Set WindowBar Colorful
+Set WindowBarSize 40
+Set BorderRadius 10
+
+Hide
+Type "go run ./screenshots/cmd/inbox_view"
+Enter
+Show
+
+Sleep 2.5s
+
+Screenshot screenshots/inbox_view.png
@@ -0,0 +1,23 @@
+# Screenshot: Main Menu
+# Shows the main menu / choice screen with all navigation options
+
+Output screenshots/main_menu.gif
+
+Set FontSize 14
+Set FontFamily "JetBrainsMono Nerd Font"
+Set Width 1400
+Set Height 800
+Set Theme "Catppuccin Mocha"
+Set Padding 20
+Set WindowBar Colorful
+Set WindowBarSize 40
+Set BorderRadius 10
+
+Hide
+Type "go run ."
+Enter
+Show
+
+Sleep 2s
+
+Screenshot screenshots/main_menu.png
@@ -0,0 +1,35 @@
+# Screenshot: Settings Screen
+# Shows the settings / account management view
+
+Output screenshots/settings.gif
+
+Set FontSize 14
+Set FontFamily "JetBrainsMono Nerd Font"
+Set Width 1400
+Set Height 800
+Set Theme "Catppuccin Mocha"
+Set Padding 20
+Set WindowBar Colorful
+Set WindowBarSize 40
+Set BorderRadius 10
+
+Hide
+Type "go run ."
+Enter
+Show
+
+Sleep 2s
+
+# Navigate to Settings (3rd item if no drafts, 4th if drafts exist)
+# In CI we create dummy drafts, so: Inbox -> Compose -> Drafts -> Settings
+Down
+Sleep 300ms
+Down
+Sleep 300ms
+Down
+Sleep 300ms
+Enter
+
+Sleep 1.5s
+
+Screenshot screenshots/settings.png