A unique terminal-based portfolio application that users can access via SSH. Built with Go using the Charm ecosystem (Bubbletea, Lipgloss, Wish) for an authentic terminal experience.
- SSH Access: Users can literally SSH into your portfolio
- Interactive TUI: Clean, responsive terminal interface
- 3-Panel Layout: Header navigation, sidebar sections, and main content
- Smooth Navigation: Tab cycling, vim keys, and hotkey support
- Rate Limiting: Built-in protection against abuse
- Session Management: Tracks and manages concurrent connections
- Security: Rate limiting, session timeouts, and connection monitoring
- Go 1.21 or higher
- SSH client for testing
- Clone the repository:
git clone <your-repo-url>
cd ssh-portfolio-claude- Install dependencies:
make deps- Generate SSH host key for development:
make generate-key- Build and run:
make runThe server will start on localhost:2222 by default.
Connect to your portfolio via SSH:
ssh -p 2222 localhost- Tab: Cycle between header, sidebar, and content areas
- 1-4: Quick page navigation (About, Experience, Projects, Contact)
- h/j/k/l or Arrow Keys: Navigate within focused area
- Enter: Select items in sidebar
- q or Ctrl+C: Quit
┌─────────────────── Header Navigation ──────────────────────┐
│ 1. About 2. Experience 3. Projects 4. Contact │
├──────────┬──────────────────────────────────────────────────┤
│ Sidebar │ │
│ │ │
│ • Item 1 │ Main Content │
│ • Item 2 │ │
│ • Item 3 │ │
│ │ │
└──────────┴──────────────────────────────────────────────────┘
The application can be configured via environment variables:
SSH_HOST: Server host (default:0.0.0.0)SSH_PORT: Server port (default:2222)SSH_HOST_KEY_PATH: Path to SSH host key (default:./ssh_host_key)
SSH_MAX_SESSIONS: Maximum concurrent sessions (default:100)RATE_LIMIT_RPM: Requests per minute per IP (default:60)RATE_LIMIT_BURST: Burst size for rate limiting (default:10)SESSION_TIMEOUT: Session timeout duration (default:30m)
APP_NAME: Application name (default:SSH Portfolio)APP_VERSION: Application version (default:1.0.0)DEBUG: Enable debug logging (default:false)
Install development tools:
make install-tools- Hot Reload Development:
make dev- Format Code:
make format- Lint Code:
make lint- Run Tests:
make test- Test Coverage:
make test-coveragessh-portfolio/
├── cmd/server/ # Application entry point
├── internal/
│ ├── config/ # Configuration management
│ ├── data/ # Data layer and portfolio content
│ ├── domain/ # Domain models and types
│ ├── errors/ # Error handling
│ ├── logger/ # Logging utilities
│ ├── middleware/ # SSH middleware (security, rate limiting)
│ ├── server/ # SSH server implementation
│ └── ui/ # TUI components (Bubbletea models, views, styles)
├── keys/ # SSH host keys (generated)
├── bin/ # Built binaries
├── Makefile # Build and development commands
└── README.md # This file
Edit the sample data in internal/data/portfolio.go to customize:
- Personal information
- Work experience
- Projects
- Contact details
- Skills and interests
The application uses a GitHub-inspired terminal theme. Customize colors and styles in internal/ui/styles.go.
Modify content rendering in internal/ui/layout.go to change how information is displayed.
- Build Docker image:
make docker-build- Run with Docker:
make docker-runCreate an optimized production binary:
make build-prodExample systemd service file:
[Unit]
Description=SSH Portfolio Server
After=network.target
[Service]
Type=simple
User=portfolio
Group=portfolio
WorkingDirectory=/opt/ssh-portfolio
ExecStart=/opt/ssh-portfolio/bin/ssh-portfolio
Restart=always
RestartSec=5
Environment=SSH_HOST=0.0.0.0
Environment=SSH_PORT=2222
Environment=SSH_HOST_KEY_PATH=/opt/ssh-portfolio/keys/ssh_host_key
[Install]
WantedBy=multi-user.target- The application includes rate limiting and session management
- All connections are logged and monitored
- SSH host key should be properly secured in production
- Consider running behind a reverse proxy for additional security
- Regularly update dependencies for security patches
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Run
make format && make lint && make test - Submit a pull request
MIT License - see LICENSE file for details.
This application uses a clean, modular architecture:
- Domain Layer: Core business logic and models
- UI Layer: Bubbletea components with composite model pattern
- Server Layer: SSH server with Wish middleware
- Security Layer: Rate limiting, session management, and monitoring
- Configuration Layer: Environment-based configuration management
The design follows Go best practices and uses dependency injection for testability and maintainability.