Open-source 2D rectangular guillotine cutting stock optimizer for woodworkers, makers, and other
Live Demo • Quick Start • API Documentation • Frontend Documentation • Contributing
Built by a carpenter for the workshop: OpenCutter is a fast, 100% open-source 2D panel cut optimizer that delivers clean, practical saw layouts without paywalls, subscriptions, or accounts.
Given a list of required target pieces and available stock sheets (plywood, MDF, sheet metal, acrylic, glass), OpenCutter computes the most material-efficient cut layout to minimize waste.
All cuts are guillotine cuts (edge-to-edge straight cuts suitable for table saws, panel saws, and shears).
You can use OpenCutter right now! https://opencutter.com
- True Guillotine Cutting: Generates practical, edge-to-edge cuts.
- Grain Direction Awareness:
- Fixed Orientation: Respects wood veneer grain direction (pieces cannot be rotated).
- Free Orientation: Rotates pieces 90° when beneficial to maximize yield.
- Saw Kerf Allowance: A cut margin to account for material lost to blade width.
- Visual Cut Diagrams: Interactive SVG preview displaying placed pieces, cut lines, and reusable off-cuts.
- PDF Export: Export cutting diagrams directly to printable PDF.
- Mobile & Tablet Ready: Fully responsive design with touch.
- Spreadsheet Import: Import piece cut lists from
.ods(See example list from Tutorial View). - Dual Language: Supports German and English.
- One-Command Docker Deployment: Production-ready container images published to Docker Hub.
You can run OpenCutter instantly with Docker Compose.
Download the deploy/compose.yaml file from the latest release and run:
# Start pre-built images
docker compose -f deploy/compose.yaml up -d# Clone repository
git clone https://github.com/clpter/opencutter.git
cd opencutter
# Build and launch both API and Website
docker compose up --build -dOnce started, open:
- Web UI: http://localhost (or configured
WEBSITE_PORT) - API Service: http://localhost:8080 (or configured
API_PORT)
By default, Docker Compose binds both services to 127.0.0.1 (localhost). You
can customize the bind addresses and ports with environment variables:
| Variable | Default | Description |
|---|---|---|
WEBSITE_HOST |
127.0.0.1 |
Bind IP for the frontend (use 0.0.0.0 for public or LAN access) |
WEBSITE_PORT |
80 |
Host port for the frontend |
API_HOST |
127.0.0.1 |
Bind IP for the API (not needed because requests are proxied internally by the frontend) |
API_PORT |
8080 |
Host port for the REST API |
Example:
# Expose the website to your LAN or public server on custom port 3000
WEBSITE_HOST=0.0.0.0 WEBSITE_PORT=3000 docker compose up -dWant to develop, run test suites, or run OpenCutter from source without Docker?
See our Contributing Guide for local developer setup (JDK 21, Maven, Node.js), architecture rules, and testing instructions.
.
├── API/ # Spring Boot Java REST API
│ ├── src/ # Source Code
│ ├── pom.xml # Maven build definition
│ └── Dockerfile # Container build script
│
├── Website/ # React + TypeScript + Vite Web Application
│ ├── src/ # Source Code
│ ├── package.json # Node dependencies & scripts
│ └── Dockerfile # Container build script (Nginx)
│
├── deploy/
│ └── compose.yaml # Production Docker Compose (uses published images)
│
├── docs/
│ └── assets/ # Documentation screenshots and media
│
├── compose.yaml # Docker Compose for local build
├── CONTRIBUTING.md # Guidelines for contributors
├── LICENSE # GNU General Public License v3.0 (GPLv3)
└── README.md # Project landing page
OpenCutter can be integrated via its JSON REST API:
POST /api/cut_1: Fixed orientation (respects grain direction)POST /api/cut_2: Free orientation (rotates pieces 90° if needed)
This project is licensed under the GNU General Public License v3.0 (GPL-3.0). See the LICENSE file for details.

