TAVPBox — Local Development Environment
TAVPBox adalah local development environment seperti Lando, tapi pakai Podman (bukan Docker). Hasilnya: jauh lebih irit RAM, HTTP-only (simple!), dan mendukung migrasi dari Lando.
1 laptop = banyak "VPS mini". Tiap project = 1 container terisolasi.| Lando (Docker) | TAVPBox (Podman) | |
|---|---|---|
| RAM / 20 project | ~3.2 GB | ~1.5 GB |
| Protocol | HTTPS (Let's Encrypt) | HTTP only (simple!) |
| Auto domain | *.lndo.site | *.tavp.my.id |
| Mail per-project | mail.*.lndo.site | mailpit.*.tavp.my.id |
| Multi-stack | ✓ | ✓ (TAVP/Laravel/Python/Node/Go/...) |
| Lando migration | — | ✓ (full .lando.yml support) |
| Auto-detect recipe | — | ✓ (composer.json/package.json/go.mod) |
| Timezone | UTC | ✓ Asia/Jakarta default |
| Web Panel | ✓ | ✓ (built-in) |
Apa itu TAVPBox?
TAVPBox adalah CLI tool yang bisa:
- Manage local development containers — create, start, stop, destroy
- Auto-routing domain —
*.tavp.my.id→ container - HTTP only — tanpa HTTPS complexity, langsung jalan
- Migrasi dari Lando — parse
.lando.ymlotomatis - Auto-detect recipe — dari
composer.json,package.json,go.mod,requirements.txt - Events auto-execution —
events.post-startjalan otomatis saat create - Timezone default —
Asia/Jakartauntuk semua container - Web panel — manage semua project dari browser
- Dynamic tooling —
tavpbox artisan migrate,tavpbox composer install
Arsitektur
tavpbox (Go binary)
├── CLI (cobra)
│ ├── init, create, start, stop, restart, destroy, rebuild
│ ├── ssh, list, info, logs, expose
│ ├── tooling (dynamic subcommands)
│ ├── panel (web UI)
│ ├── proxy (reverse proxy management)
│ └── config (configuration)
├── Podman client (exec wrapper)
├── Embedded Go proxy
│ ├── HTTP :80 (HTTP only, no HTTPS)
│ ├── LAN ports :8081-8999
│ └── Dynamic routes (routes.json)
├── LAN port manager (fixed ports per project)
├── Service library (15 services)
├── Recipe library (7 recipes)
├── Lando parser (.lando.yml)
└── API server (REST + embedded panel)Prasyarat
- Windows: Windows 10/11 64-bit, Podman Desktop
- macOS: Homebrew, Podman
- Linux: Podman
- Tidak perlu paham nginx/docker
1. Install
Option 1: Download Binary (Recommended)
Download dari GitHub Releases:
| Platform | File |
|---|---|
| Windows | tavpbox-windows-amd64.exe |
| macOS (Intel) | tavpbox-darwin-amd64 |
| macOS (M1/M2) | tavpbox-darwin-arm64 |
| Linux (x64) | tavpbox-linux-amd64 |
| Linux (ARM) | tavpbox-linux-arm64 |
Add to PATH:
# Windows
move tavpbox.exe C:\Users\<you>\AppData\Local\tavpbox\
# macOS/Linux
sudo mv tavpbox /usr/local/bin/Option 2: Build from Source
git clone https://github.com/tavp-stack/tavpbox.git
cd tavpbox
go build -o tavpbox .Option 3: Go Install
go install github.com/tavp-stack/tavpbox@latest2. Setelah Host Restart / Shutdown
Setelah komputer restart, jalankan satu command:
tavpbox start --allOutput:
Starting all TAVPBox containers...
✓ tavp-web-id → http://tavp-web-id.tavp.my.id
✓ lula → http://lula.tavp.my.id
Starting proxy...
✓ 2 containers started + proxy runningAtau start per-folder:
cd ~/projects/my-app
tavpbox start3. Project Baru (tavpbox init)
cd ~/projects/my-app
tavpbox initTAVPBox auto-detect recipe dari codebase:
composer.jsondenganlaravel/framework→ laravelcomposer.jsondenganphalcon/cphalcon→ tavpcomposer.json(PHP biasa) → phppackage.json→ nodego.mod→ gorequirements.txt/pyproject.toml→ python
TUI akan muncul dengan recipe yang sudah ter-deteksi:
Project name [my-app]:
Recipe:
[1] tavp
> [2] laravel (detected)
[3] php
[4] node
[5] go
[6] python
[7] blank
Select [2]:
Services (comma/space separated):
Available: mariadb, mysql, postgres, mongodb, redis, memcached, mailpit, mailhog, phpmyadmin, adminer, elasticsearch, rabbitmq
Default [mariadb redis mailpit]:
Webroot [public]:
RAM limit [512MB]:
CPU cores [1]:Setelah init, file .tavpbox.yml dibuat:
name: my-app
recipe: tavp
webroot: public
services:
mariadb:
enabled: true
redis:
enabled: true
mailpit:
enabled: true
tooling:
artisan:
cmd: php artisan
composer:
cmd: composer
npm:
cmd: npm
npx:
cmd: npx
php:
cmd: php
test:
cmd: php artisan test
ram: 512MB
cpu: 14. Create Container (tavpbox create)
tavpbox createYang dilakukan:
- Pull image (Ubuntu 24.04, Node 20, dll)
- Create container dengan volume mount
- Start container
- Install recipe (nginx + PHP + composer, dll)
- Install services (mariadb, redis, mailpit)
- Run
events.post-startcommands (otomatis!) - Configure reverse proxy
Output:
Creating box 'my-app' (tavp recipe)...
[1/4] Pulling image docker.io/library/ubuntu:24.04...
[2/4] Creating container...
[3/4] Starting container...
[4/4] Installing tavp recipe...
Installing mariadb...
Installing redis...
Installing mailpit...
Creating startup script...
Running post-start events...
✓ Box 'my-app' created and running!
Direct: http://localhost:35941
HTTP: http://my-app.tavp.my.id
LAN: http://192.168.1.100:8081
IP: 10.89.0.27
SSH: tavpbox sshAuto-create on Start
tavpbox start otomatis create container jika belum ada:
cd ~/projects/my-app
tavpbox start
# Container not found. Creating...
# ✓ Box 'my-app' created and running!Jadi cukup tavpbox start — gak perlu init + create secara terpisah.
5. Akses Project
URLs
| Service | URL |
|---|---|
| App | http://my-app.tavp.my.id |
| Mailpit | http://mailpit.my-app.tavp.my.id |
| phpMyAdmin | http://phpmyadmin.my-app.tavp.my.id |
| Direct | http://localhost:<port> |
| LAN | http://<host-ip>:<lan-port> |
Database Credentials
tavpbox info Database:
Host: localhost
User: app
Password: app
Database: app6. Perintah Harian
Lifecycle
tavpbox start --all # Start semua containers + proxy (setelah restart)
tavpbox start # Start container di folder ini
tavpbox stop # Stop container (RAM balik 0)
tavpbox restart # Restart container
tavpbox destroy # Hapus container permanen
tavpbox rebuild # Recreate container (data tetap)Monitoring
tavpbox list # Semua container + status
tavpbox info # Detail project (URLs, DB creds)
tavpbox logs # Lihat logs containerSSH
tavpbox ssh # Masuk terminal container
tavpbox ssh php artisan # Jalankan command di containerTooling
tavpbox tooling # Lihat semua tooling commands
tavpbox artisan migrate # php artisan migrate
tavpbox composer install # composer install
tavpbox npm run dev # npm run dev
tavpbox test # php artisan test
tavpbox php --version # php --version7. Migrasi dari Lando
TAVPBox mendukung penuh .lando.yml. Cukup jalankan tavpbox create di folder yang ada .lando.yml.
Yang di-support:
- ✅
recipe(lamp, laravel, dll) - ✅
services(mariadb, mysql, redis, mailpit, phpmyadmin, dll) - ✅
tooling(artisan, composer, npm, mysql, dll) - ✅
proxy(*.lndo.site → *.tavp.my.id) - ✅
events.post-start(build/run commands) - ✅
services.*.overrides.environment(env vars) - ✅
services.*.creds(DB credentials)
Contoh migrasi:
# Project Lando
cd ~/kos-kosan.id
cat .lando.yml
# name: koskosan
# recipe: lamp
# services:
# appserver: { type: php:8.4 }
# database: { type: mysql:8.0, creds: { user: koskosan, password: koskosan, database: koskosan } }
# redis: { type: redis:7 }
# mailpit: { type: mailpit }
# proxy:
# appserver: [koskosan.lndo.site]
# koskosan-mailpit: [mailpit.koskosan.lndo.site]
# Migrasi ke TAVPBox
tavpbox info
# Recipe: laravel
# Services: mariadb, redis, mailpit
# Domain: http://koskosan.tavp.my.id
# Database: koskosan/koskosan/koskosan
tavpbox create
# http://koskosan.tavp.my.id → jalan!Mapping Lando → TAVPBox
| Lando | TAVPBox |
|---|---|
*.lndo.site | *.tavp.my.id |
mail.*.lndo.site | mailpit.*.tavp.my.id |
pma.*.lndo.site | phpmyadmin.*.tavp.my.id |
services.appserver.type: php:8.4 | recipe: laravel |
services.database.type: mariadb:11.6 | services.mariadb.enabled: true |
services.redis | services.redis.enabled: true |
services.mailpit | services.mailpit.enabled: true |
tooling.artisan | tooling.artisan.cmd: php artisan |
services.*.creds | env.DB_* |
8. Database Persistence
Database data otomatis persist di host. Gak hilang saat rebuild.
~/.tavpbox/volumes/<project>/mysql/ → MariaDB/MySQL data
~/.tavpbox/volumes/<project>/postgres/ → PostgreSQL dataBackup
podman exec tavp-<project> mysqldump -u root <database> > backup.sqlRestore
cat backup.sql | tavpbox ssh mysql -u root9. Recipes
| Recipe | Description | Image | Default Services |
|---|---|---|---|
tavp | TAVP Stack (PHP 8.3 + Nginx + Node 20) | ubuntu:24.04 | mariadb, redis, mailpit |
laravel | Laravel | ubuntu:24.04 | mariadb, redis, mailpit |
php | Generic PHP | ubuntu:24.04 | mariadb, redis |
node | Node.js | node:20-alpine | redis |
go | Go | golang:1.22-alpine | — |
python | Python | python:3.12-slim | redis |
blank | Empty container | ubuntu:24.04 | — |
Recipe Detail
TAVP Stack (tavp)
- PHP 8.3 + FPM
- Nginx
- Node.js 20
- Composer
- Phalcon (optional)
- Webroot:
public
Laravel (laravel)
- PHP 8.3 + FPM
- Nginx
- Node.js 20
- Composer
- Webroot:
public
PHP (php)
- PHP 8.3 + FPM
- Nginx
- Composer
- Webroot:
public
Node.js (node)
- Node.js 20
- Nginx (reverse proxy ke port 3000)
- Yarn, pnpm
- Webroot:
.
Go (go)
- Go 1.22
- Nginx (reverse proxy ke port 8080)
- Webroot:
.
Python (python)
- Python 3.12
- Nginx (reverse proxy ke port 8000)
- Webroot:
.
Blank (blank)
- Ubuntu 24.04
- Nginx
- Webroot:
.
9. Services
| Service | Category | Description | Port |
|---|---|---|---|
| mariadb | database | MySQL-compatible RDBMS | 3306 |
| mysql | database | MySQL | 3306 |
| postgres | database | PostgreSQL | 5432 |
| mongodb | database | NoSQL document DB | 27017 |
| redis | cache | In-memory cache | 6379 |
| memcached | cache | Distributed cache | 11211 |
| mailpit | Email testing (SMTP + web UI) | 8025, 1025 | |
| mailhog | Email testing | 8025, 1025 | |
| phpmyadmin | admin | Database admin UI | 8080 |
| adminer | admin | Lightweight DB manager | 8080 |
| elasticsearch | search | Search engine | 9200 |
| rabbitmq | queue | Message broker | 5672, 15672 |
| beanstalkd | queue | Work queue | 11300 |
| apache | webserver | Apache HTTP server | 80 |
| varnish | cache | HTTP reverse proxy cache | 80 |
Service Detail
MariaDB (mariadb)
services:
mariadb:
enabled: true- Default DB:
app - Default User:
app - Default Password:
app
Redis (redis)
services:
redis:
enabled: true- Default Port: 6379
Mailpit (mailpit)
services:
mailpit:
enabled: true- Web UI:
https://mailpit.<project>.tavp.my.id - SMTP: port 1025
phpMyAdmin (phpmyadmin)
services:
phpmyadmin:
enabled: true- Web UI:
https://phpmyadmin.<project>.tavp.my.id
10. Tooling
Tooling commands run inside the container. Define them in .tavpbox.yml:
tooling:
artisan:
cmd: php artisan
composer:
cmd: composer
npm:
cmd: npm
npx:
cmd: npx
php:
cmd: php
test:
cmd: php artisan test
mysql:
cmd: mysql -u app -papp appUse them directly:
tavpbox artisan migrate
tavpbox composer install
tavpbox npm run dev
tavpbox test
tavpbox php --version
tavpbox mysql -u app -papp appDefault Tooling per Recipe
| Recipe | Tooling |
|---|---|
| tavp/laravel | artisan, composer, npm, npx, php, test |
| php | composer, php, test |
| node | npm, npx, yarn, pnpm, node |
| go | go |
| python | python, pip, pytest |
11. HTTP Only (Kenapa bukan HTTPS?)
TAVPBox menggunakan HTTP saja — tanpa HTTPS, tanpa certificate, tanpa complexity.
Kenapa HTTP?
| Alasan | Penjelasan |
|---|---|
| Simpel | Gak perlu setup certificate, gak perlu domain asli |
| Local dev | Traffic lokal, gak lewat internet — HTTP aman |
| Zero config | tavpbox start → langsung jalan |
| Lando-compatible | Sama seperti Lando — HTTP untuk local dev |
Akses
tavpbox create
# http://myproject.tavp.my.id → langsung jalanDNS *.tavp.my.id diarahkan ke 127.0.0.1 (localhost). Semua request ke *.tavp.my.id langsung ke proxy TAVPBox di port 80.
12. LAN Access
Akses project dari device lain di jaringan yang sama. Tanpa HTTPS, tanpa DNS — cukup http://[IP]:[port].
How it works
- Setiap project dapat fixed LAN port (8081, 8082, 8083, ...)
- Port di-assign otomatis saat
tavpbox create - Port mapping disimpan di
~/.tavpbox/lan-ports.json - Container publish port sebagai
-p 8081:80(bukan random)
Show LAN URLs
tavpbox exposeOutput:
🌐 LAN Access
┌─────────────────────┬──────────────────────────────────────┬───────┐
│ Project │ URL │ Port │
├─────────────────────┼──────────────────────────────────────┼───────┤
│ tavp-web-id │ http://192.168.18.160:8081 │ 8081 │
│ lula │ http://192.168.18.160:8082 │ 8082 │
│ koskosan │ http://192.168.18.160:8083 │ 8083 │
└─────────────────────┴──────────────────────────────────────┴───────┘
📋 Tambahkan ke hosts device lain (opsional):
192.168.18.160 tavp-web-id.tavp.my.id lula.tavp.my.id koskosan.tavp.my.idAkses dari device lain
- Buka browser di device lain
- Ketik:
http://192.168.18.160:8081 - (Opsional) Tambah hosts entry untuk domain access
Kenapa HTTP, bukan HTTPS?
| Masalah | Penjelasan |
|---|---|
| Simpel | Gak perlu setup certificate, gak perlu domain asli |
| Local dev | Traffic lokal, gak lewat internet — HTTP aman |
| Zero config | tavpbox start → langsung jalan |
Port assignment
| Project | LAN Port |
|---|---|
| Pertama | 8081 |
| Kedua | 8082 |
| Ketiga | 8083 |
| ... | ... |
| Terakhir | 8999 |
Port tersimpan di ~/.tavpbox/lan-ports.json dan stable (tetap sama meski restart).
13. Pre-built Images
TAVPBox pakai pre-built images untuk performa terbaik. Semua service udah terinstall di image, jadi tavpbox create instant.
Official Images
| Image | Recipe | Services |
|---|---|---|
ghcr.io/tavp-stack/tavpbox-php | tavp, laravel, php | Nginx, PHP 8.2, MariaDB, Redis, Mailpit, Node.js, Composer, Phalcon |
ghcr.io/tavp-stack/tavpbox-node | node | Nginx, Node.js 20 |
ghcr.io/tavp-stack/tavpbox-go | go | Nginx, Go 1.22 |
ghcr.io/tavp-stack/tavpbox-python | python | Nginx, Python 3.12 |
Custom Images
Developer bisa build custom image dari container yang lagi jalan:
# Install custom packages di container
tavpbox ssh
apt-get install -y php-imagick ffmpeg
exit
# Build image
tavpbox image build --name my-php-custom
# Push ke registry
tavpbox image push ghcr.io/myuser/my-php-custom:latest
# Pakai di .tavpbox.yml
echo "image: ghcr.io/myuser/my-php-custom:latest" >> .tavpbox.yml
tavpbox create # instant!Image Commands
| Command | Description |
|---|---|
tavpbox image build | Build custom image dari container |
tavpbox image push <image> | Push image ke registry |
tavpbox image pull <image> | Pull image dari registry |
tavpbox image list | List local images |
14. Web Panel
tavpbox panel
# Opens http://localhost:8080Features
- Dashboard — semua project dengan status
- Create Project — wizard buat project baru
- Project Detail — logs, URLs, DB credentials
- Service Management — start/stop/restart
- Recipe Browser — lihat semua recipes
- Service Browser — lihat semua services
Custom Port
tavpbox panel -p 3000Stop Panel
tavpbox panel:stop15. Proxy
TAVPBox punya embedded reverse proxy (HTTP :80 saja).
Commands
tavpbox proxy:start # Start proxy
tavpbox proxy:stop # Stop proxy
tavpbox proxy:status # Status + routesAuto-start
Proxy auto-start saat tavpbox create.
Routes
Proxy routes di ~/.tavpbox/proxy/routes.json:
[
{
"domain": "my-app.tavp.my.id",
"ip": "127.0.0.1",
"port": 35941
},
{
"domain": "mailpit.my-app.tavp.my.id",
"ip": "127.0.0.1",
"port": 35219
}
]16. Config
Global Config (~/.tavpbox/config.yml)
tavpbox config list domain_suffix: tavp.my.id
default_ram: 512MB
default_cpu: 1
default_image: docker.io/library/ubuntu:24.04
panel_port: 8080
default_tz: Asia/JakartaSet Config
tavpbox config set domain_suffix tavp.my.id
tavpbox config set default_ram 1024MB
tavpbox config set default_tz Asia/JakartaGet Config
tavpbox config get domain_suffixTimezone
Default timezone untuk semua container adalah Asia/Jakarta. Bisa di-change via config:
tavpbox config set default_tz Asia/MakassarEvents
Events auto-dijalankan saat container create/start. Support post-start:
events:
post-start:
- mkdir -p storage/app/framework/cache
- mkdir -p storage/logs
- mkdir -p storage/framework/{sessions,views,cache}
- chown -R www-data:www-data storage bootstrap/cache17. Multi-Platform
| Platform | Architecture | Binary |
|---|---|---|
| Windows | amd64 | tavpbox-windows-amd64.exe |
| macOS | amd64 | tavpbox-darwin-amd64 |
| macOS | arm64 (M1/M2) | tavpbox-darwin-arm64 |
| Linux | amd64 | tavpbox-linux-amd64 |
| Linux | arm64 | tavpbox-linux-arm64 |
Cross-compile
make cross
# Output: dist/tavpbox-{os}-{arch}18. Architecture
tavpbox (Go binary)
├── CLI (cobra)
│ ├── init, create, start, stop, restart, destroy, rebuild
│ ├── ssh, list, info, logs, expose
│ ├── tooling (dynamic subcommands)
│ ├── panel (web UI)
│ ├── proxy (reverse proxy management)
│ └── config (configuration)
├── Podman client (exec wrapper)
│ ├── Create, Start, Stop, Restart, Remove
│ ├── Exec, ExecInteractive, Copy
│ ├── GetIP, GetHostPort, Exists
│ ├── List, Inspect, Logs
│ └── NetworkCreate, NetworkConnect
├── Embedded Go proxy
│ ├── HTTP :80 (HTTP only, no HTTPS)
│ ├── LAN ports :8081-8999
│ ├── Dynamic routes (routes.json)
│ └── httputil.ReverseProxy
├── LAN port manager (fixed ports per project)
│ ├── Auto-assign (8081-8999)
│ ├── Port mapping (lan-ports.json)
│ └── Release on destroy
├── Service library (15 services)
│ ├── Database: mariadb, mysql, postgres, mongodb
│ ├── Cache: redis, memcached, varnish
│ ├── Mail: mailpit, mailhog
│ ├── Admin: phpmyadmin, adminer
│ ├── Search: elasticsearch
│ ├── Queue: rabbitmq, beanstalkd
│ └── Webserver: apache
├── Recipe library (7 recipes)
│ ├── tavp, laravel, php
│ ├── node, go, python
│ └── blank
├── Lando parser (.lando.yml)
│ ├── Service mapper
│ ├── Tooling mapper
│ ├── Environment mapper
│ ├── Events mapper (post-start)
│ ├── Proxy mapper
│ └── Build/run executor
├── Auto-detect recipe (composer.json/package.json/go.mod/requirements.txt)
├── Nginx config writer (via podman cp — avoids $ escaping)
├── Plugin engine (~/.tavpbox/plugins/)
└── API server (REST + embedded panel)
├── GET /api/health
├── GET /api/projects
├── GET /api/projects/{name}
├── POST /api/projects
├── POST /api/projects/{name}/start
├── POST /api/projects/{name}/stop
├── POST /api/projects/{name}/restart
├── DELETE /api/projects/{name}
├── GET /api/projects/{name}/logs
├── GET /api/recipes
└── GET /api/services19. Troubleshooting
Podman not found
Install Podman Desktop: https://podman-desktop.io
# Windows
winget install RedHat.PodmanDesktop
# macOS
brew install podman
# Linux
sudo apt install podmanContainer already exists
tavpbox destroy
tavpbox createPort already in use
tavpbox proxy:stop
tavpbox proxy:startDomain not resolving / "No project configured"
# Cek proxy routes
tavpbox proxy:status
# Jika routes kosong, rebuild dari semua container
tavpbox start --all
# Atau start dari masing-masing project folder
cd ~/projects/my-app
tavpbox startNote: Pastikan menggunakan TAVPBox ≥ v0.12.1 yang memperbaiki bug
start --alltidak registrasi routes (#10).
Container won't start
tavpbox logs
# Cek error di logsLando migration issues
# Cek config
tavpbox info
# Rebuild
tavpbox rebuild20. FAQ
TAVPBox vs Lando?
TAVPBox pakai Podman (bukan Docker), lebih irit RAM, dan punya web panel. Lando pakai Docker.
TAVPBox vs Docker?
TAVPBox pakai Podman (rootless, daemonless), lebih ringan, dan punya auto-domain + auto-detect recipe.
Bisa pakai Docker?
Belum. TAVPBox pakai Podman. Docker support coming soon.
Bisa di Windows?
Ya. Pakai Podman Desktop.
Bisa di macOS?
Ya. Pakai Podman (brew install podman).
Bisa di Linux?
Ya. Pakai Podman (apt install podman).
HTTPS?
TAVPBox menggunakan HTTP saja — tanpa HTTPS complexity. Untuk local development, HTTP sudah cukup aman karena traffic lokal.
Bisa migrasi dari Lando?
Ya. Cukup jalankan tavpbox create di folder yang ada .lando.yml.
Bisa pakai domain sendiri?
Ya. Set domain_suffix di config:
tavpbox config set domain_suffix mydomain.com21. Links
- GitHub: https://github.com/tavp-stack/tavpbox
- Gitea: https://git.glotama.com/tavp-stack/tavp-box
- Issues: https://github.com/tavp-stack/tavpbox/issues
- Docs: https://docs.tavp.web.id/guide/tavpbox
- Releases: https://github.com/tavp-stack/tavpbox/releases
License
MIT
