5.7 KiB
Project Architecture
This document describes the architecture and structure of the GemReader application.
Overview
GemReader is a terminal-based markdown viewer built with Go using the Bubble Tea framework for the terminal user interface. The application reads markdown files, renders them for terminal display, and provides navigation capabilities.
Architecture Pattern
The application follows a modular architecture with clear separation of concerns:
- Presentation Layer: Bubble Tea-based TUI in the
tuipackage - Business Logic: Navigation and content handling in the
tuipackage - Configuration: Viper-based configuration loading in the
configpackage - Entry Point: Command-line interface in the
mainpackage
Package Structure
cmd/gemreader/main.go
The main entry point of the application that:
- Defines the command-line interface using Cobra
- Handles command-line argument validation
- Reads the markdown file specified by the user
- Loads application configuration
- Initializes and runs the TUI
internal/config/config.go
Configuration management that:
- Defines the application configuration structure
- Loads configuration from config.toml using Viper
- Provides configuration data to other parts of the application
- Handles configuration loading errors gracefully
internal/tui/tui.go
Terminal user interface implementation that:
- Implements the Bubble Tea model for TUI functionality
- Handles all user interactions and navigation
- Manages dual-pane interface (TOC and content)
- Renders content for terminal display using viewports
- Generates and manages table of contents from markdown headers
- Provides pane switching functionality
Design Patterns
Model-View-Update (MVU) Pattern
The TUI uses the Bubble Tea framework which implements the MVU pattern:
- Model: The state of the application (model struct)
- Update: Functions that modify the state based on messages (keyboard input, etc.)
- View: Function that renders the current state to the terminal
Viewport Pattern
The TUI uses dual viewports for the split-screen interface:
- TOC Viewport: Dedicated scrolling region for table of contents
- Content Viewport: Dedicated scrolling region for markdown content
- Both viewports are managed by the Bubble Tea framework
Dependency Management
The application uses Go modules for dependency management with the following key dependencies:
github.com/charmbracelet/bubbletea: TUI frameworkgithub.com/charmbracelet/lipgloss: Styling library for terminal interfacesgithub.com/charmbracelet/bubbles/viewport: Viewport component for scrollinggithub.com/spf13/cobra: Command-line interface frameworkgithub.com/spf13/viper: Configuration managementgithub.com/MichaelMure/go-term-markdown: Markdown rendering for terminals
Data Flow
- Initialization:
main.goparses command-line arguments and loads configuration - Content Loading: Markdown file is read and rendered for terminal display
- Model Creation: TUI model is created with content and configuration
- Event Loop: Bubble Tea enters event loop handling user input
- State Updates: User actions update the model state via the Update method
- Rendering: Changes to model trigger View method to refresh display
File Organization
gemreader/
├── cmd/
│ └── gemreader/
│ └── main.go # Application entry point
├── internal/
│ ├── config/
│ │ └── config.go # Configuration loading
│ └── tui/
│ └── tui.go # Terminal user interface
├── docs/ # Documentation files
│ ├── configuration.md
│ ├── navigation.md
│ ├── api.md
│ └── architecture.md
├── config.toml # Default configuration
├── sample.md # Sample markdown file
├── go.mod # Go module file
├── go.sum # Go module checksums
├── README.md # Main documentation file
└── CONTRIBUTING.md # Contribution guide
Component Responsibilities
Main Component
- Command-line argument parsing and validation
- File loading and error handling
- Configuration loading
- TUI initialization and execution
Config Component
- Loading configuration from TOML file
- Providing configuration to other components
- Handling configuration errors gracefully
TUI Component
- Managing application state
- Handling user input and navigation
- Rendering the dual-pane interface
- Managing pane switching between TOC and content
- Content display and positioning using viewports
- Generating and displaying table of contents
Security Considerations
- The application only reads files specified by the user
- No network connections are made during normal operation
- Configuration loading is restricted to local files
- Input validation is handled by the underlying libraries
Performance Characteristics
- Content is loaded entirely into memory at startup
- Navigation operations are performed in memory without file access
- Markdown rendering happens once at startup
- TOC generation happens once at startup
- Dual viewport system provides efficient scrolling in both panes
Extensibility Points
The architecture supports extension through:
- Configuration options (new fields in Config struct)
- Enhanced dual-pane functionality
- Additional keyboard controls (in Update method)
- New content processing features (in TUI package)
- Enhanced viewport behaviors and styling
- Additional TOC features and navigation options