Stream all your development logs in one place: frontend build tools, backend servers, and browser console logs.
One terminal showing:
- ✅ Build tool logs (Webpack, Vite, TypeScript compilation)
- ✅ Backend server logs (Python, Node, Go, etc.)
- ✅ Browser console logs (console.log, errors, warnings from the browser)
All timestamped, color-coded, and written to a dev.log file.
A lightweight shell script that reads a Procfile and runs multiple processes simultaneously:
- Starts each process in the background
- Captures stdout/stderr from all processes
- Adds timestamps and color coding
- Writes everything to terminal AND
dev.log
Simple format defining what processes to run:
frontend: cd web && npm run dev
backend: python -m flask run
A Vite plugin that forwards browser console logs to the terminal:
- Patches browser
console.log(),console.warn(), etc. - Sends logs to Vite dev server via HTTP
- Appears in terminal with
[browser]prefix
mkdir -p scripts
curl -o scripts/shoreman.sh https://gist.githubusercontent.com/[YOUR_GIST_URL]/shoreman.sh
chmod +x scripts/shoreman.shCreate a Procfile in your project root:
# Example for full-stack project
frontend: cd web && npm run dev
backend: cd api && python -m uvicorn main:app --reload
worker: cd worker && node index.js
cd web # or your frontend directory
npm install -D vite-console-forward-pluginUpdate your vite.config.ts:
import { defineConfig } from 'vite';
import { consoleForwardPlugin } from 'vite-console-forward-plugin';
export default defineConfig({
plugins: [
consoleForwardPlugin({
enabled: process.env.NODE_ENV !== 'production',
levels: ['log', 'warn', 'error', 'info', 'debug']
})
]
});Create a Makefile in your project root (see Makefile.example)
make dev
# or directly:
./scripts/shoreman.sh# Follow logs in real-time
make tail-log
# View last 100 lines
tail -n 100 dev.log# Ctrl+C in the terminal running shoreman
# or
kill $(cat .shoreman.pid)Terminal output looks like:
14:23:15 frontend | VITE v4.1.0 ready in 234 ms
14:23:15 backend | Server listening on :8080
14:23:16 frontend | ➜ Local: http://localhost:5173/
14:23:17 [browser] | User clicked button
14:23:18 backend | POST /api/data 200 45ms
14:23:18 [browser] | API response received
Each line includes:
- Timestamp (HH:MM:SS)
- Process name (color-coded in terminal)
- Log message
- Each process gets a unique color in the terminal
- Makes it easy to distinguish between different services
- Colors cycle through 7 different ANSI colors
- All logs written to
dev.log(without colors) - Survives terminal close
- Useful for debugging after the fact
- Creates
.shoreman.pidto prevent multiple instances - Cleans up on exit
- Graceful shutdown of all processes
Use tools like watchexec for hot reloading:
backend: watchexec -r -w . --exts go -- go run main.go
frontend: watchexec -r -w src --exts ts,tsx -- npm run build
frontend: cd web && npm run dev
backend: cd api && npm run dev
frontend: cd web && npm run dev
backend: cd api && uv run python -m flask run
worker: cd worker && uv run python worker.py
frontend: cd web && npm run dev
backend: watchexec -r -w . --exts go,sql -- go run cmd/server/main.go
web: cd packages/web && pnpm dev
api: cd packages/api && pnpm dev
admin: cd packages/admin && pnpm dev
worker: cd packages/worker && node index.js
# Check what's running
lsof -i :5173 # or your port
# Kill the process
kill -9 <PID># Check if running
cat .shoreman.pid
# Kill existing instance
kill $(cat .shoreman.pid)
rm .shoreman.pid- Verify
vite-console-forward-pluginis installed - Check
vite.config.tshas the plugin enabled - Make sure you're in development mode
- Check browser console for errors
- shoreman.sh - Inspired by Foreman but in pure shell
- vite-console-forward-plugin - Created by Armin Ronacher (mitsuhiko)
- Pattern used in: minibb, vibe-throwback-chat
The example files are provided as-is for use in any project.