viewport-cli
v1.1.6
Published
Responsive design auditing tool - capture screenshots across multiple viewports with zero manual setup
Maintainers
Readme
ViewPort-CLI: Responsive Design Auditing Tool
A command-line tool for capturing screenshots of websites across multiple device viewports (mobile, tablet, desktop) to identify responsive design issues before deployment.
✨ Now with automatic server management - zero manual setup required!
Problem Statement
Web developers need a quick, reliable way to test how their websites look across different device sizes during development. Manual testing in multiple browser windows is tedious and error-prone. Developers need:
- Fast feedback loops: Capture screenshots without leaving the terminal
- Multiple viewports: Test mobile (375×667), tablet (768×1024), and desktop (1920×1080) sizes simultaneously
- Real rendering: Use actual browser rendering (Firefox), not mocked output
- Local development: Work seamlessly with localhost development servers
- Simple setup: No complex infrastructure or external services required
- Automatic server management: No need to manually start/stop the screenshot server
Solution Overview
ViewPort-CLI provides a two-component architecture:
- Screenshot Server (Node.js + Playwright): Lightweight, installable as NPM package via
viewport-servercommand - CLI Tool (Go): Automatically manages server lifecycle and captures screenshots
Key improvements:
- ✅ Automatic server startup: CLI auto-starts server if not running
- ✅ Zero manual management: Server automatically stops after scan
- ✅ NPM package: Install globally with
npm linkornpm install -g - ✅ Health checks: Verifies server readiness before scanning
- ✅ Smart port management: Supports custom ports, auto-discovery
- ✅ No cloud dependencies: Runs entirely on your machine
- ✅ Works offline: No credentials or API tokens needed
Architecture
┌─────────────────────────────────────────────────────────────┐
│ Your Development Server (Your Website) │
│ http://localhost:3000 │
└────────────────────────┬─────────────────────────────────────┘
│ (HTTP requests)
│
┌────────────────────────▼─────────────────────────────────────┐
│ ViewPort-CLI (Go Binary) │
│ 1. Auto-start screenshot server if needed │
│ 2. Health check until server ready │
│ 3. Request screenshots from server │
│ 4. Save PNG files and metadata │
│ 5. Gracefully shutdown server │
└────────────────────────┬──────────────────────────────────────┘
│ (HTTP POST /screenshot)
│
┌────────────────────────▼──────────────────────────────────────┐
│ Screenshot Server (Node.js + Playwright) │
│ Command: viewport-server --port 3001 │
│ ✓ Launches Firefox with Playwright │
│ ✓ Captures at multiple viewports │
│ ✓ Returns PNG as base64 │
│ Listening on http://localhost:3001 │
└────────────────────────┬───────────────────────────────────────┘
│
└─ Spawns Chrome ProcessKey Difference from Traditional Setup:
- ✅ No need to manually start/stop the server
- ✅ CLI automatically manages server lifecycle
- ✅ Graceful cleanup after each scan
- ✅ Health checks ensure server readiness
Requirements
System Requirements
- Node.js 18.0 or higher (for screenshot server)
- Go 1.20 or higher (for CLI)
- Operating System: Linux, macOS, or Windows (no system dependencies needed!)
Disk Space
- ~200MB for Node.js dependencies and Playwright (includes Firefox binary)
- ~5-10MB per website scan (PNG files + metadata)
Getting Started
Quick Start (30 seconds)
# 1. Install screenshot server globally
cd server && npm link
# 2. Build CLI
cd cli && go build -o viewport-cli
# 3. Run first scan (server auto-starts!)
./viewport-cli scan --target http://localhost:3000That's it! The server starts automatically. No manual setup needed.
Step-by-Step Installation
Step 1: Clone the Project
git clone <repository-url>
cd viewport-cliStep 2: Install & Link Screenshot Server
cd server
npm install
npm link # Makes 'viewport-server' command available globallyVerify installation:
viewport-server --helpYou should see help text with available options.
Step 3: Build the Go CLI
cd cli
go build -o viewport-cliVerify build:
./viewport-cli scan --helpYou should see help text with available flags.
Step 4: Run Your First Scan
Make sure you have a development server running on port 3000:
# Terminal 1: Start your dev server
cd test-server
node server.js
# Output: Test server running on http://localhost:3000
# Terminal 2: Run a scan (server auto-starts automatically!)
cd cli
./viewport-cli scan --target http://localhost:3000The CLI will:
- ✅ Check if screenshot server is running
- ✅ Auto-start server if not running
- ✅ Wait for server health check
- ✅ Request screenshots from all viewports
- ✅ Save PNG files + metadata
- ✅ Gracefully shutdown server
Results saved to ./viewport-results/
Alternative: Using Custom Port
# Auto-start server on custom port
./viewport-cli scan --target http://localhost:3000 --server-port 3002Alternative: Manual Server Management
If you prefer to manage the server manually:
# Terminal 1: Start server manually
viewport-server --port 3001 &
# Terminal 2: Run scan without auto-start
./viewport-cli scan --target http://localhost:3000 --no-auto-startUsage
Basic Commands
# Run a scan with automatic server management
./viewport-cli scan --target http://localhost:3000
# Custom port
./viewport-cli scan --target http://localhost:3000 --server-port 3002
# Skip auto-start (server already running)
./viewport-cli scan --target http://localhost:3000 --no-auto-start
# Custom output directory
./viewport-cli scan --target http://localhost:3000 --output ./my-results
# List all previous scans
./viewport-cli results list
# Show results from a specific scan
./viewport-cli results show <scan-id>
# Show current configuration
./viewport-cli config show
# Initialize configuration
./viewport-cli config initCommand Options
./viewport-cli scan --help
Usage:
viewport-cli scan [flags]
Flags:
--target <url> Target URL to scan (e.g., http://localhost:3000) [REQUIRED]
--port <number> Local port (shorthand for --target http://localhost:<port>)
--output <dir> Output directory for results (default: ./viewport-results)
--api <url> Screenshot server endpoint (default: http://localhost:3001)
--viewports <list> Comma-separated viewport names (default: mobile,tablet,desktop)
--server-port <port> Screenshot server port (default: 3001) [AUTO-START]
--no-auto-start Skip auto-start, assume server is running
--no-display Save results without displaying summaryScreenshot Server Manual Commands
If you need to manually manage the server:
# Start server on default port (3001)
viewport-server
# Start on custom port
viewport-server --port 3002
# Run as daemon (background process)
viewport-server --port 3001 --detach
# Show help
viewport-server --helpConfiguration File
Create ~/.config/viewport-cli/.viewport.yaml:
api:
url: http://localhost:3001 # Screenshot server endpoint
scan:
viewports: # Default viewports to test
- mobile
- tablet
- desktop
output: ./viewport-results # Default output directory
timeout: 60 # Timeout in seconds
display:
verbose: false # Show detailed output
no_color: false # Disable colored output
no_table: false # Disable table formattingScreenshot Server Details
Installation
The screenshot server is now available as an NPM package with a global CLI command:
# Install from local directory (with npm link)
cd server
npm install
npm link
# Now available globally
viewport-serverFeatures
The screenshot server (server/index.js) is a lightweight Node.js application that:
- Listens on:
http://localhost:3001(or custom port via --port) - Dependencies: Node.js 18+, Playwright 1.40+ (lightweight, pre-built Firefox binaries)
- Browser Management: Playwright automatically manages Firefox installation and updates
- Auto-start Helper: Ships with launcher.js for integration (used by CLI)
Server API
Health Check
GET http://localhost:3001/Returns server status and available devices.
Single Screenshot
POST http://localhost:3001/screenshot
Content-Type: application/json
{
"url": "http://localhost:3000",
"viewport": "MOBILE",
"fullPage": true
}Batch Screenshots
POST http://localhost:3001/screenshots
Content-Type: application/json
{
"url": "http://localhost:3000",
"viewports": ["MOBILE", "TABLET", "DESKTOP"],
"fullPage": true
}Troubleshooting
Issue: viewport-server: command not found
Cause: Screenshot server not linked to global PATH
Solution:
cd server
npm linkThen verify: viewport-server --help
Issue: Port Already in Use
Error: Error: listen EADDRINUSE: address already in use :::3001
Solutions:
# Use different port
./viewport-cli scan --target http://localhost:3000 --server-port 3002
# Or find and kill process using port 3001
lsof -i :3001 # macOS/Linux
netstat -ano | findstr :3001 # WindowsIssue: CLI Can't Connect to Screenshot Server
Error: scan failed: connection refused
Solutions:
- Verify server is running:
curl http://localhost:3001 - Check if port is in use:
lsof -i :3001 - Ensure server started successfully:
viewport-server --port 3001 - Try with explicit --no-auto-start and verify server is running
Issue: Browser Won't Install
Error: ERROR: Failed to download Firefox binaries
Solutions:
# Manually install Firefox binaries
npx playwright install firefox
# Or force reinstall everything
npm install --forceIssue: Scan Fails with Network Error
Error: scan failed: Get "http://localhost:3000": dial tcp
Solutions:
- Verify your development server is running
- Use IP address instead:
--target http://127.0.0.1:3000 - Check firewall isn't blocking localhost connections
Issue: Screenshots Are Blank or Incorrect
Causes:
- Development server not responding
- Page takes time to load
- JavaScript rendering issues
Solutions:
- Test your server directly:
curl -s http://localhost:3000 | head -100 - Check browser console for JavaScript errors
- Try a simpler page first (static HTML)
- Increase timeout: Check configuration
Issue: Auto-Start Not Working
Symptom: Server not starting automatically, manual start works fine
Solutions:
- Verify
viewport-servercommand is available:which viewport-server - Check PATH includes npm global bin directory
- Try with explicit --no-auto-start to test manual mode
- Check file permissions:
chmod +x server/bin/viewport-server.js
Output Format
Each scan creates a directory with:
Directory Structure
viewport-results/
├── scan-1765807565866/
│ ├── metadata.json # Scan details and results
│ ├── mobile.png # Mobile viewport screenshot (375×667)
│ ├── tablet.png # Tablet viewport screenshot (768×1024)
│ └── desktop.png # Desktop viewport screenshot (1920×1080)metadata.json
{
"scan_id": "scan-1765807565866",
"timestamp": "2025-12-15T10:30:45Z",
"target": "http://localhost:3000",
"status": "complete",
"duration_ms": 1590,
"viewports": [
{
"device": "mobile",
"dimensions": {
"width": 375,
"height": 667
},
"screenshot": "base64-encoded-png",
"issues": []
},
{
"device": "tablet",
"dimensions": {
"width": 768,
"height": 1024
},
"screenshot": "base64-encoded-png",
"issues": []
},
{
"device": "desktop",
"dimensions": {
"width": 1920,
"height": 1080
},
"screenshot": "base64-encoded-png",
"issues": []
}
]
}PNG Files
Raw PNG screenshot files that can be opened in any image viewer or shared with team members.
Performance Characteristics
Cold startup (first scan): ~6-8 seconds
- Server startup: 2-3 seconds
- Chrome launch: 1-2 seconds
- Screenshot capture: 1-3 seconds per viewport
Warm startup (server already running): ~3-5 seconds
- Health check: <500ms
- Screenshot capture: 1-3 seconds per viewport
Concurrent pages: Max 3 (configurable in server/index.js)
Screenshot size: 100-300KB per viewport (PNG)
Metadata storage: ~500KB-1MB per scan (base64 encoded)
Development
Building from Source
# Screenshot Server (Node.js)
cd server
npm install
npm link # Global command
# CLI (Go)
cd cli
go build -o viewport-cli main.go
go test ./... # Run tests
go fmt ./... # Format codeDeveloper Workflow
Modify server code (
server/index.jsorserver/lib/launcher.js)cd server npm link # Changes take effect immediately when viewport-server runsModify CLI code (
cli/cmd/scan.goorcli/pkg/server/manager.go)cd cli go build -o viewport-cli main.go # Test with: ./viewport-cli scan --helpTest end-to-end
# Terminal 1: Start dev server cd test-server && node server.js & # Terminal 2: Run scan cd cli && ./viewport-cli scan --target http://localhost:3000
Project Structure
viewport-cli/
│
├── server/ # Screenshot Server (Node.js)
│ ├── bin/
│ │ └── viewport-server.js # CLI executable entry point
│ ├── lib/
│ │ └── launcher.js # Auto-start helper module
│ ├── examples/
│ │ ├── launcher-example.js # Launcher API usage
│ │ └── cli-integration.js # Integration patterns
│ ├── index.js # Main server implementation
│ ├── package.json
│ ├── INTEGRATION_GUIDE.md # Server integration documentation
│ ├── REFACTORING_SUMMARY.md # Technical details
│ ├── REFACTORED_README.md # Package README
│ ├── COMPLETION_CHECKLIST.md # Feature checklist
│ ├── test-integration.js # Test suite (10 tests)
│ └── README.md
│
├── cli/ # Go CLI
│ ├── cmd/
│ │ ├── root.go # Root command setup
│ │ ├── scan.go # Scan command (with auto-start)
│ │ ├── config.go # Configuration commands
│ │ └── results.go # Results listing
│ ├── pkg/
│ │ ├── api/
│ │ │ └── client.go # Screenshot API client
│ │ ├── config/
│ │ │ └── config.go # Configuration management
│ │ ├── server/
│ │ │ └── manager.go # Server lifecycle manager
│ │ ├── results/
│ │ │ └── results.go
│ │ └── tunnel/
│ │ └── tunnel.go
│ ├── main.go
│ ├── go.mod
│ ├── viewport-cli # Built binary
│ ├── INTEGRATION_GUIDE.md # CLI integration documentation
│ └── README.md
│
├── test-server/ # Test Website
│ ├── server.js # Simple test HTTP server
│ └── test.html # Test webpage
│
├── viewport-results/ # Scan Output (Generated)
│ ├── scan-XXXX/
│ │ ├── metadata.json
│ │ ├── mobile.png
│ │ ├── tablet.png
│ │ └── desktop.png
│ └── ...
│
├── INTEGRATION_COMPLETE.md # Complete integration summary
├── PLAN.md # Project plan
├── PHASE3_PROPOSAL.md # Phase 3 proposal (AI analysis)
├── SETUP_GUIDE.md # Setup instructions
├── README.md # This file
└── .gitignoreDependencies
Screenshot Server (Node.js)
- Playwright + Firefox: Browser automation with pre-built binaries (zero system dependencies)
- Express: HTTP server framework
- Built-in Node.js modules: http, fs, stream, path
CLI (Go)
- github.com/spf13/cobra: Command-line framework
- github.com/charmbracelet/lipgloss: Terminal styling
- github.com/go-resty/resty/v2: HTTP client
- github.com/spf13/viper: Configuration management
Documentation
The project includes comprehensive documentation for all components:
Main Documentation
- INTEGRATION_COMPLETE.md - Complete integration summary with diagrams and all features
- README.md - This file, quick start and usage guide
- PLAN.md - Project planning and roadmap
- SETUP_GUIDE.md - Detailed setup instructions
Component Documentation
- server/INTEGRATION_GUIDE.md - Server integration guide with examples
- server/REFACTORING_SUMMARY.md - Technical summary of changes
- server/REFACTORED_README.md - NPM package README
- server/COMPLETION_CHECKLIST.md - Features and completion checklist
- cli/INTEGRATION_GUIDE.md - CLI integration guide with API reference
Testing
The project includes comprehensive test suite:
# Run server integration tests
cd server
npm test
# Build CLI
cd cli
go build -o viewport-cli main.go
# Test CLI
./viewport-cli scan --help
./viewport-cli results listTest Results: ✅ All 10 server integration tests passing Build Status: ✅ CLI builds successfully (13MB binary) End-to-End: ✅ Verified with real test website
Future Enhancements (Phase 3)
The project roadmap includes:
- ✅ Auto-start screenshot server (COMPLETE)
- ✅ NPM package distribution (COMPLETE)
- ✅ Health check and readiness validation (COMPLETE)
- ✅ Custom port support (COMPLETE)
- ✅ Graceful process management (COMPLETE)
- 🔄 AI-powered analysis using Google Gemini (Planned)
- 🔄 Automated issue detection (Planned)
- 🔄 Visual diff comparison (Planned)
- 🔄 CI/CD pipeline integration (Planned)
See PHASE3_PROPOSAL.md for detailed plans.
Contributing
Contributions welcome! Please:
- Fork the repository
- Create a feature branch
- Submit a pull request with:
- Description of changes
- Testing steps
- Updated documentation
License
MIT License - See LICENSE file for details
Support
For issues, questions, or feature requests:
- Check the Troubleshooting section
- Review the comprehensive documentation
- Check existing GitHub issues
- Create a new issue with:
- OS and Go/Node.js versions
- Error messages and logs
- Steps to reproduce
- Expected vs actual behavior
Quick Reference
# Quick Start
cd server && npm link
cd cli && go build -o viewport-cli
./viewport-cli scan --target http://localhost:3000
# Server Commands
viewport-server # Start on port 3001
viewport-server --port 3002 # Custom port
viewport-server --help # Show help
# CLI Commands
./viewport-cli scan --help # Show scan options
./viewport-cli results list # List all scans
./viewport-cli config show # Show config
# Troubleshooting
which viewport-server # Check PATH
curl http://localhost:3001 # Test server
lsof -i :3001 # Check port usageAcknowledgments
- Playwright for browser automation
- Cobra for CLI framework
- Lipgloss for terminal styling
- Firefox browser engine
Current Version: 1.0.0
Last Updated: December 15, 2025
Status: ✅ Production Ready
