Corporate organizational chart built with Go (backend) and React + Vite + Tailwind (frontend), fully dockerized with Docker Compose.
This project provides:
- Go backend with GORM + SQLite
- React (Vite + Tailwind) admin frontend
- Hierarchical employee visualization (org chart)
- CRUD for teams and employees
- Simplified deployment with Docker
-
Teams
- Create teams
- List teams
-
Employees
- Create employees
- Edit employees
- Assign to teams and managers
- List employees in a table
- Visualize hierarchy
-
Infrastructure
- Persistent SQLite database
- Separate containers for backend (API) and frontend (Nginx)
- Internal proxy via Nginx (
/api/→ backend)
orgChart/
├── backend/ # Go backend
│ ├── cmd/server/main.go # API entrypoint
│ ├── internal/ # models, db, logic
│ ├── go.mod / go.sum
│ └── Dockerfile # API Dockerfile
│
├── web/ # React frontend
│ ├── src/ # React components
│ ├── public/
│ ├── package.json
│ ├── nginx.conf # frontend → backend proxy
│ └── Dockerfile # frontend Dockerfile
│
├── data/ # SQLite persistent volume
│ └── (orgchart.db)
│
├── docker-compose.yml # Compose orchestration
└── README.md # This file
cd backend
go run ./cmd/serverDefault API runs at http://localhost:8080/api/v1
cd web
npm install
npm run devDefault frontend runs at http://localhost:5173.
Configure VITE_API_URL in .env if the API is hosted elsewhere.
From project root:
docker compose up --build- Frontend: http://localhost:8080
- API: http://localhost:8080/api/v1
api: Go + SQLite (volume mounted at./data)web: Nginx serving React, proxying requests toapi
SQLite database (orgchart.db) is stored in ./data on the host and mounted inside the container.
DB_PATH— path to SQLite database (default:/data/orgchart.db)
VITE_API_URL— base API URL (default:/api/v1when using docker/nginx)
GET /api/v1/healthz
GET /api/v1/teams
POST /api/v1/teams
GET /api/v1/employees
POST /api/v1/employees
PUT /api/v1/employees/:id
DELETE /api/v1/employees/:id
You can create backend/internal/db/seed.go to insert initial data (teams/employees) and call it in Init() if the database is empty.
- Authentication (JWT)
- Employee avatar upload
- Automated deployment (Render, Railway, etc.)
- Unit and integration tests
- @vernieri — Original project and maintenance