Skip to main content

What's new

Latest CutOptim releases, new features, improvements and bug fixes in one place — see what's new across the cutting optimizer, exports and the calculator tools.

RSS
Feature

Roof calculator: hip roofs and L-shaped roofs

The roof framing calculator now also does hip roofs and L-shaped gable and hip roofs: hip, jack, valley and valley jack rafters with their cuts, battens on every plane, an order list with shared mitre cuts, and the angles carried into Wood mode.

The rafter length calculator has three new shapes beside gable and shed: hip roof, L-shaped gable roof and L-shaped hip roof. A shape button loads its example for your market; then enter your own numbers. On an L the wing has the same span and pitch as the main block.

  • Cut list: hip rafters, jack rafters (left and right), valley rafter and valley jacks, each with its length, plumb cut and side cut; on metric profiles counter battens and tile battens on every roof plane, ending on the hip or valley line.
  • Drawings: the top view numbers every rafter with its cut list row, and a new Hip detail view draws the hip rafter and the longest jack with their side cuts. Print / PDF includes it.
  • Order list: with Shared mitre cuts on, two pieces whose angled ends match share one saw cut. Both results are computed, so the other one is shown next to it.
  • Optimize in the app: the list arrives in Wood mode with every piece’s end cuts, and the shared-cuts switch as you left it.

Still geometry only: hip and valley rafters carry the jacks, so their section is a structural question too.

Feature

Tiles in Surface mode: a floor and its walls in one project

Surface mode now plans tiles too: a bathroom floor and walls in one project, openings you drag into place, one row height round the room, a setting-out sheet and an order list in boxes.

The app’s Surface mode has a second sub-mode: Pavers | Tiles. Tiles plans a room as one project:

  • Surfaces: the floor and walls 1–4, made from the room’s width, depth, tiled height and door; add walls or remove them. On a wall, drag a window, door or bath on the drawing to place it.
  • One row height on every wall (on by default): the horizontal joints run round the room. The app also lays the project the other way and shows both tile counts, so you see what it costs.
  • Setting-out sheet: per surface, the bottom of the first full row above the floor and the first vertical joint from the left corner, on screen and in the PDF.
  • Order list per tile: tiles per surface, reserve, boxes and m² bought; pallets and weight only when the datasheet states them. Offcuts are reused across surfaces when that saves tiles.

The tile calculator hands its floor or wall over with Plan the whole bathroom in the app. Tile projects save to your projects like paver plans, and paver plans open as before. Details: Surface mode.

Feature

Tile calculator: layout, cut pieces and boxes for a floor or a wall

New calculator for one floor or one wall: pick a tile and a pattern and see every cut piece numbered, which tile it comes from, where the first row starts and how many boxes to buy.

The new tile calculator lays your tile over your actual floor or wall instead of dividing square feet:

  • Your surface: a floor as a rectangle or L-shape, or a wall with windows, a door or a bath as openings.
  • Your tile: from the market’s catalogue — real size, minimum joint and box contents from the manufacturer’s datasheet — or your own size and joint.
  • Your pattern: straight, running bond (½, ⅓ or ¼), herringbone or basket weave, along the edge or at 45°.

It numbers every cut piece and shows which tile it is cut from, gives the height of the first full row and the place of the first vertical joint, and turns the count into whole boxes; pallets and weight appear only when the datasheet states them. It plans one surface at a time and runs in your browser without freezing the page. It is available in all ten languages of the site.

Feature

Angle cuts and shared mitre cuts in Wood mode

Wood parts can now have angled ends (face and edge angle). With Shared mitre cuts on, two parts whose angled ends match are separated by one saw cut, so the wedge between them is not wasted. Off by default.

Each row in Parts to cut of Wood mode now has an ∠ cell: set the face angle (the mitre) and the edge angle (the bevel) at the start and at the end of the part, measured from square, and say whether the piece may be turned. Angles alone leave the plan as it was; the cut list, the sawing plan and the PDF, Excel, CSV and DXF exports show them, and the sawing plan counts the extra pass an angled end needs.

Switch on Shared mitre cuts in Settings and the optimizer may lay two parts whose angled ends match next to each other, so that one saw cut separates them and the wedge between them is not wasted. It keeps such a plan only when it is strictly better than the plan without shared cuts. The bar strip draws the shared cut as one oblique kerf band and marks a turned piece with ↻. Details: Wood cutting mode.

Improvement

The app's guided tour now shows today's app

The first-visit tour walks through nine areas of today's app, from the Surface tab to Shop mode, and a window that opens during the tour can be clicked again.

The short tour that opens on your first visit to the app has been rewritten for the app as it is today. Its nine steps cover the mode tabs (2D, 1D and Surface, with the Panel / Nesting and Linear / Wood cutting sub-tabs), Settings (CNC mode and More), the stock table (the 📦 material inventory, Limited supply and ★ priority), the parts table (the Grain icon and the furniture, fence and roof-framing templates), Run optimizer, the cutting plan (demo data and Shop mode), Downloads, Share & Print and the Projects folder. The two steps on the material-mode switch and the off-cut auto-reuse checkbox were dropped to keep it short.

Also fixed: a window that opened while the tour was running — for example the sign-in prompt after a session ended — could not be clicked. To see the tour again, use Restart tour in your dashboard. How it works: Interface Overview.

Improvement

Roof framing calculator: side view, top view and drag-to-edit

The rafter length calculator now draws the roof as a side view and a top view from its own cut list. Drag a handle or click a dimension to change the roof; Recalculate stays in view.

The rafter length calculator now shows the whole roof, not only the rafter.

Three drawings, all from the cut list

  • Side view: a section across the span — both rafters with the bird’s mouth and the plumb cuts, the ridge, collar ties, counter battens and every batten row.
  • Top view: every rafter at its spacing, the barge rafters, the ridge with its joints, the collar ties and the batten rows with each joint on a rafter.
  • Rafter detail: the rafter as cut, with the cut length and both angles.

Every member is placed from the cut list the calculator builds, so the drawing and the list cannot disagree. Span, length, pitch, overhangs, spacing, rafter length and rise are dimensioned.

Edit on the drawing

Drag a gold handle — pitch, span, eaves and gable overhang, building length, collar height — and the roof updates as you move. Lengths snap to 10 mm (1 in on the US setting) and the pitch to 0.5° (½ in 12). Or click a dimension and type the value. A focused handle also moves with the arrow keys. The form stays in sync.

Print / PDF puts the side view, the top view, the inputs, the cut list and the order list on one A4 sheet; the browser’s print dialog also saves it as a PDF. If the inputs changed since the last calculation, the sheet asks you to recalculate instead of printing an outdated order list.

Recalculate stays in view

On a wide screen the drawing and the Recalculate order list button stay beside the form while you scroll it; on a phone the button stays at the bottom of the screen. The daily allowance is unchanged; the calculator is still geometry only, with no structural sizing.

Improvement

Surface mode now works like the 2D / 1D app

Surface mode got the app's layout: the result stays in view while you edit, Calculate stays at the bottom of the form, and metres / feet is a compact switch.

Surface mode now has the same layout as the 2D and 1D app. On a computer the form and the result scroll separately, so the plan stays in view while you change the inputs. Calculate stays at the bottom of the form, and Save, Print / PDF and CSV sit in a bar at the top of the result. Metres / feet is a small switch in the Area header. On a phone, Calculate is pinned to the bottom of the screen, and the page jumps to the result after you press it. The drawing canvas now shows every area shape: drag a corner of the rectangle, L-shape or side list and the area becomes a drawing that starts from that outline. On the paver calculator page the area is now drawn with its side lengths as you type, and on a computer the result stays in view while you scroll the form. The drawing zooms in on the shape, Ctrl+Enter presses Calculate, and on a computer you can drag the line between the form and the result to change the form’s width. The paver size list now has a Format label, and the calculator page has the compact metres / feet switch too.

More: Surface mode.

Improvement

The manhole now shows in the area drawing

The manhole / obstacle appears in the area drawing as a hatched square with its size and position; in the app you can drag it to move it.

When Manhole / obstacle is ticked, the area drawing shows it as a hatched square, with its size and its distances from the left and bottom, on the paver calculator page and in the app’s Surface mode. In the app you can grab it in the drawing and drag it: it snaps to the 10 cm (6 in) grid, stays inside the area, and its position fields follow. The area shape does not change.

More: Surface mode.

Feature

A real PDF for paver plans

Surface mode's Print / PDF is now a PDF with a preview, like the 2D and 1D cutting plan: dimensioned area, laying plan, numbered cut pieces, material summary.

Print / PDF in Surface mode now makes a real PDF, with the same look and the same preview as the 2D and 1D cutting plan. It holds the area with every edge length and the manhole’s size and position, the laying plan with the numbered cut pieces (detail pages when a number does not fit on the overview), the cut piece list with the paver each piece comes from, one card per cut — pavers cut the same way share a card with a ×N badge, as identical sheets do in the 2D PDF — the material summary — pallets and weight only when the manufacturer’s datasheet states them — and the kerb stones by edge.

⚙ Export & drawing beside the preview chooses the sections, piece numbers, edge dimensions and text size; Black & white PDF has its own button, as in 2D and 1D. Signed in, the PDF carries your company name and logo. The paver calculator page gets the same PDF. How it works: Surface mode.

Feature

Surface mode: projects panel, the full plan on screen, light and dark

Surface mode gets the 2D/1D app's Projects panel, shows everything the PDF prints below the plan, and follows the site's light or dark theme.

Surface mode now has the Projects panel of the 2D and 1D app: open a 🧱 Surface plan from it, start a project or a new cut from the plan on screen, rename and delete. Below the plan you now see everything the PDF prints, with the same numbers — how the plan was optimized, the plan check, the material summary, the area and its edges, which piece comes from which paver (identical cuts grouped as ×N), the cut piece list and the kerb stones by edge. The page, the drawings and the PDF preview follow the light or dark theme. The pavers are small cards drawn at one scale; filter them by kind of cut and click or tap a card to see it large.

More: Surface mode.

Feature

Save Surface plans to your projects

Paver plans made in Surface mode can now be saved to projects on Pro and Workshop and reopened from the app's project list.

Paver plans made in Surface mode can now be saved. Save under the result puts the plan into one of your projects or a new one; it shows in the project list with a 🧱 icon and opens back in Surface mode with your inputs, recalculated — opening a saved plan is not a run. Save as new keeps a copy.

Saving projects is part of Pro and Workshop, as in 2D and 1D; without it, Print / PDF and CSV keep a plan. How it works: Surface mode.

Feature

Engine API: the MCP server as a local npm package

The CutOptim MCP server now also runs on your machine: npx -y @cutoptim/mcp with your API key. Simplest setup for Claude Desktop, and listed in the official MCP Registry.

One for developers. If you just cut in the app, nothing changed.

The MCP server from yesterday now has a local twin: the open-source npm package @cutoptim/mcp. Your AI assistant starts it with npx, it reads your key from CUTOPTIM_API_KEY and calls the same API — same tools, same quota, one tool call is one API call. No bridge needed, so it is the simplest setup for Claude Desktop:

{
  "mcpServers": {
    "cutoptim": {
      "command": "npx",
      "args": ["-y", "@cutoptim/mcp"],
      "env": { "CUTOPTIM_API_KEY": "co_test_YOUR_KEY" }
    }
  }
}

Both the hosted server and the package are listed in the official MCP Registry as io.github.cutoptim/engine. Setup for each assistant is in the MCP guide.

Feature

Paver calculator: layout, cut pieces and order list

New calculator for patios and paths: draw the area, pick a paver and a pattern, and see every cut piece numbered, which paver it comes from, the kerb stones and the order list.

Planning a patio used to mean a square-footage count and a guess at the waste. The new paver calculator lays the pattern over your actual area instead:

  • Your area: a rectangle, an L-shape or any outline as a list of sides, with a manhole cut out.
  • Your paver: from the market’s catalogue (sizes from the manufacturer’s datasheet) or your own size and joint.
  • Your pattern: stack, running bond, herringbone or basket weave, along the edge or at 45°.

It picks the start point so both edges are cut alike, numbers every cut piece and shows which paver it is cut from — two slanted herringbone pieces often share one. Factory half stones are used where they fit, kerb stones are counted along the edges you mark, and pallets and weight appear only when the datasheet states them. It runs in your browser; without an account you get 2 calculations a day.

Feature

Roof framing template: rafter length, cut angles and the lumber list

A rafter length calculator for gable and shed roofs: the rafter length to cut, plumb and seat cut angles, the bird's mouth, and an optimized lumber list that opens in Wood cutting mode.

Framing a roof starts with one number — how long to cut the rafters — and it is easy to get short: the two plumb cuts at the ends make the board longer than the line length you get from the pitch.

The new rafter length calculator works it out from what you measure: span, building length, pitch, eaves and gable overhang, rafter spacing and rafter size.

What you get

  • The rafter length to cut, rounded up to the whole millimetre, with the plumb cut and seat cut angles and the bird’s mouth (heel height and notch depth), drawn to scale.
  • The whole roof as a cut list: common rafters, barge rafters, ridge, collar ties, counter battens and tile battens, each with its cross-section.
  • Battens joined only over a rafter: every piece is a whole number of rafter spacings, spans at least three rafters, and the joints move along from row to row.
  • An optimized lumber list: the pieces packed into the stock lengths you buy, with the waste.

On the English page you switch between US (feet-inches, pitch as x/12, 2x lumber) and UK (millimetres, degrees, BS 5534 batten rules); the other languages use metric inputs.

Into the app

Optimize in the app carries the cut list into Wood cutting mode, with one stock row per cross-section. Inside the app, a Roof framing template row under the Parts to cut header of Wood cutting mode opens the calculator.

The calculator is free; without an account it allows 2 calculations a day. It is geometry only: it does not size rafters or check spans, snow or wind — the page links your market’s rules instead.

Update 23 October 2026: in Wood cutting mode the template also shows as a highlighted card in the empty results area, the twin of the fence card in linear mode.

Feature

Surface mode in the app: pavers next to 2D and 1D

The paver calculator is now a mode of the app: a Surface tab next to 2D and 1D, with a drawing editor, Print / PDF and normal run counting.

The paver calculator now has a home in the app. The mode switcher has a third tab, Surface, next to 2D and 1D; it opens on its own page and does everything the calculator does, plus:

  • Draw: a fourth way to enter the area — click the corners on a 10 cm (or 6 in) grid, with a Right angles lock, Undo and Clear.
  • Print / PDF: one printable page with the plan, the order list and every cut sheet.
  • Open in the app: a plan made on the calculator page carries over.

Each Calculate counts as one run on your plan, like a 2D or 1D run. Surface plans cannot be saved to projects yet — keep them with Print / PDF or CSV. How it works: Surface mode.

Update 23 October 2026: Surface plans can now be saved to projects on Pro and Workshop.

Improvement

The API keys card is now on every Dashboard

Signed in to get a free Engine API test key? The API keys card is now always on your Dashboard: one click creates a test key with 1,000 calls a month, never billed.

Developers who signed in looking for a free Engine API test key could not find the API keys card: it only showed up after subscribing.

Now the card is always on your Dashboard. Create a free test key in one click (1,000 calls a month, never billed), with links to the Quickstart, the official SDKs (TypeScript, Python, PHP) and the Studio plan’s free trial. Live keys still need a subscription. Details: Engine API.

Feature

Engine API: an MCP server for AI assistants

Claude Code, Cursor, VS Code and Claude Desktop can now call the cutting engine as tools: one server URL, your API key, the same quota as the REST API.

One for developers. If you just cut in the app, nothing changed.

The Engine API now has a hosted Model Context Protocol server at https://api.cutoptim.com/mcp. Add it to your AI assistant once, and it can plan cuts from a chat: panels (optimize_2d), bars (optimize_1d), timber (optimize_wood) and true shapes (optimize_nest), plus free validate_* checks, get_job and get_usage.

It uses the API key you already have and the same quota: one tool call is one API call, and the validate_* tools cost nothing. The public demo key works for small 2D, 1D and timber jobs.

Setup for each assistant is in the MCP guide.

Fix

Team members can save in shared projects

A team member who opened the owner's shared project could not save into it — every save showed a save error. Fixed.

In a Team Workspace, a member who opened a project the owner had saved could not save into it: updating a cut or saving it as a new cut ended in a save error. The server still checked that the person saving owned the project. Now every member can save cuts into the shared projects, as the Team Workspace article describes. Deleting a project or a cut stays with the owner.

Improvement

Every calculator now opens with a button into the full app

A full-width button at the top of every calculator takes your parts straight into the full app. The calculator's own Optimize button sits under the inputs, and on a phone the page scrolls to the result.

The calculator pages now start with one clear way into the full app: a full-width button at the top that carries your parts, sheets and kerf over, so nothing has to be retyped. The quick calculation stays on the page — its Optimize button is under the parts table, and on a phone the page scrolls to the cutting plan after a run. The furniture cut lists (base cabinet, bookshelf, TV stand, wardrobe) now open with the generator and the same button at the top.

Release

CutOptim Configurator is available

Cut-to-size shops can now embed CutOptim Configurator in their own webshop: live cutting plan, signed price, ordering console. Free sandbox, then Starter.

CutOptim Configurator is now available for cut-to-size shops. It is a separate product from the CutOptim app: a configurator you embed in your own webshop, so your customers can enter their parts, see the cutting plan and your price as they type, and order, without e-mailing you a cut list.

You set the boards and your own price rules (per sheet, per m², per metre of cut, edge banding, machining, surcharges, minimum order, customer groups, VAT). The price is signed on the server, so it cannot be changed in the browser, and the order reaches your shop by a signed webhook and by e-mail with worksheet and label PDFs. You manage orders, statuses and production files in the console. It covers 2D panel cutting, and there is a WooCommerce plug-in in early access. CutOptim collects no payment: your shop keeps the cart and the checkout.

Packages: start with a free sandbox to load your own boards and prices, then Starter, billed monthly and excluding VAT, or Enterprise on request. The current prices are on the pricing page.

Read the Configurator page, try the live demo, or go straight to the API reference.

Feature

Engine API: official SDKs for TypeScript, Python and PHP

Call the Engine API through npm, PyPI or Composer: typed, dependency-free clients with safe retries, waiting for async jobs and webhook verification built in.

One for developers. If you just cut in the app, nothing changed.

The Engine API now has official clients — open source, MIT-licensed, with no dependencies:

  • TypeScript / JavaScript: npm install @cutoptim/engine
  • Python: pip install cutoptim
  • PHP: composer require cutoptim/engine

They are typed from the same OpenAPI document as the reference, send an Idempotency-Key with every optimize call so a retry is never charged twice, wait for async max jobs for you and verify webhook signatures. The SDKs are optional: plain HTTPS keeps working.

Source on GitHub, details in the SDK guide; the Quickstart shows the same request through all three.

Feature

Search harder for the last parts

With Limited stock and parts left over, the Not enough stock block now has a Search harder (up to 30 s) button: a stronger solver tries to fit more parts on the same boards. The plan changes only if more parts fit. Free account needed, no run counted.

When Sheet supply is Limited and a 2D Panel run leaves parts over, the Not enough stock block under the plan now has a Search harder (up to 30 s) button. It runs a stronger solver (PackingSolver, an open-source optimizer) on our server on the same parts, boards, kerf and trims (the ★ board priority and the cost or rotation goals are not used by this search). You see a timer (or your place in the queue) and a Stop — keep my plan button, and the rest of the app stays usable. In CNC mode (free placement) it searches free layouts, otherwise saw-cuttable (guillotine) ones. Your plan changes only if the search places more must-cut (priority) parts, or the same must-cut parts and more parts in total: then the plan, sheet stats, cutting sequence and every export update. It needs a free account and does not use up a run; it is not offered in Material mode, for grain-matched sets or when no part was left over for lack of stock.

One real job: a CNC shop whose other nesting program fit 197 parts on its 21 boards, where CutOptim fit 196. In CNC mode, Search harder placed all 197 in about 20 seconds; the saw-cuttable search placed 195 where the normal saw plan placed 185. It is not always better: on some jobs it finds nothing more, and then nothing changes.

Feature

A public status page

One page shows whether the website, the Engine API, the nesting engine and the async max engine are up — hosted outside our servers, so it stays up when they don't.

Is CutOptim down, or is it my connection? Now there is one place to check: the status page shows the website, the Engine API, the nesting engine and the async max engine, each live, and any incident we post.

It runs outside our servers on purpose, so it keeps working when they don’t. You find it in the footer and in the Engine API docs menu.

Improvement

Team invitations now arrive by e-mail

Inviting a colleague to your Workshop team now e-mails them a Join the team link. No account yet? One is created and they choose a password.

A Workshop customer added a colleague to their team, and the colleague never heard about it: the invitation only waited quietly in the colleague’s Dashboard. Now, when you add someone under Team management on the Dashboard, CutOptim e-mails them an invitation naming you and your team, with a Join the team button.

  • They already have an account: they click the button, sign in with that address (password or Google) and are in.
  • They have no account yet: you no longer get “User not found”. An account is created for the address, and after clicking the button your colleague chooses a password and joins.
  • Nothing happens without them: the invitation grants nothing until they click, and the link works for 14 days.

In your member list you now see each person’s name and e-mail address, when a pending invitation expires, and two buttons: Resend (a fresh link) and Withdraw. Details: Team Workspace.

Improvement

The calculators open on a ready example

The cut list, board, panel, plywood, linear and wood calculators now sit right under the page title and open with an example job, so one click shows a cutting plan. Your parts go with you into the full app or a free account.

Until now the calculator pages showed a button to the app first and an empty parts table further down. Now the calculator is the first thing on the page, filled with an example (a base cabinet on the sheet calculators, a shelving frame on the linear ones): press Optimize and the plan is there. Change the sizes or replace the parts for your own job. Under the result, Open this plan in the full app carries your parts, sheets and kerf over, and a free account adds DXF export, your logo on the PDF and part labels — the job is waiting in the app after you sign up.

Improvement

Engine API: meta follows its own row, and a worked example for labels and planHash

On a 2D result each placed piece now carries the meta of the request row it came from, even when two rows share a name and size. The reference shows a worked example for include labels and planHash.

One for developers. If you just cut in the app, nothing changed.

meta follows the row it was sent on

On POST /v1/optimize/2d, two rows with the same name and size but different meta used to give every placed piece the meta of the last of those rows. Since 2026-10-05 each piece carries the meta of its own row. Requests whose rows differ in name or size were never affected.

A worked example for labels and planHash

The API reference now shows a request with include: ["labels", "planHash"] and the two keys it adds to the response. Like every include list, it narrows the response: cutPlan and offcuts come back only if you list them too.

Feature

Engine API: webhooks for async max jobs

Register a webhook endpoint on your dashboard and get a signed POST when an async max job finishes, instead of polling GET /v1/jobs/{id}.

One for developers. If you just cut in the app, nothing changed.

Async max jobs take seconds to a minute. Until now you polled GET /v1/jobs/{id} to find out when one was ready. Now you can be told:

  • register up to 5 https:// endpoints on your dashboard, for live keys, test keys or both;
  • when a job finishes you get a signed POST — job.succeeded or job.failed — and read the plan with GET /v1/jobs/{id};
  • verify CutOptim-Signature with your secret; failed deliveries are retried 8 times over 24 hours, and the dashboard shows 30 days of deliveries.

Details and verification code in the webhooks guide.

Feature

The app in Lithuanian and Portuguese

The app now speaks Lithuanian and Portuguese (Brazil): pick Lietuvių or Português in the language menu. The homepage, pricing, six calculators, two guides and the Configurator and Engine API pages are translated too; the rest of the site stays in English for now.

Pick Lietuvių or Português in the language menu and the whole app switches — the tables, the results, the PDF, Excel and sticker exports. Prices stay in euros.

The website follows step by step. Translated now: the homepage, pricing, six calculators, two guides, and the CutOptim Configurator and Engine API pages. Every other page opens in English, and the language menu offers Lithuanian or Portuguese only where a translated page exists.

Improvement

Thicker lines on label-printer stickers

A label printer could not print the thin outline of the small drawing on a sticker. Label printer mode now draws it thicker and black, and the Label format panel has a switch for it.

A customer printing on a label printer reported that the thin lines of the small drawing on the sticker did not come out: only the thick edge-banding band printed, the outline of the unbanded edges was missing.

The Label format panel of the label preview (the ⚙ button) now has a Thicker lines in the drawing (for label printers) switch. It draws the outline of the unbanded edges and the grain arrows black and about twice as heavy. It is on by default in label-printer mode and off on the A4 sheet, so A4 labels look exactly as before; the choice is remembered on the device.

Improvement

Engine API docs: a quickstart, guides, an error catalogue and a dated API changelog

The Engine API reference is now a set of pages: a quickstart, authentication, errors and limits in your language, guides per task in English, a dated API changelog with RSS, and a Postman collection.

One for developers. If you just cut in the app, nothing changed.

The one long reference page is now a set of pages, all reachable from the API reference, its menu and Ctrl K search:

Old links such as /engine/reference#errors still work: they forward to the page that now carries that section.

Feature

Engine API: retry safely with an Idempotency-Key

Send an Idempotency-Key header with an Engine API optimize call and retry with the same key: the stored answer comes back, and the call is not charged twice.

One for developers. If you just cut in the app, nothing changed.

When a connection drops, you cannot tell whether your request reached the Engine API. Now every optimize call takes an optional Idempotency-Key header — a value you choose per job, a UUID works. Retry with the same key, and within 24 hours:

  • the same request returns the stored answer, marked Idempotency-Replayed: true — not charged and not solved again;
  • an async max job returns the same jobId instead of a second job;
  • the same key with a different request is refused with 409 idempotency_conflict.

Without the header nothing changes. Details in the retries guide and on the errors page.

Feature

Engine API: labels, a plan fingerprint and PDFs in the response, and an interactive endpoint reference

A 2D request can ask for per-piece label data, a fingerprint of the plan, and the cutting-plan and label PDFs. Every endpoint now also has an interactive page with code samples and a test request.

One for developers. If you just cut in the app, nothing changed.

Four more things a 2D request can ask for

Add them to the include array of POST /v1/optimize/2d:

  • labels: per-piece label data, one entry per placed piece, with its sheet, size, grain and banded edges.
  • planHash: a fingerprint of the plan. The same plan always gives the same hash.
  • pdf: the cutting-plan PDF, drawn by the same code as the app (up to 500 parts per request).
  • labelsPdf: the label PDF.

The PDFs come base64-encoded inside the JSON. These four are 2D only; on 1D and wood the response says so in warnings.

Every endpoint on one interactive page

The endpoint reference shows each endpoint with its request and response, code samples in several languages, and a test request. On the 2D, 1D and wood optimize paths the test request uses the public demo key. The page is in English, like the API itself.

Engine API reference · Endpoint reference

Improvement

Engine API reference: a menu, search and a tidier OpenAPI document

The Engine API reference now has a menu and a search (Ctrl K / ⌘K) that finds pages, sections and every endpoint. The OpenAPI document declares all its tags and spells nullable fields the OpenAPI 3.1 way.

One for developers. If you just cut in the app, nothing changed.

Find things faster

The Engine API reference now has a menu on the left. On a phone it folds into a button above the page. Press Ctrl K (⌘K on a Mac) or / to search: it finds the reference pages, every section of the reference in your language, and every endpoint by its path or name.

A tidier OpenAPI document

For client generators, the OpenAPI document changed in four small ways. The API itself sends exactly what it sent before.

  • The validate and nest tags are now declared, so reference tools group those endpoints correctly.
  • GET /v1/jobs/{id} has an operationId: getJob.
  • Two fields that can be null — finishedAt on a job and sheets[].price on a nest — are now typed ["string", "null"] and ["number", "null"]. OpenAPI 3.1 has no nullable keyword, so a 3.1 generator typed them as never null.
  • Every /v1/validate/* endpoint shows an example answer.
Improvement

Sticker words in your own language

A customer needed stickers in Lithuanian, a language the app does not have. The Label format panel now has a Sticker words section: type your own word for Project, Edge banding, Sheet or Bar, and it prints on every sticker.

A customer asked for stickers in Lithuanian, a language the app does not have. In the label preview, the Label format panel (the ⚙ button) now has a Sticker words section with one field for each fixed word the stickers print: Project, Edge banding and Sheet in 2D, Project and Bar in 1D and Wood. What you type replaces that word on every sticker, in both the A4 sheet and the label printer layout; an empty field keeps the app language’s word. Up to 40 characters each, remembered on this device.

Update, 2026-10-19: the app now has Lithuanian — see The app in Lithuanian and Portuguese.

Feature

CNC mode: free placement for 2D panels on a router

A new CNC mode in Settings places 2D parts freely on the sheet instead of with edge-to-edge saw cuts, so more parts fit on the sheets you have.

CNC mode. The 2D Panel optimizer has always planned for a panel saw: every cut edge to edge. If you cut on a CNC router, tick CNC mode (free placement) in Settings. The parts are then placed freely on the sheet, so more of them fit — on a customer’s job with no rotation (decor) and his exact stock, 23 of 23 parts fit where the saw plan placed 20.

Set the gap as the bit diameter plus the free space in Blade kerf, use Limited stock for the exact sheets you have, and download DXF (CNC) — every sheet in one file. There is no cutting sequence in CNC mode, because there are no saw cuts.

In CNC mode: grain matching (sets) works too — each set is placed as one block, freely like any other part. The saw-only settings (first cut direction, max cutting stages, minimise rotation, cut order, speed vs density, cost per cut) are dimmed and have no effect. Which sheet? compares free layouts too and is marked CNC mode. A CNC plan is made for a router — do not cut it on a panel saw.

(Updated on 2026-10-14: since the Limited-stock improvement of the same day, the saw plan also fits all 23 parts of that job on the boards in stock. On full sheets with Unlimited stock CNC mode still needs one sheet fewer: 2 instead of 3.)

Improvement

DXF for CNC: WASTE line from the bit, readable part labels

A CNC customer asked for two DXF fixes: the WASTE line can follow the tool diameter, and part labels are sized to the part so a sheet preview is readable. The kerf helper shows only in CNC mode.

A CNC customer asked for a DXF that matches how a router works. Under the WASTE layer: lines beyond the parts checkbox there is now a Tool diameter field: with it the WASTE line is the toolpath centre, a tool radius plus the allowance from the last part, never closer than the radius. A 6 mm bit with a 3 mm allowance (9 mm kerf) puts the line 6 mm from the part, not 9. Empty, it uses the tool diameter from CNC / router: tool + allowance; with neither, nothing changes.

The new Part labels sized to the part (like the PDF) checkbox (on by default) sizes each part’s text in the 2D DXF to the part, like on the screen, about 40 mm on a 2770 mm sheet instead of a fixed 12 mm, so a sheet preview, for example in Vectric, is readable. Off gives the old 12 mm text. The 1D, Wood and Engine API DXF are unchanged. The CNC / router: tool + allowance link under the kerf field now shows only while CNC mode (free placement) is ticked; values already typed are kept.

Fix

The project and cut name now print on labels, PDF and Excel; the sheet number is optional

Labels, the PDF cover and the Excel header now show the project (and cut) name of a saved project, and a new switch leaves only the sheet name on the label.

Project and cut name. The project name was meant to print once a job is saved as a project, but it never did. It does now: the labels show the project name, and the PDF cover and the Excel header show Project — Cut. Open or save the project in Projects first. Both can be switched off — Project name in the Label format panel, Project and cut name in the PDF options (the ⚙ in the preview; it also applies to the Excel file) — and both are on by default.

Only the sheet name, if you want. In the Label format panel (the ⚙ button in the label preview), under Sheet the piece is cut from, there is a new switch Show the sheet number (#3). Turn it off and the label shows only the stock name — for example Birch 18 or a colour code — without Sheet #3. A stock row without a name keeps its number. Your choice is remembered on this device.

Improvement

Limited stock: fewer parts left over

With Limited stock, the 2D Panel saw plan now fits more parts onto the boards you have when some were left over. Every sheet is still cut with straight saw cuts.

When Sheet supply is Limited and parts are left over, the 2D Panel now also tries filling your boards one at a time, placing first the parts that fit no later board. It takes that plan only if more parts get cut and every sheet can still be cut with edge-to-edge saw cuts.

On a customer’s job (23 decor parts, no rotation, 9 mm gap, one large and two narrow boards) the saw plan now fits all 23 parts — before, 20. On our test set of 4,599 Limited-stock jobs, 1,121 now cut more parts and none cut fewer. Plans that already fit every part do not change, and Unlimited stock is not affected. Saved plans change only when you run them again.

Improvement

Nesting on a limited stock places more parts

With a capped sheet supply (respectStock), the nesting engine now also fills the sheets one at a time, so parts that only fit the big sheet go there first, and more parts fit on the sheets you have.

When you nest onto exactly the sheets you have — respectStock in the Engine API — and the plan still left parts out, the engine now also fills the sheets one at a time, each as full as it can, and puts the parts that fit only one sheet size there first (a tall side on the one big sheet, not on an offcut strip). It keeps that plan only when it places more parts or uses less material, so a job where everything already fit comes back exactly as before.

Measured on 260 jobs against the previous version: 43 jobs place more parts (91 parts in all), none places fewer, and every other job gives the same answer as before.

Fix

DXF from a centimetre plan now opens at the real size

A DXF exported from a plan in centimetres declared millimetres while its numbers were centimetres, so CAD/CAM opened the parts 10× too small. It is now written in millimetres. Millimetre and inch DXFs are unchanged.

What was wrong. A DXF from a plan made in centimetres said in its header that it was in millimetres, but its numbers were centimetres. CAD and CAM programs therefore opened every sheet and part ten times too small. This affected the single DXF and the one-file-per-sheet ZIP; the Nesting DXF declared no unit at all, with the same result in programs that assume millimetres.

What changes. A centimetre plan is now written in millimetres: every size is multiplied by ten and the header says millimetres, so the parts open at their real size. We chose millimetres instead of a centimetre header because many CAM programs ignore the unit in the header, and of those that read it, far more understand millimetres than centimetres. Only the text captions keep centimetres.

What you should do. If you exported a DXF from a centimetre plan before 13 October, export it again. Plans in millimetres or inches were not affected — their DXF files are byte for byte the same as before.

Feature

Grain matching, rebuilt: a drawer front over two doors, cut as one set

Grain matching now cuts a set of fronts side by side from one piece of board, exactly one saw gap apart, so the figure runs on. Size check with fixes, position codes on every output, on every signed-in plan.

Grain matching now means what it says. Until today a grain-matching group only tried to keep its parts on the same board — they could still end up at opposite ends of it, and the figure did not run on. Grain matching is now built on sets: you lay the parts out as they sit on the cabinet — a drawer front over two doors, a row of doors, a stack of drawer fronts — and CutOptim cuts the set as one block, the parts side by side on the sheet, exactly one saw gap apart, with one grain direction. After cutting, the drawer front and the doors under it come from one stretch of board.

Where to find it. Under the Parts (2D) table, the Grain matching strip opens the set editor: name, how many copies, rows or columns of parts, the grain of the set, and a live preview of the cabinet front and of the block on your sheet.

(Updated 2026-10-13: the strip shows once the Grain matching switch above the Parts (2D) table is on.)

Checks that fix themselves. The editor checks that the rows line up on the cabinet — counting the install gap between the fronts, which you can set apart from the saw kerf — and offers a one-click fix (“Set Drawer front width to 48 3/16”). It also checks that the block fits one of your sheets, that the parts table holds enough parts for every copy, and that a CNC tool gap wider than the gap on the cabinet is flagged with the size of the shift.

Every output knows where a part goes. Each part of a set gets a position code — A1, A2, A3 — on the drawings, the cut lists, the labels (“SET A · A2 of 3 (left)”), Excel, CSV, SVG and DXF. The PDF adds a Grain matching page, a dashed frame around each set and a cabinetmaker’s triangle to pencil onto the board before cutting.

From a template in one click. The kitchen base cabinet has a new front layout, 1 drawer over doors, and the base cabinet, wardrobe and TV stand templates can insert their fronts as a set.

Which plans. Grain matching is now on every signed-in plan: on Free a run with sets is one of your monthly runs, Pro includes a monthly allowance of runs with sets (then pay-as-you-go credits), and Workshop is unlimited. Without an account you can try the editor; the set is not saved. The Engine API takes the same sets as matchedSets.

How grain matching works

Improvement

Grain matching gets its own switch above the parts table

Grain matching now has a switch next to Edge Banding above the Parts (2D) table, with an ⓘ that explains it and links the guide. With sets it pauses them; without a set it shows or hides the row that creates one.

One row, two switches. Above the Parts (2D) table you now find Edge Banding and Grain matching side by side, each with its ⓘ. The Grain matching ⓘ explains the feature in one sentence and links to the guide.

With sets the switch is the project’s On / Off. Off pauses grain matching: the sets are kept, the next run ignores them and nothing is shown under the table — the switch’s tooltip says how many sets are kept. On brings back the strip with your sets and + New set.

Without a set the switch only shows or hides the row that creates one, on this device. It starts Off and changes nothing in the project, the run or what is saved. It replaces the ✕ on that row and the way back through the Dashboard and Settings.

How grain matching works

Update 2026-10-14: on Pro the switch’s tooltip also shows how many runs with sets you have used this month, and switching grain matching On when none are left and you have no credits shows a warning.

Update 2026-10-14 (2): without a set, the switch no longer starts Off — the row that creates a set now appears by itself, with an ⓘ and a ✕, once grain matching looks useful for the job (a part with a grain direction, a part named like a door, drawer or front, or a furniture template with fronts). The ✕ hides it and puts the Grain matching switch next to Edge Banding; with sets the switch is there from the start.

Update 2026-10-14 (3): the Grain matching switch is now always shown next to Edge Banding, so you can see the feature exists. It reads On while the row that creates a set is shown (it still appears by itself when useful) and Off otherwise; the ✕ turns it Off.

Improvement

Part labels show which sheet each piece comes from, and the grain direction

Every part label now says which sheet or bar the piece is cut from, with the stock name, and pieces cut with grain get arrows showing which way to stick the label on.

Which sheet, on every label. Each label in Share & Print → Print labels now has a line such as Sheet #3 — Birch 18 (2D) or Bar #2 — Spruce 50×100 (1D and Wood). The number is the same as on the work pages of the PDF, followed by the stock name, so the pieces of one sheet can be sorted at the saw. When three copies of a part come from two sheets, each copy’s label names its own sheet.

Grain direction. When the job is cut with grain, the outline of the piece on the label carries three arrows along its grain. The outline is drawn with the piece’s width across, so stick the label on with the arrows running the same way as the grain.

Both work on the A4 sheet and in label-printer mode, and both are on by default: the Label format panel of the label preview (the ⚙ button) has a Sheet number and a Grain arrows switch to leave either off. The project name, which labels have printed since 12 October, appears once the job is saved as a project.

A third switch, Measurements on the drawing (2D, also on by default), prints the piece’s width above its outline and its height along the left side, in small numbers.

Fix

Signed out? Your work is kept — and the installed app stays signed in longer

When you are signed out, CutOptim keeps your work and brings it back after you sign in. The installed app now signs out after 12 hours without activity instead of 1 hour.

Your work survives a sign-out. After 60 minutes without activity the website signs you out. Until now, a page with unsaved work could stay open after that, and every save then failed with a bare “Error”. Now CutOptim keeps what is on screen — parts, stock, settings and the last result — and takes you to the sign-in page. After you sign in, the app opens with your work restored, ready to save.

A clear message instead of “Error”. If a save or a run finds that you were signed out, a dialog says so and offers Sign in — your work comes back after signing in.

The installed app stays signed in for a working day. In the installed app (PWA) the inactivity sign-out now comes after 12 hours instead of 1 hour, so a pause at the saw no longer signs you out.

Improvement

CSV templates show an example in every column

The downloadable CSV templates now give an example for every column, and the 2D one shows an edge-banding type code.

Choose CSV ⌄ → Template in the Parts section header (2D, 1D or Wood) and the file now has an example under every column — price, selling price and material included — so you can see each column’s format before you fill in your own list.

  • Edge banding by type (2D). The first example row bands the top and bottom edges with a type by name: T:ABS 22×1;B:ABS 22×1. The second shows the untyped form, TRBL. A type name that is not in your banding-type library still bands the edge, without a type.
  • Grain (2D). The second example row has L in the Grain column (grain along the Length) and is set not to rotate, because a part with a grain direction keeps its orientation.
  • Material. Both rows name the same material, so importing the template raises no material question. In Material-specific mode it is assigned when your Material inventory has a material of that name.
  • Off-cut inventory. The off-cut template carries a material too.

Importing a template unchanged gives the second 2D part a grain direction — replace the example rows with your own list before you import.

Improvement

Cut sequence: passes 3a and 3b, numbers per sheet, and a Cut order setting

A fence setting over several strips now reads 2 passes, with each pass numbered 3a, 3b on the drawing and its own Result. Steps are numbered per sheet, cut numbers keep clear of each other, and a new Cut order setting suits circular and track saws.

Every pass is numbered. When one fence setting makes the same cut across several strips, it is still one step, but it is now labelled · 2 passes instead of ·2×, and each pass is numbered 3a, 3b on the PDF work page and in the Excel work-sheet picture. Before, only the first strip carried a number. The Result says what each pass frees, 3a → 27 · 3b → 28, so two parts are no longer read as one cut freeing both. The PDF writes 3a: 27 · 3b: 28. A pass that frees nothing is left out.

Cut numbers keep clear of each other. A number that would land on another cut number — or, in the PDF, on a part number — slides along its own cut line, with a short leader line back to the cut. Numbers that collide with nothing stay where they were.

The work page keeps the passes. Under a multi-strip step the PDF table gets one row per pass that frees something. On a crowded sheet it becomes one compact row per step, so the sequence never spills onto an extra page.

Numbered per sheet. The table on screen, the player (Sheet #9 · Step 3/21), the PDF appendix and the Excel sawing-plan tab now number steps 1 to n on each sheet, like the PDF work pages always did. Shop-mode ticks are not affected.

New setting: Cut order. In Settings → More → Cut plan & machine, 2D only, on every plan: Per fence setting (panel saw) is the default and works as before. Per pass (circular or track saw) makes every cut its own step, so 21 steps become 23. Changing it only redraws the sawing plan: the layout is not recomputed and no run is used. It is saved with the project and the cut. Shop-mode ticks start afresh when you switch, because the list of steps changes.

Order fix. Within a stage a step is never listed before the step that holds its parent cut. A merged step could previously name a part that was still attached.

The Engine API PDF (include: pdf) prints the same work pages. No API fields changed.

Improvement

Labels for a label printer, and a bigger edge-banding picture

Print every part label on its own page at your sticker size (100 × 40 mm by default), and read the edge banding at a glance.

A furniture maker who prints on a 100 × 40 mm sticker roll asked for two things: one label per sticker, and a bigger edge-banding picture.

Label printer mode. In Share & Print → Print labels, the preview now has a Label format panel. Choose Label printer (one label per page) and enter the label’s Width (mm) and Height (mm) — 100 × 40 mm by default. Every label then gets its own page of exactly that size, with no header or footer and the text sized to the label; your size is remembered. In the print dialog choose the same paper size and print at 100% (actual size). A4 sheet (3 columns) stays the default for ordinary printers.

A bigger edge-banding picture. The outline on the label is now about twice as large and drawn in the part’s own proportions. Banded edges are thick, edges without banding are thin and dashed, so “no banding” is visibly different from a line that did not print.

Bigger measurements. In the same Label format panel, Dimension text size (Normal, Large, Extra large) prints the part’s size as the first, bold line across the whole label, so it can be read from a distance. The copy number always stays visible.

Feature

Part labels show the edge banding and the project

The printed part labels now mark which edges are banded, with which banding type, and carry the project name.

A furniture maker asked for labels that tell the edge-bander what to do: the part name, the project, and the banding.

Edge banding on the label. In Share & Print → Print labels, every label of a banded part now has a small outline of the part with the banded edges drawn thick, and a line naming the sides and the banding type — for example Edge Banding: T B: ABS oak 22 · L: ABS white. Parts without banding print as before.

Project name on the label. When the job is saved as a project, every label also carries the project name, so a cut-out piece still says which job it belongs to.

Developers: the Engine API’s labelsPdf output carries the same banding marks from parts[].edgeBanding.

Improvement

Progress tracking counts parts and shares the marks

Each sheet or bar now shows how far it is — 5/19 parts or ✂ 3/7 cuts — and a saved cut shares every tapped part and ticked cut with your other devices and your team.

Progress tracking used to be a two-way switch per sheet — Not started or Completed — while the parts you tapped and the cuts you ticked in Shop mode stayed on the device you marked them on. Now those marks are the progress:

  • The badge in each sheet or bar header counts them: 5/19 parts, ✂ 3/7 cuts, amber while the sheet is in progress, a green ✓ when it is done. The dropdown is gone; the ✓ button completes a sheet in one click and, pressed again, sets it back to Not started.
  • A total above the results shows how many sheets and bars are Completed (✓ 7/12).
  • On a saved cut every mark goes to the server: the cut opens on the tablet at the saw with the marks made at the desk, and in a Team Workspace your colleagues see them — when they open the cut, when they come back to the tab, and every 20 seconds in Shop mode. Two people marking different sheets no longer overwrite each other.

See Progress Tracking.

Improvement

Shop mode keeps the sheet status for you

In Shop mode a sheet or bar now switches to Completed on its own once every part is tapped or every cut is ticked, and back to Not started when you take a mark back.

Until now only a sheet with every part tapped turned to Completed, and it stayed Completed when you took a part back; ticking cuts in the cutting-sequence table never touched the status. Now both kinds of marks drive the dropdown in the sheet or bar header: every part tapped, or every cut of that sheet or bar ticked, switches it to Completed; taking one mark back returns it to Not started. A status you set yourself with the dropdown or the ✓ button is left alone when you tap an unrelated part. See Progress Tracking.

Update, 2026-10-12 (later the same day): the dropdown is gone — the marks themselves are now the progress and are shared on a saved cut. See Progress tracking counts parts and shares the marks.

Improvement

★ only with Limited stock, off-cut rows first, honest cost goal

The ★ now shows only with Limited stock, moved off-cuts are used first in both modes, and Minimize cost is never dearer than Minimize waste.

★ only with Limited stock. The ★ column of the stock tables now appears only when Sheet supply (or Bar supply) is Limited, like the quantity column. In Unlimited it is hidden and not used: CutOptim buys as many boards or bars as the plan needs, so there is nothing to use up first. Your stars stay on their rows and come back when you switch to Limited.

Off-cut rows are used first in both modes. A piece you move from the Offcut Inventory into the stock table (↑ or All to stock) becomes an off-cut row: it is starred automatically, used first and never more than its quantity — now in Unlimited too, where it is filled before any new board or bar is bought and is never repeated. Before, with Unlimited stock and Minimize cost, a single 1200×800 off-cut could turn into 23 “free” sheets. Use off-cuts automatically is unchanged and works in both modes.

Off-cut rows are easy to spot and are not billed. An off-cut row now shows a ♻ badge in its name cell (×N when there is more than one), in both supply modes — so you can recognise it in Unlimited, where the ★ and quantity columns are hidden. Sheets and bars cut from off-cut rows are listed as re-used off-cuts, not as new material to buy, on screen, in the PDF and in Excel, and the quotation does not bill them. ⚖ Which sheet? no longer offers an off-cut row as a size to buy, and Use this keeps the off-cut rows in the table.

Minimize cost is never dearer than Minimize waste. For the same input — in 2D, 1D and Wood, and in the Engine API — the cost goal no longer returns the dearer plan. Before, that happened in about one job in twenty with two stock sizes.

Rows without a price. With Limited stock an unpriced row still counts as free (an off-cut you own). With Unlimited stock and Minimize cost, when some rows have a price and some do not, the unpriced rows are ranked at your dearest unit price and left out of the total cost; a message says so before the plan, and the summary, PDF and Excel name those rows. With no prices at all, the summary now says the run was optimized for least material.

Clearer outputs. How this plan was optimized — on screen, in the PDF and in Excel — now states the stock supply in every mode, Wood included, and names the off-cut rows used in Unlimited. The Excel Overview now lists the warnings (parts not cut, must-cut parts left out, rows without a price, same-size rows without material mode), which the workbook used to drop. In 1D and Wood, parts longer than every bar are counted in the not cut note.

Smoother imports. More column titles are recognised in every language (for example Pieces, Anzahl, Mennyiség for the quantity, Cost or Kosten for the price), and Excel’s TRUE/FALSE works in the Rot. column. When a header is only partly understood and reading by position would contradict it, nothing is imported and the message names the unknown column — before, wrong sizes could come in silently. In 2D a Grain column (W, L or none) sets the grain of parts and — new — of pasted stock sheets, and the CSV template now includes it. A nesting DXF drawn in inches or mm is converted to your working unit. So is a nesting SVG whose page size is given in mm, cm or inches; its transforms are applied, and hidden shapes or shapes inside defs are skipped. The paste box above each table stays a slim one-line row until you click it.

Fixes. Each stock row keeps its own star: the 2D, 1D and Wood tables are independent, and deleting a row no longer moves stars onto other rows. In Unlimited the hidden quantity no longer changes the plan (off-cut rows keep their quantity, shown by the ♻ badge), and a ⚑ must-cut flag set in Limited is no longer applied after you switch to Unlimited. The material cost of a Wood plan is now the bars actually used × their price — before, it was capped by the hidden quantity. The 1D and Wood PDF now speaks of bars, not sheets, when stock runs short, and its Priority pieces (cut first) block lists the must-cut parts as they were when the plan ran.

Feature

Limited switch in the stock box; starred offcuts used; no board the job does not need

A Limited switch now sits in every stock box, starred offcuts are used, and with Limited stock CutOptim no longer opens a board the job did not need.

A Limited switch in the stock box. Every stock box now has a Limited switch of its own, under Material mode and Which sheet? — no need to open More. Turn it on and the quantity column appears right after the name. The copy in Settings stays under More.

Starred offcuts are used. With Limited stock, a starred row that costs nothing — typically an offcut you entered as a stock row — is now used even when it does not save a board. At equal price the plan puts more onto the starred stock. A priced starred board is still never opened just to hold a few parts, and the number of other boards never goes up.

No board the job does not need. With Limited stock CutOptim used to open every board of the first size before the next one, even when the job needed the same number of the other size anyway. It now also tries leaving one board in the stack, and keeps that plan when it is cheaper (Minimize cost) or uses less material (Minimize waste). On one customer’s job, 3 small + 3 large boards became 2 small + 3 large: the same parts and the same three large boards, for €63.53 less. With starred stock this means that no board of another size is opened that the starred boards could replace — but a starred board that would not save one can stay in the stack.

Feature

Starred stock is used up first

With Limited stock, the ★ rows in your stock table are now used up before another size is opened, even if the plan then costs a little more.

A joiner who keeps their large boards for other jobs asked for the small ones to be used up first. The ★ in the stock table was only a tie-break — it counted when two plans were otherwise equal.

Starred stock first. With Sheet supply on Limited, CutOptim now uses up the ★ rows before it opens another size — in 2D, 1D and Wood — even if the plan then costs a little more or uses more material. Parts are never dropped and your quantities are never exceeded. With Unlimited stock the ★ still only marks the size to prefer. Plans you already saved do not change until you run them again.

(Fixed the same day: with Minimize cost and Limited stock, a plan could use more sheets of a size than you had entered.)

(Refined on 2026-10-12: no board of another size is opened that the starred boards could replace — but a starred board that would not save one can now stay in the stack when that is cheaper.)

(Changed on 2026-10-12: with Unlimited stock the ★ column is now hidden and the star is not used, because CutOptim buys as many boards as the plan needs. Your stars stay on their rows and count again in Limited. Off-cut rows moved in from the Offcut Inventory are starred automatically and used first in both modes.)

Feature

A new Engine API plan: Scale

The Engine API now has two monthly plans, Studio and Scale. Every request counts the same, nesting included, with quota emails, plan switching and free test keys.

The Engine API, CutOptim’s cutting engine for your own software, now comes in two monthly plans. Here is what you get.

Two plans

Plan Price Requests per month Trial
Studio €49 / month 3,000 14 days
Scale €149 / month 10,000 —

Both plans run the same engines, all four modes (2D sheets, 1D bars, timber with cross-section matching and true-shape nesting) and every option. Billed monthly in EUR.

The facts

  • Every request counts the same, nesting included. A true-shape nesting job costs one request, exactly like a 2D or 1D one.
  • Hard cap, no overage. When the monthly quota is used up, calls return 402 until it resets on the first day of the next month. No surprise invoice.
  • Two emails before the cap surprises you. We email the account at 90% of the quota and again when it is used up.
  • Switch plans from the dashboard. The Switch to Scale (or Switch to Studio) button on the API keys card of your dashboard changes the plan, and the new quota applies straight away. Switching opens once the trial is over.
  • Try it before paying. The Run this example buttons on the API reference use a public demo key, no account needed. Any signed-in account can also create test keys: their own small monthly allowance, never billed, no subscription. Studio then starts with a free trial.
  • Larger volumes than Scale are priced individually: tell us what you need.

The plans are on the Engine API page and on the pricing page.

Feature

Grain direction, a fuller work sheet, and one DXF per sheet

Set which way the grain runs on sheets and parts with one icon per row and see it as hatching. Work sheets add per-sheet figures, offcuts with their size and what each cut frees. DXF can come one file per sheet.

A hobbyist comparing CutOptim with another cut-list program told us two things: he had to stop and think which number to type as the width to get the grain right, and the other program’s PDF showed the grain as hatching — which is how he caught his own mistake. This release answers both, and takes a few more ideas from that comparison into the PDF.

Grain direction. In 2D Panel mode every sheet and part row ends with a Grain icon — a small picture of the row as entered, with lines along the grain. One click cycles a part through free (a turn arrow) → grain along the Width → grain along the Length; hover it for the exact side (The grain runs along the 24 side), so it no longer matters which number went into Width and which into Length. CutOptim turns every part with a grain so its grain follows its sheet’s, and leaves the rest free to rotate. Sheets start with the grain along their longer side; click to the dashed outline for MDF or melamine. The icon replaces the old Rot. checkbox, and there is no switch to turn it on: grain counts as soon as one part has it. Available on every plan, guests included. See Grain Direction.

(Updated 2026-10-05: the first version of this release used a Grain direction switch with a drop-down cell per row; it was replaced by the icon the same week.)

Grain you can see. Sheets that have a grain, and every part on them, are hatched along the grain — on the screen, in the PDF and in the Excel pictures. An Export & drawing option turns the hatching off.

A fuller work sheet. Every work sheet in the PDF now opens with that sheet’s key figures — waste, reusable offcuts and cut length per sheet, not only for the whole job. The reusable offcuts are drawn on the sheet with their size, so the right drop is kept, and the cut sequence has a Result column: the part numbers each cut frees. The same figures and offcuts appear under each sheet on the screen, and the Result column is in the on-screen sequence and the Excel tabs.

A plan check. The PDF summary and the Excel Overview list a few yes/no facts, in every mode: every part placed, Material mode on, grain honoured, reusable offcuts. When stock rows of the same size carry different names while Material mode is off — 1/2” and 3/4” plywood, or two profiles of the same length — the plan check warns that they are being treated as one material.

One DXF per sheet. DXF — one file per sheet (ZIP) in the Downloads menu writes every sheet as its own DXF, for CAM programs such as Vectric Aspire that take one sheet per job.

Also

  • The Parts table in the PDF no longer runs off the page when material names are long; long names wrap.
  • PDFs are about five times smaller — the same pages, compressed.
  • Offcuts in the waste list and the offcut inventory are now exactly the pieces the cutting sequence leaves.
  • The Engine API takes grain on stock rows and parts as well — see Engine API.
  • The ⓘ in the Grain column header opens the Grain Direction help page; Which sheet? now sits on the same line as the Material mode switch.
  • A part that only fits turned against its grain is listed as such, with the two ways out: click its Grain icon back to the turn arrow, or use a sheet whose grain runs the other way.
  • A Grain direction column holding both h and v (as CutList Optimizer exports it) keeps those parts 90° apart — see Importing data.
  • First cut direction and Trim per side apply to each sheet the way you entered it, also on a sheet whose grain runs the other way — in the app and in the API.

See Grain Direction and Exports.

Feature

A plan you can cut from: work sheets, part numbers and Shop mode

The PDF now has one work sheet per board with numbered parts, numbered cuts and tick boxes. Parts carry numbers everywhere, inches read as fractions, and Shop mode lets you tap parts and tick cuts at the saw.

A woodworker who cuts by hand on a table saw told us what the plan was missing: the cut list belongs on the same page as the drawing, small parts lose their names, and inches should read the way a tape measure does. This release is built on that list.

Work sheets in the PDF. Every distinct sheet layout now has a page of its own with everything needed to cut that board: the drawing with each part numbered, its name along the long side and its dimensions on the edges; the cut lines numbered in the order they are made; the parts on that sheet; and the sheet’s own cut sequence with a tick box per cut. The full-size layouts, the coordinate cut list and the whole-job sequence follow as appendices, and a clickable table of contents opens the document. In 1D Linear and Wood each bar gets a work list with the stop position of every cut.

Part numbers everywhere. A part’s number is its row in the Parts table when you ran the optimizer. It is on the screen plan, in the cut list, in the PDF and in the Excel pictures — in colour and in black & white — so a small part is identified even where its name does not fit.

You choose what the document contains. The new Export & drawing options — in the PDF preview’s side panel and under Settings → More — switch sections and labels on or off, and are remembered. A Classic layout preset gives the earlier document back.

Inches as fractions. In inch mode lengths are shown to the nearest 1/32 (23 1/2); a value that is not on that grid stays decimal.

Shop mode. A button in the results header opens the plan full-width for a tablet at the saw: tap a part when it is cut, tick a cut when it is made, or press Done, next to walk through the fence settings. The marks stay with the plan on that device.

Also new

  • Which sheet? shows each size’s plan before you choose, exports the comparison as a PDF, and Use this now opens the chosen plan without using another optimization.
  • Cut lists exported from other tools: Enabled, Grain direction and Material columns are read; unknown materials can be created and assigned in one step.
  • Pressing Run optimizer again with nothing changed no longer uses an optimization.
  • The plan can be zoomed to the full window, the input panel and the table columns can be resized by dragging, and a paste no longer keeps the example rows.

See Exports, Progress Tracking and Importing data.

Fix

Pasting and CSV import: every number format, every column order

Paste and CSV import now read 1.220,5 and 1,220.5, follow your header row in every mode, accept CSV text and Excel's own CSV encoding, carry Rot. and edge banding in a 2D paste, and skip unreadable rows instead of inventing sizes.

We went through every way a cut list gets into CutOptim: the six paste boxes of the 2D, 1D and wood Stock and Parts tables, the two Nesting boxes, and the CSV import of the Parts tables, the offcut inventory and Nesting. Each one in millimetres, centimetres and inches, with the number spellings European and English spreadsheets produce, and with the columns in the wrong order. This is what changed.

Thousands separators. A number written with a thousands separator, 1.220,5 (German, Italian, Spanish, Romanian or Croatian Excel) or 1,220.5 (English), used to be read as 1.22. It is now 1220.5 everywhere. Space-separated thousands (1 220,5) already worked. A lone 1.220 is ambiguous; if other numbers in the same paste show which mark is the decimal one, that decides it, otherwise it is read as a decimal and the message after the import names the value so you can check it.

Your header row decides the column order in every mode. In 1D linear, a header like Qty | Length | Name was ignored and the columns were read by position, so the length and the quantity swapped. Now 1D follows the header like 2D and wood. The wood paste also understands German, Italian, French, Romanian, Czech and Croatian column titles, a unit in a title (Width (cm)) is converted, and a title line above the header is skipped.

CSV text and Excel’s own CSV. Text copied from a CSV file in Notepad or an e-mail (Door;600;400;2) can now be pasted. A CSV saved by a Hungarian, Czech, Polish, German or French Excel keeps its accented names (Excel does not save “CSV” in UTF-8), and a tab-separated .txt can be imported.

Nothing is invented any more. A CSV row with an unreadable width used to become a 400 × 300 part, and an unreadable length a 500 one, with no warning. Rows with a missing, unreadable, zero or negative size, or a quantity of 0, are now skipped, and the message says how many.

Also fixed: a 2D paste now keeps the template’s Rot. and edge-banding columns, so a grain-locked part stays grain-locked. Nesting CSV import reads decimal commas (12,5 was 12). In wood mode, parts in millimetres keep their half millimetre (600,5 was rounded to 601). The first row of a CSV without a header is no longer lost when it holds 1 220 or 600 mm, and quantities like 2 db or ×4 are read correctly.

Improvement

1D and wood: the leftover now stays in one long piece

When several plans use exactly the same bars, CutOptim now keeps the leftover in as long a piece as possible instead of spreading it over many bars. Same bars, same material, same price, a remnant you can actually reuse.

A linear job can often be cut in several ways that use exactly the same number of bars and the same total length. Until now, which of those plans you got was decided by the order the optimizer happened to try them in, so the leftover was often spread as a short piece on nearly every bar: too short to keep, too many to track.

Now, when plans are otherwise identical, CutOptim keeps the leftover in as long a piece as possible. It compares the longest remnant first, then the next, and so on.

A measured example from our docs: 12 uprights at 2700 mm, 18 rails at 1200 mm and 6 braces at 890 mm, cut from 6000 mm bars with a 3 mm kerf. Both before and after, the job takes 11 bars at 89.9 % yield. Before, the leftover was scattered: six pieces of 594 mm, three of 295 mm, and one each of 1188 and 915 mm. Now six bars come out with no leftover at all, and most of what remains is one 3594 mm piece, worth saving to your offcut inventory.

This applies to 1D linear and wood cutting in the app, and to the Engine API’s 1D and wood endpoints. It only decides between plans that are already tied on everything else, so it never costs you a bar, a part or any money. The number of bars, the material used and the price stay exactly the same.

Improvement

One clear answer to “what is free?” — and your logo on every free PDF

Every page now shows the same plan list. Signed-in free users can put their company logo on PDFs. Pro adds unlimited runs, cloud saving, share links and priority support.

Since August the free account has had every cutting tool. Some of our pages still said otherwise: an FAQ said Excel and DXF were Pro, a calculator said the company logo was Pro, and the Pro card listed tools the Free card already had. They now all come from one plan list, so they say the same thing.

What each plan includes:

  • Without an account: 2 runs, PDF and CSV export, and every cutting mode (2D panel, 1D linear, wood).
  • Free account: 3 runs a month and every tool. That includes Excel, DXF and SVG export, panel labels, your company logo and details on PDF and Excel, custom text fields, the offcut inventory and material library, material-specific mode, edge banding, cost mode and area pricing, the cutting sequence, the calibration cut and nesting.
  • Pro: everything in Free, plus unlimited runs, saving projects and cuts to the cloud, sharing a plan by link and priority support. PDFs have no “Generated with CutOptim” footer line.
  • Workshop: everything in Pro, plus the quotation PDF, grain matching groups, max. cutting stages, rotation minimising and a shared workspace for 3 people.

Update 2026-10-13: grain matching has been rebuilt on sets — the parts of a set are now cut side by side from one piece of board, exactly one saw gap apart — and it is no longer limited to Workshop: it is on every signed-in plan (Free within its monthly runs, Pro with a monthly allowance, Workshop unlimited). See Grain matching, rebuilt.

What changed in the app:

  • Your logo on free PDFs. Before, the logo showed in Excel exports but not on PDFs, and only Pro users could upload one. Now every signed-in user can set a logo and company details under Dashboard → company details, and they appear on every PDF.
  • Install as a desktop app is offered on every plan.
  • One footer rule. The small “Generated with CutOptim” line appears only on PDFs made by a free account without credits, or without an account. The nesting PDF now follows this rule too.
  • Credits add runs only. They still don’t add cloud saving.

See pricing for the full comparison, including a “No account” column.

Feature

Furniture templates now build the drawer boxes too

The TV stand and kitchen base cabinet templates can add each drawer's box: sides, front and back, and a bottom. They are sized from the runner length and side gap you enter.

The furniture templates always gave you the drawer fronts, but never the boxes behind them. A box depends on the runners you buy, and we didn’t want to guess those. Now you enter them.

On the TV stand and the kitchen base cabinet, set Drawers above zero and switch Drawer boxes to Fronts + boxes. Then enter:

  • the runner length (250–600 mm) and the runner gap per side, both from your runner’s instructions;
  • the box board (the carcass board, or a thinner one), the bottom thickness and a height clearance.

Each drawer gets two sides, a front and back that fit between the sides, and a bottom screwed under the box. A 600 × 720 × 560 mm kitchen cabinet in 18 mm board, with three drawers, 13 mm gap, 500 mm runners and 30 mm clearance, gives sides of 500 × 198, front/back 502 × 198 and bottoms 538 × 500.

If a runner is too long for the cabinet, or the gap leaves no room for the box, you get a clear message instead of a cut list. Walls cut from the carcass board go into the parts table with the carcass. A different box board and the thin bottom are listed separately with their thickness, like the back panel. Hinge borings are still not included. See furniture templates.

Feature

Oversize per side: cut parts larger, keep the finished size

A new 2D Panel setting cuts every part a set amount larger on each side while your parts table keeps the finished size. The cut list, PDF, Excel and CSV show both sizes.

Some parts are cut larger on purpose and brought to size later: veneered panels trimmed after pressing, or boards that run through a trimming edge bander. Until now you had to add that allowance to every row by hand, then remember which numbers were real.

Oversize per side does it for you in 2D Panel mode. You’ll find it under Settings, More, Blade & trim.

  • Your parts table keeps the finished size. With 5 mm oversize, a 400 × 800 part is packed and cut as 410 × 810.
  • The plan is built from the cut size, so the sheet count includes the extra material.
  • The on-screen cut list, the PDF cut list, the Excel cut list and the CSV show the cut size and add a Finished size column. The “How we optimized” summary names the oversize.
  • Edge banding lengths, labels and area prices keep using the finished size, because that is the part you deliver.

It is not the saw kerf and not the sheet trim, which stay separate settings. It is off (0) by default. When it is off, every output looks exactly as before. It is saved with the project and available on every plan. See the settings guide.

Improvement

Benchmarks: nesting measured on the classic ESICUP sets

The nesting section of /benchmarks now covers the 13 public ESICUP nesting sets as 39 sheet problems: every layout valid, and the max engine saves a sheet on 11 of them. Plus the 272-part job with a 5 mm gap.

Until today the nesting section of the benchmarks page rested on one job we built ourselves: 272 irregular parts on 2440×1220 sheets. A single job we chose can’t show how the engine does on problems we didn’t choose, so the section now adds the public ones.

The classic ESICUP sets

The ESICUP nesting sets are the public irregular-packing instances the research literature has used for many years: 13 sets, from 12 pieces to 99 (clothing patterns, geometric shapes, industrial parts). They are strip-packing problems, so we turn them into sheet problems the way the bin-packing literature does: three square sheet sizes per set, 1.1, 1.5 and 2 times the largest piece. That gives 39 instances.

Every run went through the live Engine API on our production server:

  • Across all 39, the fast default engine uses 248 sheets and the asynchronous max engine 236 (the worse of two 60-second runs), against an area lower bound of 153.
  • The default reaches the bound on 7 instances and max on 14. Max saves a sheet on 11 instances, in every run. On the other 28 it found nothing better than the default within 60 seconds.
  • All 39 layouts are valid: every part placed on its sheet and no two parts overlapping beyond the rounding of the returned coordinates, checked outside the engine.

The lower bound, total part area divided by one sheet, is weak for irregular shapes, and the gap to it is largest on the smallest sheets, where the biggest pieces barely fit. The gap to it therefore does not show how far a result is from the best possible: methods published in the research literature use fewer sheets than our engine on many of these instances. Every per-instance figure is on the page and in a downloadable JSON file.

The same job with a real cutting gap

The literature measures without any gap between parts. Real laser work usually has one, so the page now also shows the 272-part job with a 5 mm gap between parts and at the sheet edge. The default engine still needs 6 sheets, the same as with no gap. Max used 5 sheets in one run and 6 in the other (two 60-second runs), where with no gap it used 5 in every run. The gap was measured on every layout: at least 5 mm between any two parts and from every part to the sheet edge.

What we left out, and why

One family of sets is missing on purpose: the jigsaw sets, whose pieces tile a sheet exactly. With zero gap the default engine does not place a part exactly as wide as the sheet, so those sets would measure that one weakness rather than the engine. A fix is planned. With any real cutting gap an exact fit is impossible anyway, so it only matters when you nest with no gap at all.

(Update 2026-09-28: a part exactly as wide as the sheet, parts that together fill a sheet dimension exactly, and full-width strips now nest correctly at zero gap. The jigsaw sets still stay out: their irregular pieces only fit by interlocking exactly, which the default engine can still miss.)

None of these results tells you how your own parts will nest. That depends on your shapes, quantities and spacing, so the number that matters is the one your own job produces.

Improvement

Benchmarks: the nesting max engine, measured on our production server

The true-shape nesting section of /benchmarks now shows the asynchronous max engine next to the fast default: on the 272-part test job, 5 sheets instead of 6 in every run, against a theoretical minimum of 4.

The benchmarks page has had a true-shape nesting section since the nesting engine launched: a representative 272-part job (L-brackets, triangles and diamonds on 2440×1220 sheets) that the fast default engine nests onto 6 sheets, where the same parts packed by their bounding box need 9. It now also shows the asynchronous max engine on the same job.

What we measured

Every run went through the live Engine API, so the numbers come from the production server a customer’s request reaches, not a development machine. With its default 60-second budget, max used 5 sheets in all four runs; with the 180-second maximum, 5 sheets in both runs — more time did not find a fourth sheet’s worth of saving on this job. The theoretical minimum, the total part area divided by one sheet, is 4.

How we kept it honest

  • The range, not the best run. max stops when its time budget runs out, so the same request can end on a different result from one run to the next. The page shows the range over every run. Here all six runs agreed.
  • Every layout checked independently. Each run is checked outside the engine: every part placed, every outline on its sheet, and no two parts overlapping by more than 0.01 mm — a margin for the rounded coordinates the API returns, since parts that touch can otherwise appear to cross by a few thousandths of a millimetre.
  • Reproducible. The script that produced the numbers is in the repository, and the page reads them from its output file — none is typed into the page by hand.

One job is not a promise about yours: how many sheets max saves depends on the shapes, the quantities and the spacing you ask for. The only number that counts is the one your own parts produce.

Improvement

Nesting: a separate edge clearance, costs per sheet size, and sheet sizes chosen on merit

True-shape nesting on the Engine API: options.edgeClearance sets the sheet-edge gap apart from the part spacing, every sheet names its stock row and stockUsage totals sheets and price per row, and with several sizes lbf no longer depends on the stock order.

Three changes to true-shape nesting (POST /v1/optimize/nest), all aimed at the same thing: knowing exactly how much material a nest uses and what it costs.

A separate clearance at the sheet edge

Until now options.minSeparation set the spacing between parts and the gap to the sheet edge — one number for both. A laser job often wants something different at the edge: 5 mm between parts, but 0 mm (or 10 mm) at the edge. The new options.edgeClearance sets the edge on its own. It works on both engines, lbf and max. Leave it out and nothing changes: the edge keeps minSeparation, exactly as before. It needs rectangular sheets; with a polygon sheet, or a value that leaves no room on a sheet, the request is refused with a 400 before a call is charged. Exclusion zones keep minSeparation, like parts.

Sheets used and cost per sheet size

Every sheet in the response now carries stock — the index of the stock row it was cut from — and the response adds stockUsage: for each stock row that was used, how many sheets, their total price and their density. That is the “quantity per sheet size” an ERP needs to price a quote. The unit is the stock row: two rows with the same size but a different price are two entries.

Several sheet sizes: the order no longer decides

With two or more stock rows for one material, the lbf engine used to open sheets in the order you listed them — so the same job could come back on the larger size or the smaller one depending only on which row was first, and minimizeCost did not change that. Now lbf compares your order, each size on its own and a cheapest-first order, and keeps the best: most parts placed, then the least total sheet area — or, with minimizeCost, the lowest total price (when every row has a price or cost). If you send several stock rows for one material, your result may change — it can only get better by that ranking, because your own order is always one of the candidates. A request with a single stock size per material is unchanged. In this release sizes were not yet mixed within one material, and the max engine still nested each material onto one sheet size. (Update, 2026-09-22: both have since changed — sizes can now be mixed, and max accepts several sizes; see Nesting: mixed sheet sizes.)

How much time to give max

For a job of a few dozen parts, a budget of 15 seconds (options.timeBudgetMs: 15000) is usually enough; the job finishes about one to two seconds after its budget, plus any time in the queue. The default stays 60 seconds. Poll GET /v1/jobs/{id} every two to three seconds — polling costs no quota.

See the API reference for the new fields, and the Engine API page for access.

Improvement

Nesting: mixed sheet sizes, max with several sizes, and cut length per sheet

True-shape nesting can now mix sheet sizes within a material (a half-empty last sheet moves to a smaller size), the async max engine accepts several sizes and respectStock, and every sheet reports its cut length and pierces.

Four changes to true-shape nesting (POST /v1/optimize/nest) and to the app’s Nesting mode, all about knowing what a nest really costs.

Mixed sheet sizes within one material

Until now a material’s parts were nested onto one sheet size — the best one, but only one. Now, after choosing the best arrangement, every sheet (the least-filled first) is re-nested on its own onto your cheaper or smaller stock rows, and replaced when the whole plan ranks better. The typical result: two large sheets and a smaller last sheet, where the half-empty last sheet used to be a large one. The ranking is the same as before — most parts placed, then the least total sheet area, or with minimizeCost the lowest total price — so the plan can only get better by that ranking. With respectStock, no row is used more often than its qty.

Measured on synthetic jobs with the same parts: a 2440×1220 sheet plus a 1220×1220 last sheet (price 64) instead of two 2440×1220 sheets (80); and on a 600-part job, 14 large sheets plus one small one instead of 15 large ones. A request with one stock size per material is unchanged.

max with several sheet sizes and respectStock

The asynchronous max engine no longer refuses a second sheet size, or respectStock. It searches on the size every part fits and that promises the cheapest plan, then applies the same mixed-size step to its own result. It replaces the lbf plan only when it ranks better — never merely because it has fewer sheets (fewer, but dearer, sheets keep the lbf plan, with a warning). A polygon sheet or exclusion zones, which its search cannot model, are served by lbf inside the job with a warning instead of a 400.

Cut length and pierces

Every sheet now carries cutLength — the summed perimeter of its placed parts’ outlines and holes, in your unit — and pierces, one per closed contour; metrics totals both. It is the geometric contour length: common-line cutting, lead-ins and micro-joints are not included — your machine’s CAM adds those.

In the app

The Nesting options have a new Edge clearance field (empty = the same as the spacing), and the result shows the cut length and pierces, the cut length of each sheet, and the sheets, fill and price per stock size — including a mixed plan.

See the API reference for the new fields.

Fix

Nesting: must-cut parts now win the sheet when stock is capped

On POST /v1/optimize/nest, parts marked priority are now placed first when options.respectStock caps the sheet supply, and every plan comparison keeps the plan with more of them. Before, the nesting engine accepted the field but ignored it.

The true-shape nesting API (POST /v1/optimize/nest) has always accepted parts[].priority — “must-cut” — and its reference said such a part wins sheet space when the supply is capped. It did not. The nesting engine places part types largest-first, whatever the request says, so with a fixed number of sheets a bigger plain part could take the sheet a must-cut part needed, and no warning said so.

What changes

With options.respectStock — a capped sheet supply, where not every part may fit — must-cut parts are now placed first, so a plain part never takes the sheet space a must-cut part needs. Every plan comparison (choosing the sheet size, the mixed-size step, and max deciding whether its search result replaces the fast layout) now ranks the plan that keeps more must-cut parts ahead, even when it places fewer parts in total — the same rule the rectangular modes already follow. Both nesting engines honour it.

Measured on the engine, with and without the flag: one 1000×1000 sheet with a 500×500 must-cut part and a 900×900 plain part now keeps the must-cut part (before: the plain one). Eight must-cut 400×400 parts and eight plain 600×600 parts on two capped 1220×1220 sheets: 8 of 8 must-cut parts placed (before: 0 of 8). A 272-part test job capped at three sheets with one must-cut part type: 80 of 80 placed (before: 0 of 80).

What does not change

Without respectStock every part that fits is placed anyway, so the flag changes nothing and the layout is identical to before. A job without must-cut parts is unchanged, capped or not. A must-cut part that fits no sheet at all — or more must-cut parts than the capped sheets can hold — still comes back in unplaced. The app’s Nesting mode has no must-cut control; this is an Engine API field.

See the API reference for the field.

Improvement

Nesting: the used area of each sheet, and a compacted last sheet

Every nested sheet now reports the width × height its parts reach from the sheet corner, for partial-sheet quoting, and the least-filled sheet is re-packed into that corner. Sheet count and price never change.

Some quoting systems do not charge a laser nest by the full sheet. They charge a horizontal or vertical strip, or the bounding box of the parts, provided the parts sit together in one corner. Our nests did not always do that: long curved parts could be spread over the whole sheet, so every partial-sheet charging rule read 100 %.

What changes

  • The used area is in the result. On the API, every sheet in POST /v1/optimize/nest now carries usedWidth and usedHeight: the farthest point any placed part reaches from the sheet’s origin corner, in your unit. It also carries usedArea, their product, and stockUsage[].usedArea totals it per stock row. The charging rule stays yours: a horizontal cut is usedHeight × the sheet width, a vertical cut is usedWidth × the sheet height, and the bounding box is usedArea. In the app, each sheet header in Nesting mode shows the used width × height. The material-requirements table, the PDF and the Excel export show the used area too.
  • The least-filled sheet is compacted. Both nesting engines now re-pack the least-filled sheet of each material with the same parts on the same sheet. They also try fewer rotations than each part allows: 0/180, 0/90/180/270, or one orientation for every copy. They never add an angle you did not allow. The layout with the smallest used area is kept. On a one-sheet job, that sheet is the one compacted. The max engine now compacts one-sheet jobs as well; before, it skipped them.
  • Choose what “compact” means. By default the compaction keeps the smallest used area (the bounding box). If you charge a strip instead, set options.compactFor to "horizontal" (the lowest used height, for a strip across the full sheet width) or "vertical" (the smallest used width, for a strip over the full sheet height). The strip modes also try the parts turned a quarter, where you allow it. The sheet count and price stay the same in every mode.

Measured on a synthetic job built from a customer’s published dimensions: four curved strips of about 3490 × 660 mm on one 6000 × 2400 sheet, 5 mm apart, sent without allowedRotations. The used area went from 3417 × 2394 mm (0.57 of the sheet) to 3492 × 915 mm (0.22 of the sheet), with the same one sheet and the same parts. How small the used area gets depends on the parts, so no fraction of a sheet can be promised in advance.

What does not change

Sheet count, sheet sizes, price, stock usage and the placed parts are identical by construction. A compacted layout is kept only when it holds exactly the same parts on the same sheet in a smaller used area. The result stays deterministic. options.compact: false returns the layout without this step. Existing single-sheet layouts can therefore look different from before, with the parts moved toward the corner.

See the API reference for the fields.

Release

True-shape nesting gets a max engine: fewer sheets, never more

POST /v1/optimize/nest now takes engine "max": an asynchronous search that runs the instant lbf pass first, then looks for a layout with fewer sheets — and never returns more. Submit, get a job id, poll GET /v1/jobs/{id}.

The Engine API’s true-shape nesting (POST /v1/optimize/nest) packs irregular polygons for laser, plasma and waterjet work. Its default engine, lbf, answers instantly and is deterministic — and on many jobs it is all you need. But a greedy single pass can leave a last sheet half empty. The new max engine spends time looking for a layout that needs fewer sheets.

What it does

max runs the lbf pass first, so it always has a valid answer in hand. Then it searches — filling one sheet at a time, packing each as tightly as it can — for a layout with fewer sheets. It never returns more sheets than lbf: when the search does not find an improvement, you get the lbf layout and a warning that says so.

How much it saves depends on the job. On our synthetic test jobs it saved one sheet on most of them; on some it could not beat lbf, and then it said so. It never promises a sheet count up front.

How you call it

Like the 2D max engine, it is asynchronous:

  • Submit. POST /v1/optimize/nest with engine: "max" returns 202 Accepted with a jobId (metered at submission).
  • Poll. Call GET /v1/jobs/{id} until status is "succeeded" — result then holds the same nest response a synchronous call returns, with engine: "max" — or "failed". Polling spends no quota.

The search budget is options.timeBudgetMs: 60 seconds by default, anywhere from 10 to 180. Because the search is time-limited, a max nest reports deterministic: false; lbf stays deterministic. Each material needs a single sheet size, and exclusion zones and respectStock are not modelled yet — such a request is refused with a 400 before a call is charged. (Update, 2026-09-22: max now accepts several sheet sizes per material and respectStock; a polygon sheet or exclusion zones are served by lbf inside the job, with a warning, instead of a 400 — see the update.) The older reserved name sparrow is accepted as an alias of max.

How to use it

It is part of the same Engine API — same key, same account. See the API reference for the async job shape and the request and response, and the Engine API guide for how the two nesting engines compare.

Feature

Which sheet? — compare sheet sizes before you buy

A new button in the 2D stock panel runs your cut list on every sheet size you entered, one size at a time, and ranks them by sheets, total material, yield and estimated cost.

Deciding which board to order used to mean running the same job several times and writing the results on a scrap of paper. The 2D stock panel now has a ⚖ Which sheet? button that does it in one step: it takes the sheet sizes you entered, runs your cut list on each size separately, and ranks them.

For every size the table shows how many sheets the job needs, the total material those sheets add up to, the yield, and — when every compared size has a price — the estimated cost. The winner carries a “least material” badge; a size that cannot hold every part says how many parts do not fit and drops to the bottom.

The ranking is by material, not by board count, and the two genuinely disagree. On a 22-part carcass job (3 mm kerf) a 3050×1220 mm board needs 3 sheets = 11.16 m², while a 2800×2070 mm board finishes the same job in 2 sheets — but 11.59 m². Fewer boards to handle, more material paid for.

Each size is calculated from unlimited stock and without off-cut reuse, because the question is what you would need to buy, not what is already on the rack. Your own settings are untouched. Press Use this on the size you picked and the other stock rows are removed (with an Undo button), ready for a normal run.

Available on every plan, guests included, for 2D Panel jobs with at least two sheet sizes, up to six sizes per comparison. One comparison counts as one optimization. See Which sheet? — comparing sheet sizes, or the buying guide What size sheet should you buy?.

(Since 2026-09-30: Use this also opens the plan of the chosen size in the results without using another optimization, each size’s plan can be opened in the table, and the comparison can be downloaded as a PDF.)

Improvement

Band a whole piece in one click

The edge banding dialog now has an All around control — pick a banding type once and all four sides get it, so a door banded on every edge no longer needs four separate picks.

Marking a piece that is edge-banded on every side — a door, for example — used to mean setting all four sides one by one. The edge banding dialog now has an All around control at the top: pick a banding type there once and all four sides get it in one action, keeping the type. The four per-side dropdowns still let you override any single edge, and the All around control mirrors the sides — when they already share a type it shows that type. A small thing, but for anyone banding doors on a formatting saw it saves a lot of clicks.

Improvement

A print-friendly black & white PDF

A new Black & white PDF download prints your cutting plan clean on a mono laser printer — white pieces with coloured labels, black cut outlines, dimensions on every piece, and edge banding marked on the boards (now on the colour diagram too).

Printing the cutting plan on a black-and-white laser printer used to waste toner and blur the details — the colour fills came out as muddy grey. The Downloads menu now has a Black & white PDF: a print-optimized version of the same plan. Pieces are drawn white with solid black cut outlines, and only the label carries colour (so a colour printer shows colour, a mono laser prints readable grey). Every piece shows its name and dimensions in a font that grows to fill it — even the small strips — and edge banding is marked directly on the boards (a thick black line inside each banded edge shows at a glance which edges to band). The colour PDF now carries the same banding marks on its diagram too. In black and white, each part also gets a letter key (A, B, C…) — shown in a Mark column of the legend and stamped on every piece in the diagram — so you can read the board without colour. And every distinct board is now drawn full size, one per A4 page, directly above the detailed cut list — whether the plan is one layout or several. The earlier small overview is gone: a board you cut from needs to be readable, so you flip through the big boards (that is your review of the whole job) and then tick the pieces off the list beneath them. Each board prints full size, one per A4 page, with the page orientation matched to the board (a tall board on a portrait page) so it fills the sheet. The Excel export also gained a Layout (B&W) tab with the same extracts.

Improvement

2D panels now read “width × length”, not “width × height”

The second dimension of a 2D sheet is now labelled Length, matching how a board is really described (width × length × thickness). Wood and Nesting are unchanged.

A flat sheet is described by its width and its length — a board lying down doesn’t have a “height”. CutOptim used to label the 2D panel’s second dimension Height, which read as confusing. It now says Length throughout 2D Panel mode: the stock and parts tables, the paste hints, and the CSV and Excel exports. Nothing about the cut itself changes — only the label. Wood cutting keeps width × height × length (a beam really does have a cross-section height), and Nesting is unchanged.

Improvement

A roomier desktop view for your cut list

A new focus toggle expands the input to full width — Stock and Parts side by side, no sideways scrolling — with a text-size control to enlarge the tables.

Entering a long cut list on a wide screen used to feel cramped: the input sat in a narrow column while the cut plan took the other half, and the parts table scrolled sideways. There is now a focus toggle (⛶) in the top bar. It expands the input to the full width and tucks the plan away, so your stock and parts tables get the whole screen — and on wide monitors the Stock and Parts tables sit side by side. Run the optimizer and the plan comes back. While you are in this view, a small A− / A+ control enlarges the tables if the text is too small to read comfortably. On phones the Input / Results tabs already did this — now the desktop has the same room.

Improvement

Limited stock: the order you enter sheets no longer matters

In Limited stock mode the plan used to depend on the order you listed your sheets or bars — a bad order could drop parts that actually fit. Now the result is the same whichever order you enter them, and parts that fit only one scarce size are kept.

If you cut from Limited stock — a fixed set of sheets or bars, each in a set quantity — the plan used to depend on something it never should have: the order you typed your stock rows in.

A workshop reported it clearly. The same job, the same stock, the same settings: listed one way, every part was cut; listed another way, parts were dropped as “not enough stock” — even though the stock was enough. A wide piece that fits only your single widest sheet was the giveaway: if that sheet came late in the list, the optimizer had already spent it on parts that could have gone anywhere, and the wide piece had nowhere left to go.

That is fixed. In Limited stock mode CutOptim now reserves a scarce size for the parts that can only be cut from it, and it evaluates the job independently of the order your rows are in. Enter your stock in whatever order suits you — the result is the same, and a job whose parts genuinely fit will cut all of them.

This applies to 2D panels, 1D linear and wood cutting, and to the Engine API. It only affects Limited stock mode; unlimited stock was never order-sensitive. And the change can only ever place more parts, never fewer — an existing plan is never made worse.

Feature

Price by the square foot or square metre

Put a per-area rate on a material and CutOptim fills in the price of every part cut from it — the way glass, mirror and panel shops actually quote. Off by default, 2D only.

Glass, mirror and panel merchants do not price per piece — they price per unit of area. The customer brings a size, the shop multiplies it by a rate per square foot (or per square metre), and quotes the total.

CutOptim already worked out the area for you. Now it can do the multiplication too.

Turn on Area-based pricing in the left sidebar under More — the switch sits in the top group, beside Material-specific mode and Edge Banding. It is off by default, and it is 2D Panel only — a bar or a length of timber is sold by the running metre, not by area, so the control is hidden in 1D Linear and Wood mode.

Because the rate lives on a material, turning it on also switches on Material-specific mode: every stock and part row then needs a material, and the job will not run until each one has one. That is deliberate — a per-area price only means anything once every piece knows which material it is cut from.

Where the rate lives

On the material, not on the job. Brown glass and clear glass are different prices, and they stay different from one order to the next — so the rate belongs with the material and is there again tomorrow.

Open the Material inventory, press ⚙ on a material, and you get two fields:

  • Selling price per area — fills in the Selling price of every part cut from that material.
  • Purchase price per area — fills in the Price of every stock sheet of it, from the board’s own size.

Assign the material to a row and the price appears. Leave a rate empty and nothing is filled in: an empty rate means this material says nothing about area pricing, which is not the same as a rate of zero.

The bit that would otherwise bite you

The rate is typed in whatever unit you are working in, and the label always says which — /ft² in inch mode, /m² in millimetres and centimetres.

Those are the same rate written two ways: 395 per square foot is 4,251.74 per square metre. So switching units re-labels the field and restates the number, but never changes a single price. We store one canonical rate behind both, precisely so that flipping the toggle cannot quietly multiply your quotes by ten.

A price you typed is yours

Auto-filling stops the moment you type in the field yourself. A price you entered by hand survives resizing the piece and survives changing the rate — a negotiated or deliberately rounded price is a decision, and we are not going to throw it away without telling you. Clear the field to hand that row back to the calculator.

On your documents

The rates a plan was priced with are printed in the How we optimised summary on both the PDF and the Excel export — so your customer can check area × rate instead of taking the total on trust. The rate is recorded when you run the job, not when you print it, so a plan you cut last week keeps the price it was quoted at.

Area-based pricing needs an account and is free on every signed-in plan, Free included. The customer Quotation PDF is a separate matter — that document is Workshop-plan only.

Feature

Work in centimetres

The measurement toggle now has three units — mm, cm and inches. Centimetres are a full working unit: the tables, the cut plan, the exports and the saved-cut badge all follow your choice.

The unit toggle at the top of the Settings panel now offers three units: mm · cm · in.

Centimetres are a full working unit, not just a display option. Everything follows your choice — the stock and part tables, kerf and trims, the on-screen cut plan, the PDF, Excel and CSV exports, the piece labels, and the badge on each saved cut. A plan you made in centimetres reopens in centimetres.

Why we added it: plenty of you work in centimetres — furniture and glass sizes are quoted that way in most of Europe — and until now the only options were millimetres or inches. That left people either multiplying everything by ten by hand or, worse, typing centimetre numbers into a millimetre workspace and getting a plan that was wrong by a factor of ten.

A few details worth knowing:

  • Switching converts your data. If your numbers are already in the tables, changing the unit converts every dimension after a quick confirmation. If the workspace is still untouched, it re-seeds with round numbers for that unit instead — in centimetres the demo sheet becomes 244 × 122 cm and the default kerf 0.3 cm.
  • Centimetres keep two decimals (millimetres keep one, inches three). That is deliberate: a single decimal would put a 1 mm floor on centimetre mode, coarser than millimetre mode, so switching units could quietly cost you precision. Trailing zeros are never shown — a 244 cm board reads 244.
  • A finished optimization keeps the unit it was made in. Switching afterwards never re-labels a completed plan, never invalidates it, and never costs you a run.
  • DXF in centimetres (corrected 2026-10-13): until 13 October a DXF exported from a centimetre plan declared millimetres while its numbers were centimetres, so CAD/CAM opened the parts 10× too small. The DXF is now written in millimetres and opens at the real size. If you downloaded one, export it again.

Millimetres remain the default, and nothing changes for existing projects unless you switch.

Feature

Change your password from your dashboard

A new Account & security section lets you change your password, set one if you joined with Google, and sign out of every device at once.

Your dashboard now has an Account & security section, grouped together at the bottom of the page.

From there you can change your password — after confirming your current one — and, if you created your account with Google, set a password so you can also sign in with your email address. You’ll also find Sign out of all devices, which ends every active session at once (handy on a shared or lost computer), along with your sign-in method, join date and last sign-in.

Nothing else moved: data export and account deletion stay in the Privacy & data section just below.

Improvement

CutOptim passed an independent security audit

An external party reviewed the whole application. We addressed every finding — stronger isolation between team workspaces, safer exported files, and tighter output handling across the app.

An independent external party has completed a full security review of CutOptim, covering the app, the account and team features, and the way your data is stored and exported.

The review flagged a small number of areas to harden, and we’ve addressed all of them. The improvements include stronger isolation of data between team workspaces (joining a shared workspace now always requires the invited person to accept first), safer exported files (names in CSV and spreadsheet exports can no longer be interpreted as formulas by Excel, Google Sheets or LibreOffice), and tighter handling of colours and labels throughout the app.

None of these required any action on your part, and there is no evidence any of them were ever used against an account. Your projects stay private to you and your team, and we will keep reviewing security as CutOptim grows.

Improvement

Team invitations now need consent

Adding someone to your Team Workspace now creates a pending invitation they must Accept from their own Dashboard before they join — a colleague can no longer be added to a team without their consent.

Adding a colleague to your Team Workspace now requires their consent. Until now, typing a teammate’s email and clicking Add placed them in your workspace right away. From now on that creates a pending invitation instead — no one joins a team without agreeing to it.

The new flow: the owner invites a colleague by email address from the Dashboard. The colleague signs in and sees an Accept / Decline banner at the top of the Team management area of their own Dashboard. Only after they click Accept do they join — and only then do they get the owner’s plan and the workspace’s shared projects. They can Decline instead, and a member can leave later the same way.

There is no invitation email: tell your colleague out-of-band that you have invited them, and the invitation waits in their Dashboard until they respond. Everything else about the shared workspace is unchanged — still up to 3 members, and projects saved by an active member still belong to the organization.

See Team Workspace for the full details.

Update, 2026-10-20: invitations are now e-mailed, and an address without an account can be invited too — see Team invitations now arrive by e-mail.

Fix

Engine API: what the max engine models, and a CSV export fix

The async max engine solves one stock format at full sheet size, so a request carrying a second format, trim, respectStock, material or grainGroup is now refused up front instead of coming back as a plan for a different job. Plus: CSV exports now quote part names.

An audit of the Engine API turned up three things worth telling you about. None of them change the default engine, and no existing plan changes shape.

The max engine says what it cannot do

The asynchronous max engine packs one stock format, at full sheet size, with unlimited supply. Until now a 2D request that asked for more than that was still accepted: the extra stock format quietly disappeared, respectStock quietly became unlimited supply, and an options.trim you had reserved for the saw was quietly cut into. You got back a confident, deterministic plan for a job you had not sent, and nothing in the response said so.

Those requests are now refused at submission with 400, naming each unsupported feature — a second stock row, options.trim, options.respectStock, any material, any grainGroup. The refusal happens before a call is reserved, so it costs you nothing, and before you wait a minute for a result you would have to throw away. Send those jobs to the default heuristic engine, which models all of them.

Options that only make the plan less tuned — tolerance, minimizeCost, maxCutStages, minimizeRotations, firstCut, effort — still go through, and are now listed in warnings instead of disappearing. A max result reports no offcuts.

Validate now agrees with optimize

POST /v1/validate/2d used to reject engine: "max" with a 400 saying the engine was not available — for a body POST /v1/optimize/2d accepted. The two now give the same verdict for the same body, which is the whole point of a validate endpoint.

CSV exports quote part names

A part name containing a comma — “Door, left” — used to emit an extra field, shifting every column after it. CSV exports from the app and from the API (include: ["csv"]) are now RFC 4180 quoted. A name without a comma, quote or line break produces exactly the same bytes as before.

The API reference and the OpenAPI document describe all of this in full.

Release

The max engine: the proven optimum on the Engine API

A new asynchronous Engine API engine for 2D. engine "max" runs a server-side tree search that reaches the proven optimum on far more jobs — you submit the job, get a job id, and poll GET /v1/jobs/{id} for the plan. Still deterministic and saw-cuttable.

The Engine API’s default engine is fast and always saw-cuttable, and for the overwhelming majority of jobs it is exactly what you want. But on a large, valuable 2D job, the last few boards can be worth waiting for. That is what the new max engine is for.

What it does

max is a server-side tree search (2D only) that reaches the proven optimum on far more jobs than the default — the plan matches the theoretical minimum number of boards, provably. Its layouts are still guillotine-cuttable (producible on a panel saw), and it is still deterministic: the same request always returns the same plan.

The trade is time. A max solve takes seconds to a minute, where the default answers in milliseconds. So it does not hold the connection open waiting.

How you call it

Because it is slow, max is asynchronous — the one place the Engine API does not answer in the response (joined by the nesting max engine on 2026-09-21):

  • Submit. POST /v1/optimize/2d with engine: "max" returns 202 Accepted with a jobId (metered at submission).
  • Poll. Call GET /v1/jobs/{id} until status is "succeeded" — the result field then holds the same 2D response a synchronous solve returns — or "failed", with the reason in error. Polling spends no quota, and you only ever see your own jobs.

It is 2D only: 1D, wood and true-shape nesting are unaffected. (Since 2026-09-21 true-shape nesting has its own asynchronous max engine — see True-shape nesting gets a max engine.) The default (heuristic) and the opt-in balanced engine are unchanged and still synchronous — reach for max only when a big job is worth the wait.

How to use it

It is part of the same Engine API you already call — same API key, same account, same deterministic contract. See the API reference for the engine list, the async job shape and the request and response, and the benchmarks for how we measure a plan against the theoretical minimum.

Release

True-shape nesting is now in the app

The in-app optimizer gets a fourth mode: Nesting. Import your part outlines as SVG or DXF, nest irregular polygons onto sheets with exclusion zones, and export the layout as SVG, DXF, PDF or Excel — for laser, plasma and waterjet.

True-shape nesting was on the Engine API; now it is in the app. The optimizer gains a Nesting mode — a sub-tab under 2D, next to Panel — a genuinely different problem from the rectangular modes.

What it does

The 2D, 1D and Wood modes cut rectangles with a guillotine saw. Many jobs are not rectangles: a steel bracket, a triangular gusset, a gasket with a hole. Nesting mode packs parts by their real outline — arbitrary polygons interlock into each other’s concave pockets, so the empty air a bounding-box packer wastes is reclaimed. It is the mode for laser, plasma and waterjet cutting.

How to use it

  • Import your outlines. Open the Nesting tab and click Import SVG/DXF — the app reads closed outlines from a DXF (with arcs flattened) or an SVG (paths, polygons, circles), and turns concentric outlines into holes. No file to hand? Click Demo.
  • Add sheets — and exclusion zones. Add your stock sheet sizes, and on any sheet mark an exclusion zone the engine keeps every part off: a defect, a knot, a clamp footprint or a pre-printed area. This is something the rectangular modes cannot express.
  • Run and export. The viewer shows every part on each sheet with the sheet count and the fill density. Export the layout as SVG, DXF, PDF or Excel from Downloads.

The honest metric

The result reports density — the placed polygon area over the used sheet area, with concave pockets counted as empty. Do not compare it to a 2D-panel yield: a bounding-box packer counts notch-air as solid and reads a higher number for a worse layout. The metric to compare on is sheet count on the same parts. The layout is deterministic, so a quote or a cut program built from a nest reproduces exactly.

See the Nesting guide for the full walkthrough.

Release

True-shape nesting on the Engine API

The Engine API now packs irregular polygons — for laser, plasma and waterjet — with POST /v1/optimize/nest. Parts interlock into each other's concave pockets, per-sheet exclusion zones keep clear of defects and clamps, and the result is deterministic.

The three optimization modes so far all cut rectangles. The Engine API now has a fourth mode for a genuinely different problem: true-shape nesting — packing arbitrary polygons onto fixed sheets, for laser, plasma and waterjet cutting.

What it does

POST /v1/optimize/nest takes parts as outlines (a polygon, with optional interior holes), not a width × height. Because it knows the real shape, parts interlock into each other’s concave pockets — the notch-air a bounding-box packer wastes is reclaimed. On a representative 272-part job it uses 6 sheets where the same parts fed to a rectangular packer by their bounding box need 9 — a third less material, from the shape alone.

It is a different class of engine (a geometric collision solver), so it runs alongside the rectangular modes rather than replacing them.

Two things the rectangular API couldn’t express

  • Exclusion zones. Mark a region of a sheet as off-limits — a defect, a knot, a clamp footprint, a pre-printed area — with stock[].exclusions, and no part is placed there.
  • True holes. A part with a cut-out is a real outline plus inner rings, not an approximation.

Material partition and the opaque meta passthrough work exactly as on the other modes, and the layout is deterministic: the same request always returns the same nest, so you can cache it, diff it and reproduce it.

Honest about the metric

Nesting reports sheet count, not a density percentage. A bounding-box packer counts the empty air inside each part’s rectangle as solid, so its “yield” reads higher for a worse result — the only cross-comparable number is how many sheets the same physical parts actually need.

How to use it

It’s part of the same Engine API you already call — same API key, same quota, same deterministic contract. See the API reference for the request and response shape, and the benchmarks for the measured result. True-shape nesting has since also come to the app itself, as a separate Nesting mode.

Release

A box and cube template for your cut list

The furniture-template picker gets a fifth template: a box. Enter the outer width, height and depth and a board thickness, choose open or closed, and get the exact parts — including a cube when the three sizes are equal.

The furniture-template picker had four templates — TV stand, bookshelf, wardrobe and kitchen base cabinet. It now has a fifth: a box. It is the simplest of them, and the one people ask for most often: a storage box, a crate, a drawer box — or a cube.

What it does

You enter the outer width × height × depth and the board thickness, and choose whether the box is open or closed with a lid. The template returns the exact parts to cut, with the thickness already subtracted:

  • Front and back — the two full width × height walls.
  • Ends — the two side walls, sized to fit between the front and back.
  • Base — sitting inside the four walls.
  • Lid — added only when the box is closed.

Why a template, not mental arithmetic

Because a cube is not six identical squares. With butt joints, the walls overlap: on a cube the two front/back faces are the full size, the two ends are shorter by two board thicknesses, and the base and lid shorter on both sides. Cut six equal squares and the box will not assemble to the size you meant. Set width, height and depth equal and the template works the offsets out for you.

How to use it

In the app, click Furniture templates above the parts table, choose Box, enter your sizes, and insert — the parts drop straight into the cutting list, ready to optimize. It works on every plan.

See the furniture templates guide for the full walkthrough.

Feature

The Engine API now returns a drawing — inline SVG, DXF or CSV, plus metadata and free validation

Ask the Engine API for include:["svg","csv","dxf"] and the response carries the layout as a ready-made file. Attach a meta object to parts and stock and get it back verbatim. And validate a request for free — no key, no quota.

One for the people writing software against CutOptim. If you just cut in the app, nothing changed — this is all on the Engine API, and every existing call returns exactly what it did before.

Until now the Engine API was the one cutting API in the field that returned nothing but raw coordinates. Three things change that.

A drawing in the response, not just coordinates

Add an include array to any optimize request and the response carries the layout as a ready-made file, inline in the JSON — no storage, no second call:

POST /v1/optimize/2d
{ "parts": [...], "stock": [...], "include": ["svg", "csv", "dxf"] }
  • svg — a self-contained 2D layout drawing you can render straight into a page or a PDF. (2D only; a 1D or wood request returns a warning instead.)
  • dxf — an R12/AC1009 drawing on layers STOCK, PARTS and LABELS, ready for CAD or a CNC toolchain.
  • csv — a plain cut list.

include still narrows the response too: its cutPlan and offcuts values trim those out. So ["svg"] adds svg and drops cutPlan/offcuts; ["cutPlan","offcuts","svg"] keeps everything and adds svg. Omit include and you get the default response, unchanged.

Your own identifiers, returned

Attach a meta object — an ERP article number, an order-line id, a customer reference — to any part or stock row, and it comes back verbatim on every placed piece and every sheet or bar:

{ "name": "Door", "w": 400, "h": 600, "qty": 2, "meta": { "sku": "D-400x600", "orderLine": 42 } }

It is never parsed and never affects the layout — it is there so the cut plan lines up with your own system without you having to match on names.

Validate for free, before you spend a call

Three new endpoints check a request without solving it:

POST /v1/validate/2d   ·   /v1/validate/1d   ·   /v1/validate/wood

They take the same body as the matching optimize endpoint, and they are free — no key, no quota. A malformed request comes back as a 400 naming the exact bad field; a well-formed one returns valid: true plus feasibility warnings, such as a part that fits no stock. You can validate your payloads while building the integration — before you even hold a key — and confirm a request will not be rejected without spending one of your monthly calls.

One correctness fix, for tidiness

On 1D and timber, a rod’s reported remaining (and its offcuts) is now the usable off-cut — the kerf of the cut that frees it is already deducted, so it is the reclaimable length rather than the raw gap. Yields, cut counts and prices are unchanged; only the reported leftover is a kerf smaller, and more honest.

With these, the OpenAPI document now describes eight endpoints, and the reference has the full request and response shapes.

Engine API reference · Tell us about your integration

Feature

Fence templates: turn a run into a 1D cut list

A new fence template picker — picket, horizontal board, or post-and-rail — turns your fence run, height and post spacing into a cut list of posts, rails and pickets, then hands it straight to the 1D linear optimizer.

Building a fence is a one-dimensional cutting job: posts, rails, and pickets, all cut to length from stock timber. Now CutOptim plans it for you.

The new fence template picker turns the three numbers you measure on site — run length, height, and post spacing — into the full cut list, and drops it straight into the 1D linear optimizer so you buy the fewest boards.

Three fence types

  • Picket fence — vertical pickets on horizontal rails.
  • Horizontal board fence — boards fixed straight to the posts.
  • Post & rail fence — posts and through-rails, ranch style.

Pick one, enter your dimensions, and the tool lists every post, rail, and picket with its length and quantity. It counts the bays for you (rounding up for the short last bay), and — the part people forget — cuts each post to the height plus the length set in the ground, not just the fence height.

Two ways in

  • On the new How to Build a Fence guide, an embedded widget builds the cut list and carries it into the app with one click.
  • Inside the app, in the 1D linear parts section, a Fence templates button opens the same picker and inserts the pieces directly.

Fence templates are free on every plan, guests included. Set your fence up, run the optimizer, and read off exactly how much timber to buy.

Release

Free now includes the entire Pro toolkit

Every feature that used to be Pro — edge banding, exports (DXF/SVG/Excel), the material inventory, cost mode, the sawing plan, branding — is now on the Free plan too. Pro adds unlimited runs, cloud saving, share links and priority support (corrected 2026-09-25).

We’ve retired feature-gating. The Free plan now includes the full Pro feature set — there is no longer a wall between “basic” and “pro” tools.

What Free now includes

Everything that used to require Pro is now free on every account:

  • Off-cut inventory — save leftovers and reuse them automatically
  • Material library and material-specific mode
  • Cost mode — price per sheet and cost-minimizing optimization
  • Exports: DXF, SVG and Excel (PDF and CSV were always free)
  • Edge banding calculator, panel label printing
  • Cutting sequence (step-by-step sawing plan) and calibration cut
  • Company branding on PDFs and custom fields

What Pro still adds

Four things (corrected 2026-09-25):

  • Unlimited monthly runs. Free includes 3 optimizations per month; Pro removes that cap.
  • Cloud project save. Saving your projects and cut layouts to the cloud — so they sync across devices and are waiting for you next time — stays a Pro feature. On Free you can use every tool; you just can’t save a project to the cloud.
  • Share a plan by link. A link is made from a saved cut, so sharing follows cloud saving and stays on Pro. (corrected 2026-09-25)
  • Priority support. Messages from Pro and Workshop accounts are handled first. (corrected 2026-09-25)

If you cut occasionally, Free now gives you the complete toolset. If CutOptim becomes a weekly habit — or you want your work to persist across sessions — Pro is the upgrade.

Pay-as-you-go, without a subscription

Prefer not to subscribe? Pay-as-you-go credits buy extra runs once your 3 free monthly optimizations are used up — one credit covers one full job (no limit on parts), and each pack stays valid for 12 months. Every tool is already included on every run, so a credit is simply more runs, not a feature unlock. Good if you cut occasionally; the Pro subscription is the better value once CutOptim becomes a weekly habit.

Workshop is unchanged

The Workshop plan keeps its team and shop features — the quotation PDF, grain matching groups, a shared workspace for up to 3 people, and the machine controls (max cutting stages, rotation minimising) — and we’ll keep expanding it.

Update 2026-10-13: grain matching has been rebuilt on sets — the parts of a set are now cut side by side from one piece of board, exactly one saw gap apart — and it is no longer limited to Workshop: it is on every signed-in plan (Free within its monthly runs, Pro with a monthly allowance, Workshop unlimited). See Grain matching, rebuilt.

Nothing to switch on. Open the app and every tool is there.

Improvement

Optimizing by cost is easier to find — and reminds you to add prices

The Minimize waste / Minimize cost goal is now front-and-centre in Settings. Picking Minimize cost reveals the price columns for you, and if you run it with no stock prices, CutOptim reminds you — without blocking the run.

CutOptim has always been able to optimize for the lowest total bill instead of the least material — but the goal selector was buried, and it only does anything once your stock has prices. Both were easy to miss. We’ve fixed that.

What changed

  • The goal selector is promoted. Minimize waste (the default) and Minimize cost sit together in Settings, clearly labelled — both available on every signed-in plan, Free included; without an account Minimize cost asks you to create a free account (corrected 2026-09-25).
  • Choosing Minimize cost reveals the price columns automatically. The 💰 price column appears on the Stock and Parts tables the moment you pick the cost goal — no separate “Show price columns” step.
  • A reminder when prices are missing. Minimize cost only changes the plan when your stocks have different unit prices. If you select it with none entered, CutOptim shows a one-off reminder to add them — it never blocks the run. Without prices, Minimize cost and Minimize waste produce the same plan, so your result is still correct either way.

Why it matters

Minimize cost lets you mix stock sizes to lower the bill — big parts on wide boards, small parts on cheaper narrow ones in 2D, or the cheapest bar length in 1D. It can even use a little more material to spend less; priority stars still win over price. This change is purely about making the goal easy to find and hard to trigger by accident — running the cost goal and expecting a different plan when there are no prices to optimize against.

Nothing to switch on — open Settings and the goal is right there.

Feature

A Rebar Cutting & Bending Optimization API — and we're looking for design partners

We're extending the CutOptim engine to reinforcement steel: send a bar bending schedule plus your stock, get an optimized cutting plan, bending schedule and offcut inventory over REST. In development — design partners wanted.

We’re taking the CutOptim engine into a new domain: reinforcement steel.

The new Rebar Cutting & Bending Optimization API takes a bar bending schedule (BBS) plus your available stock and returns an optimized cutting plan, a bending schedule with cut lengths and weights, and an offcut inventory — deterministic and version-pinned, over a single REST call. It uses BS 8666:2020 shape codes with standard bending deductions.

As far as we can tell, no rebar-aware developer API exists today: generic cutting APIs know nothing about shape codes, bending deductions or machine formats, and rebar suites keep their optimizers locked inside desktop products. Optimized planning cuts steel waste from a typical 5–8% to 1–3% (published case studies report 0.9–1.5%).

It’s in development, and we’re validating it with a handful of design partners before we build the rebar layer. If your software lives in the rebar workflow — an ERP, an estimating tool, a detailing add-in or machine software — we’d love 20 minutes of your perspective. Get in touch.

Feature

Material-specific mode: cut each material only from its own stock

Tag every stock and part with its material and the optimizer packs each material only against stock of the same material — 18 mm never from 12 mm, oak never from MDF — in one run across 2D, 1D and Wood.

Most jobs use more than one material at once. Until now, keeping them apart meant running the optimizer once per material and stitching the results together by hand. Material-specific mode does it in a single run.

Turn it on (the toggle in the Settings strip, a Pro feature), and every stock and part row gains a Material column. Tag each row, and the optimizer partitions the job by material: a part tagged “oak” is only cut from stock tagged “oak”, 18 mm only from 18 mm. It works in all three modes — 2D Panel, 1D Linear, and Wood.

What it does

  • A hard partition, not a label. Tagging a material actually changes the layout — material X parts only use material X stock. That is different from naming or colouring a piece, which only affects how it reads on the diagram.
  • “No matching material” instead of a wrong cut. If a part is tagged with a material you have no stock for, the plan says so, rather than quietly cutting it from another board.
  • Wood tells species apart. Wood mode already separates by cross-section; with material on, an oak 50×50 and a pine 50×50 become separate sections too.
  • The Material inventory now holds wood. Save sheet, bar and wood materials — each with a cross-section or size, a colour, and its own kerf and trim — and drop them onto a row with one click. Wood materials load into the Wood table (they used to land in the linear one).
  • Also on the Engine API. All three endpoints accept an optional material string on parts and stock and return a per-material breakdown.

Material-specific mode is available on the Pro and Business plans. Leave it off and everything works exactly as before.

Update 2026-09-25: Material-specific mode is now available on every signed-in plan, Free included — see what each plan includes.

Feature

New: banding on the cut list, a per-piece banding diagram, and layout images in Excel

Edge banding now shows per piece — four columns on the Excel cut list and a coloured diagram in the PDF — plus every sheet layout is embedded as an image in a new Excel Layout tab, and banding types get a real colour swatch.

The edge banding by type update reported the linear metres you need to order. This one shows where the banding goes, piece by piece, and puts a picture of every sheet layout right inside the Excel workbook.

What’s new

  • Banding on the Excel cut list. When a 2D job has edge banding, the Cut list tab gains four columns — Top, Right, Bottom, Left — naming the banding type on each edge (blank where an edge is not banded). Filter or sort the list by which edge gets which banding.
  • A per-piece banding diagram in the PDF. The material-requirement page now draws each banded piece as a small figure with every edge coloured by its banding type, so the bench sees at a glance which edge of which piece gets which banding. It sits below the per-type “how much to order” table you already had.
  • Layout diagrams in Excel. A new Layout tab embeds a picture of each distinct sheet layout — one image per sheet — so you can see how to cut the board without leaving the workbook. Identical layouts collapse to a single image with a ×N note, just like the PDF cutting plan. (2D jobs.)
  • A real colour for each banding type. In the banding-type library the colour is now picked from a colour swatch instead of typed as text. That colour is what the new per-piece diagram uses to draw the type’s edges. Types you created before still get a stable, distinct colour automatically until you set one.

The banding diagram and columns appear only when a job actually has banding, so unbanded exports are unchanged. Everything here is on Pro (like the Excel and SVG exports), and banding is still metadata — it never changes the layout.

Have a feature request or hit a bug? Reply to any CutOptim email or use the contact form.

Update 2026-09-25: edge banding and the Excel and SVG exports are now available on every signed-in plan, Free included — see what each plan includes.

Feature

New: edge banding by type, with per-type metres

Assign a banding type to each edge, not just on/off — and get the linear metres you need broken down by type, in the summary, PDF and Excel. Now on the Engine API too, for ERP integrations.

Edge banding used to be a simple on/off per edge. Now each edge can carry a banding type — a named reference you define once — and CutOptim totals the linear metres per type, so you order the right amount of each banding.

What’s new

  • Per-edge type. In the EB dialog, each side (Top / Right / Bottom / Left) is now a dropdown: None, No type, or one of your saved types.
  • A type library. Give each type a name (e.g. ABS oak 22×1), a thickness, a price per metre and a colour. Open it with Manage types in the EB dialog; your types sync across devices.
  • Metres broken down by type. The optimization summary, the PDF material-requirement page and the Excel Materials tab now show a line per banding type plus an order total — exact geometry, no waste margin (add your own overage at the bench).
  • CSV. The parts CSV EB column accepts typed codes: T:ABS oak 22;L:ABS white 22 assigns a type per side (or keep the old TRBL for untyped). Names resolve against your library.

Edge banding remains a Pro feature, and it’s still metadata — it never changes the layout.

For developers: on the Engine API too

The Engine API’s 2D endpoint now accepts per-edge banding. Each part in POST /v1/optimize/2d can carry an edgeBanding object naming a type reference per side; the response then returns an edgeBanding block with the linear metres per reference, per part and as an order total. It’s library-independent — send your own ERP codes. See the API reference. (1D and wood do not have edge banding.)

Have a feature request or hit a bug? Reply to any CutOptim email or use the contact form.

Update 2026-09-25: edge banding is now available on every signed-in plan, Free included — see what each plan includes.

Fix 2026-10-12: a saved project you reopen (or a restored draft) now shows its banding type names in the PDF, the Excel file and the on-screen banding box straight away. Before, typed edges read “No type” there until you had opened the EB dialog once.

Improvement

Cost-mode exports now show the money-versus-material trade-off

When you optimise for cost, the PDF and Excel summaries now state how much cheaper the plan is than the least-material one — and any extra material that saving cost — so the decision is on the page.

When you optimise with Minimize cost, the plan deliberately trades a little material for a lower invoice. Now your exported documents say so — in numbers.

What changed

The “How this was optimized” section of the PDF and Excel exports already named the optimisation goal. In cost mode it now adds one more line: how much this plan saves on the invoice compared with the least-material plan, and how much extra material that saving cost — in all three modes (panel, linear, wood).

So instead of wondering why a cost-optimised plan used an extra board or a longer bar, the reason is spelled out: “Cost mode: €X cheaper invoice than the least-material plan, using Y more material.” When cost mode happens to be cheaper and use less material, it simply says so.

Why it matters

A plan that spends more material to save money looks wrong at a glance — until you see the money it saved. Putting both halves of the trade-off in the deliverable means the shop, and the customer reading the quote, can see the decision was deliberate and worth it.

Nothing changes for Minimize waste. The explanation appears only in cost mode, only when prices are set, and only when a cheaper plan genuinely existed.

Feature

New: a Speed vs density switch for the optimizer

Pick how hard the optimizer searches. Balanced (the default) stays the densest; Fast skips the one expensive step for a much quicker solve on large jobs. In the app's Advanced settings and as an effort option on the Engine API.

If you never touch it, nothing changes — the default is exactly today’s optimizer, giving the densest saw-cuttable plan. The new switch simply lets you trade a little of that density for a much faster solve when a job is large.

What it does

The 2D optimizer runs a multi-strategy search and keeps the best layout. Most of that search is cheap, but one step — a per-board re-search that squeezes out the last few percent on big, varied jobs — is expensive. The new Speed vs density setting lets you skip that one step:

  • Balanced (default) — the full search, for the densest guillotine plan. Unchanged from before.
  • Fast — skips the expensive step. Noticeably quicker on large jobs, for a few points less yield. Still fully saw-cuttable, and never denser than Balanced (it searches a subset of the same layouts).

On the small-to-medium jobs most people run, the two are usually identical — the difference only opens up on large jobs of several hundred parts.

Measured

On a demanding 1,550-part job (a 2.07 × 5.6 m board):

  • Balanced: 330 boards, 80.8% yield.
  • Fast: 350 boards, 76.2% yield — solved about 2.5× faster.

So Fast trades roughly 5.7% more material for a much shorter solve. Leave it on Balanced unless a very large job is slow and you want the speed.

Where to find it

  • In the app: Advanced settings → Speed vs density. It’s a per-project setting, so it saves with the project like kerf and trim.
  • On the Engine API: a new effort option on POST /v1/optimize/2d (values "fast" / "balanced", default "balanced" — omitting it is unchanged). See the API reference for the measured trade-off, drawn.

Have a feature request or hit a bug? Reply to any CutOptim email or use the contact form.

Improvement

Cost mode now mixes stock sizes to find the lowest total bill

With several priced stock sizes, Minimize cost now combines them on one job — big parts on wide boards, small parts on cheaper narrow ones — to reach the cheapest invoice, even when that uses a little more material.

When you optimise with Minimize cost and your stock sizes have different unit prices, CutOptim now looks for the cheapest combination of those sizes — not just the single cheapest one.

What changed

The default goal, Minimize waste, picks the plan that uses the least material, and that is unchanged. Minimize cost (Pro) has a different job: get your total bill as low as possible. As of today it does that far better when you have several priced stock sizes:

  • In 2D it mixes stock sizes on one job. Big parts go on wide, expensive boards; small parts go on cheaper, narrow ones — whichever split costs the least in total. Before, cost mode had to run the whole job on a single stock size.
  • In 1D it picks the cheapest bar length, choosing a shorter, cheaper bar even when it means buying a few more.

Because cost mode optimises money, not material, the cheapest plan can use a little more material or more boards than the smallest-area plan — that is the point of the mode, and it is now stated clearly. It never leaves a part out to save money.

When it helps most

Shops that stock many board or bar sizes at different prices — especially with per-piece pricing — see the biggest saving, because that is exactly where mixing sizes beats using one size for everything. On our benchmark set of real cut lists, this closed most of the cost gap on the hardest multi-stock jobs.

Nothing changes for Minimize waste or for jobs with a single stock size. To use it, switch the optimisation goal to Minimize cost in Advanced settings (Pro), and make sure each stock row has its price.

Update 2026-09-25: Minimize cost is now available on every signed-in plan, Free included — see what each plan includes.

Release

CutOptim is now available in Croatian

The whole of CutOptim — interface, guides, calculators, app documentation and this changelog — now speaks Croatian. Everything lives at /hr, priced in euros, with the same optimizer under the hood.

CutOptim now speaks Croatian. Every part of the product — the app interface, all guides and calculators, the full app documentation and this what’s-new feed — is available in Croatian, served at cutoptim.com/hr and priced in euros.

This is a real translation, not a machine pass: written for a Croatian carpentry and panel-cutting audience, with the trade vocabulary a workshop actually uses — plan rezanja, ploča, žica, otpad, iskoristivost, kantiranje.

What is in Croatian

What has not changed

The optimizer, the algorithms and your data are exactly the same. Croatian is a new way in, not a different product. Prices are shown in euros, the currency the rest of the eurozone already sees.

Switch languages any time from the globe menu in the top bar. Have a feature request or spotted a translation that reads wrong? Reply to any CutOptim email or use the contact form.

Improvement

The optimizer now always picks the most material-efficient stock size

With several stock sizes entered, CutOptim now chooses the one that uses the least material — the same answer whichever order you listed them in. Inch sizes also keep their full three-decimal precision everywhere.

When you enter more than one stock size — say a 1.5 × 5 m board and a 1.5 × 4 m board, or 6 m and 1.5 m bars — CutOptim now always picks the size that spends the least material for your parts.

What changed

The optimizer compares every stock size on its own as well as mixed together, and ranks the plans by total material used first: the total board area in 2D, the total bar length in 1D. The number of boards or bars is now only a tie-breaker.

Two things this fixes:

  • Order no longer matters. The same job used to give a different plan depending on which stock row you listed first — one arrangement could quietly waste a third more material. Now you get the same, material-best plan either way.
  • A big board no longer beats two small ones that hold less. The ranking used to prefer the plan with fewer boards, so a single large sheet could win over two small sheets that together used far less material. That is corrected.

The ★ star on a stock row still works — it just decides which size is consumed first, never whether a larger size wins over a materially cheaper one. In cost mode the optimizer still minimises total price, which may mean a cheaper size that is not the smallest.

Also: full precision in inch mode

Sizes in inch mode now keep their three decimals everywhere, including parts brought in from a furniture template — a value like 80.125 (an exact eighth of an inch) stays 80.125 in the tables, the results, the cut list and the exports. One template path used to round it to two decimals; that is fixed.

Nothing about your saved projects or your data changes — the optimizer simply chooses better when a job fits several stock sizes.

Release

CutOptim is now available in Spanish

The whole of CutOptim — interface, guides, calculators, app documentation and this changelog — now speaks Spanish (Spain). Everything lives at /es, priced in euros, with the same optimizer under the hood.

CutOptim now speaks Spanish. Every part of the product — the app interface, all guides and calculators, the full app documentation and this what’s-new feed — is available in Spanish (Spain), served at cutoptim.com/es and priced in euros.

This is a real translation, not a machine pass: written for a Spanish carpentry and panel-cutting audience, with the trade vocabulary a workshop actually uses — plan de corte, tablero, veta, merma, aprovechamiento, canteado.

What is in Spanish

What has not changed

The optimizer, the algorithms and your data are exactly the same. Spanish is a new way in, not a different product. Prices are shown in euros, the currency the rest of the eurozone already sees.

Switch languages any time from the globe menu in the top bar. Have a feature request or spotted a translation that reads wrong? Reply to any CutOptim email or use the contact form.

Feature

See how much material the optimizer saves you

Every run now reports what a simple layout would have used for the same parts, and the app keeps a running total of the sheets, bars and material saved. Measured on your job — never estimated.

CutOptim has always tried dozens of candidate layouts on every run and kept the best one. What it never told you is what that search is worth.

Now it does, in two places:

  • In the result summary — when the optimized plan needs fewer sheets or bars than a simple layout of the same parts, the outcome line says so: how many boards fewer, how much material that is, and the money amount when your stock rows carry prices. The line carries into the PDF and Excel exports too.
  • In the top bar — a running total of the material the optimizer has saved across your runs on this device.

Where the number comes from

The comparison is measured, not estimated. While searching, CutOptim computes a simple greedy layout as one of its candidates — the safety floor the final plan must beat or at least match. The meter reports what that simple layout would have consumed for the same parts, the same stock and the same settings, next to what the optimized plan actually uses. Three rules keep it honest:

  • If the two plans did not place the same parts (this can happen with limited stock), no claim is made.
  • If the simple layout was just as good, no line appears — a zero stays a zero.
  • Demo runs never count toward your total.

On every plan

The meter is not a Free-plan teaser. On Free it shows what each of your monthly runs is worth; on Pro and Workshop it keeps counting, so the total answers a fair question: is the subscription paying for itself?

Have a feature request or hit a bug? Reply to any CutOptim email or use the contact form.

Feature

A kitchen base cabinet template — and the height nobody gets right

The fourth furniture template turns a base cabinet into a cut list, keeping the plinth, the carcass and the worktop apart. Pick two rails or a full top, and get overlay fronts sized the way kitchen doors actually are.

You measure the old kitchen, get 858 mm to the top of the worktop, and order the cabinet sides at 858 mm. They arrive edged and cut. Then the boxes go on their legs, the worktop drops on, and the working surface sits at 996 mm.

The new kitchen base cabinet template exists to stop that. It is the fourth furniture template, alongside the TV stand, bookshelf and wardrobe, and it is available in the app and on its own calculator page.

The plinth is not part of the carcass

The height you enter is the carcass height, and the plinth is a separate setting underneath it. Change the plinth and not one carcass part changes — which is exactly right, because the plinth is the thing you adjust once the boxes are standing on a floor that is not flat.

The widget shows the carcass top figure so you can check the sum before anything is cut:

worktop height = plinth + carcass + worktop thickness

The worktop itself is not in the cut list. It is a different material at a different thickness, usually bought cut to length, and mixing it into the board order would make both the area and the sheet count wrong.

Two rails, or a full top

A base cabinet under a worktop is normally closed with two rails rather than a panel: the worktop is already the top surface, and rails leave access for the fixing screws. You can pick either.

On the default 600 mm cabinet the difference is measured, not estimated: 2.03 m² of board with rails against 2.24 m² with a full top — 0.22 m² per cabinet. The rails are also hidden, so unlike a top panel their grain is free and the optimizer can drop them into leftover strips.

Kitchen fronts are overlay

A wardrobe door sits inside its opening. A kitchen door lies across the carcass face and covers the edges of the sides, so it comes out wider than the opening rather than narrower — 597 mm on a 600 mm cabinet.

The template sizes fronts the way kitchen fronts are actually built. Built to the inset size instead, the same door would be 558 mm: 39 mm narrower, on boards that are already edged and bored by the time anyone notices.

What it does not do

A door over a stack of drawers needs the opening split horizontally first, and the model works with one opening per compartment — so it asks you to pick one and generate the two halves separately. Drawer boxes and hinge borings stay out too, because both depend on the hardware you buy.

Full details in Furniture templates, or try it on the base cabinet cut list calculator.

Feature

Edge banding now tells you how many metres to buy

Mark which edges need banding and the results, the PDF material page and the Excel Materials tab now carry the total running length. Exact geometry, no hidden allowance — add your own margin.

Marking which edges of a part need banding has worked for a long time. What was missing was the number you actually take to the supplier: how many metres.

It is there now, in three places:

  • in the results summary, next to the sawn length;
  • at the foot of the material requirement page in the PDF;
  • on the Materials tab of the Excel export.

It appears only when at least one part has edges marked, so nothing changes for jobs without banding.

Four things the number does and does not say

Top and bottom follow the part’s width, left and right follow its height. A 800 × 300 shelf banded top and bottom needs 2 × 800 mm per piece, not 2 × 300.

It is exact geometry, with no waste allowance. Real banding is bought with overlap and trimmed back, and every shop’s margin is different — so we give you the true figure and let you add yours. We would rather hand you a number you can reason about than one with an invented percentage baked in.

It is a single total, not a breakdown per banding material. The marking records which edges, not which banding type, thickness or colour, so a per-material split is not something we can produce from it.

It counts the whole parts list. If some pieces did not fit on this run, their edging is still in the figure — they will need it once you have more material.

Available in 2D panel mode, on the Pro and Workshop plans, like the edge marking itself.

Update 2026-09-25: edge banding is now available on every signed-in plan, Free included — see what each plan includes.

Feature

The Engine API now cuts timber too — the app's third mode, over HTTP

The Engine API had two of the app's three modes. The third — timber with a cross-section — is now one call: POST /v1/optimize/wood. The job is split by cross-section, and missing material is reported apart from parts that did not fit.

Again one for the people writing software against CutOptim. If you just cut in the app, nothing changed — the wood mode in the app works exactly as before, and this adds nothing you have to learn.

The Engine API shipped with two of the three modes the app has: panels and linear material. Timber — where the material has a cross-section — is now the third, in one call:

POST /v1/optimize/wood

Why it needed its own endpoint

Linear material knows one dimension, its length, so any bar can serve any part. Timber does not work that way: a 50×150 part cannot come out of a 50×100 bar, however much length is left in it.

So parts and stock both carry the two cross-section sides, the job is split by cross-section, each section is matched to its own stock and solved separately, and every section comes back with its own bars and its own totals next to the figures for the whole job.

Two things worth knowing before you wire it up:

  • The two cross-section sides can be sent in either order. 50×100 and 100×50 are the same bar turned over, so they land in one section. However your data happens to be entered, material cannot disappear because of it.
  • “No stock of this cross-section” and “did not fit” come back separately. The first is missing material, the second is a capacity problem, and they are fixed differently — merged into one list they would send your user looking in the wrong place.

What it replaces

You could already approximate this by grouping the parts yourself and firing one /v1/optimize/1d call per cross-section. That costs one request from your quota per section instead of one for the job, puts the stock matching in your code, and leaves you to assemble a job total by hand — one that would not necessarily agree with what the CutOptim app shows for the same job.

It now agrees, and we checked it rather than assuming: the app’s own wood demo job returns 81.0% yield across 10 bars, 19 of 19 parts, 19 cuts on screen, and the API returns the same plan bar for bar.

Speed

Measured on the same machine the API runs on: a 40-part job solves in 4.4 ms, and the worst case we could construct — 2,000 parts spread over 20 cross-sections — takes 451 ms. Every call stays synchronous: you send the job, you get the finished plan back, there is nothing to poll.

The API reference has the exact request and response shape, and the OpenAPI document now describes five endpoints instead of four, so a regenerated client picks the new one up on its own.

Have a feature request or hit a bug? Reply to any CutOptim email or use the contact form.

Feature

We measured the optimizer against the theoretical minimum — and removed the yield figure we had never measured

A new /benchmarks page publishes how close CutOptim gets to the provable minimum number of sheets on published academic instances, job by job, with the raw data downloadable. The '88–96% yield' claim is gone from all eight languages.

Two things happened, and the second one matters more than the first.

We published a benchmark

cutoptim.com/benchmarks is now live. For every job in a set of published academic test instances it computes a lower bound — a number of sheets or bars that no cutting plan can go below — and reports how far CutOptim’s plan is from it. If a plan matches the bound, it is provably optimal for that job; no better one exists.

Every job is listed. The raw results are downloadable. The instance sources are pinned by SHA-256 so a re-run can prove it measured the same bytes, and the whole thing is reproducible from our repository with two commands.

The page also states what the numbers do not say, because that seemed more useful than only showing the flattering half:

  • our bound is not the strongest one in the literature, so the gap we report is an upper estimate — a job we mark “not on the bound” may actually be optimal, and we simply cannot prove it;
  • relative gaps exaggerate on small jobs, so the absolute figure (sheets over the minimum) is the honest column;
  • two of the generated test families are adversarial by construction — a ceiling test, not a picture of typical work.

We removed a number we should never have printed

Until today this site said CutOptim “typically reaches 88–96% material yield”, in the glossary, in the FAQ and on a feature card, in all eight languages.

Nobody had measured it.

When we finally did, the median on those academic instances came out well below it. Those instances are harder than a typical furniture job — their part sizes are random rather than repeated — so it is not that the software is worse than we thought. It is that we were quoting a number we had no basis for, and a customer comparing quotes deserves better than that.

So the claim is gone everywhere, and nothing replaced it with a friendlier range. What replaced it is the measurement, plus an honest sentence: how much of a sheet gets used depends on your piece mix, your stock sizes and your blade — and the only number that means anything is the one your own material list produces.

There is now an automated check in our build that fails if a yield percentage creeps back into the marketing copy in any of the eight languages. We removed this claim in three passes because each attempt missed a family of it; a cleanup that needs three attempts will be undone by the next edit unless something is watching.

Have a feature request or hit a bug? Reply to any CutOptim email or use the contact form.

Feature

The cutting engine is now an API — the same optimizer, callable from your own software

If you write software, or someone writes it for you: CutOptim's cutting engine is now an HTTP API. Parts and stock in, full layout, guillotine cut plan and metrics out. Deterministic. A monthly plan with a hard request cap.

This one is for a particular reader, so let us say who up front. If you write software — or you pay someone who does — you can now call CutOptim’s cutting engine directly from your ERP, your quoting tool or a machine’s own software, instead of having someone re-type a cut list into a browser. If you just cut panels, nothing changes for you. The app works exactly as before, and the Free, Pro and Workshop plans still include the optimizer.

What it does

Send parts and stock as JSON to https://api.cutoptim.com and the whole result comes back: every part placed with its coordinates, the guillotine cut plan, and the metrics — sheet count, yield %, cut lines, saw passes, sawn length and total price. Same engine, same numbers as the app.

Five endpoints, and that is the entire surface:

  • POST /v1/optimize/2d — panels
  • POST /v1/optimize/1d — bars, profiles, tube
  • POST /v1/optimize/wood — timber, matched by cross-section (added 2026-08-03)
  • GET /v1/usage — what this key has used this month
  • GET /v1/health — whether it is up

Authentication is one header: Authorization: Bearer <key>.

The same input always gives the same answer

The engine is deterministic: no randomness, no clock in the algorithm. Send the same job twice and the layout comes back identical, down to the coordinates. So you can cache a result, and you can put a known job in a test and diff the output — which an optimizer that wanders a little on every run cannot support.

Two engines, and an honest trade-off

heuristic is the default, the same guillotine packer the app runs: highest yield, every layout cuttable edge to edge on a panel saw, always a full cut plan.

balanced is opt-in. A MaxRects free-nesting packer, measured about 25× faster on a 2,000-part job — but the yield is slightly lower, and its layouts are often not guillotine-cuttable, so it returns no cut plan. That is a speed and producibility trade-off, not a better result. Use it when a big job needs an answer fast; stay on the default when someone actually has to cut the sheet.

Limits, price, and how to get in

2,000 parts per request, 50 stock rows, 1 MB of request body. €49 per month for 10,000 requests, billed in EUR, with a 14-day trial. The 10,000 is a hard cap, not a starting point: once reached, calls stop until the month rolls over. No overage, no surprise bill.

(Since October 2026 the Engine API has two plans — the current prices and quotas are on the Engine API page.)

You can subscribe on the Engine API page — it runs a trial period, and access lands on your account by itself. If you would rather describe what you are building first, the contact form is the other way in. An API keys card then appears on your dashboard: you create keys there, each one is shown exactly once (only a hash is stored, so it can never be fetched again), and its usage against the quota sits on the same card.

The rest is written down: Engine API for the overview and pricing, the API reference for every field, option, error code and both engines.

Have a feature request or hit a bug? Reply to any CutOptim email or use the contact form.

Feature

Know what the saw will actually do: cut counts, a sawing plan, and machine limits

Every plan now shows how many cuts a job needs, how far the blade travels, and per-side trim — plus a step-by-step sawing plan in all three modes (on screen, in the PDF and in Excel) and a calibration cut. Workshop adds panel-saw stage and rotation limits.

A cutting plan tells you where the parts sit. It never told you what the day at the saw looks like: how many times you set the fence, how far the blade travels, what to cut first. This update answers all three — and turns the plan into an ordered list of stop positions you can work down.

How many cuts, and how far the blade travels

Two numbers now sit in the results header of every job, on every plan, guests included.

  • Cuts counts fence settings. Cutting the same measurement across three strips is one setting, so it counts once — because that is one setup at the machine.
  • Saw passes appears under it whenever the two differ, and counts every strip crossed separately. That is the number blade wear and per-cut charges follow.
  • Cut length is the total distance sawn — metres in mm mode, feet in inch mode. It is the same figure under either counting convention.

Neither number is the “right” one; they answer different questions. How many times do I set the fence? and how many times does the blade go through material? Quoting a job needs both.

On our standard 40-part demo job (2440 × 1220 sheets, 3 mm kerf) the plan comes out at 30 cuts, 52 saw passes and 32.88 m of sawing across 2 sheets at 83.3% yield.

Trim each edge separately

Trim per side replaces the single trim value in 2D: separate left, right, top and bottom inputs. Available on every plan, guests included.

This is not a refinement, it is a correction. A damaged or out-of-square edge needs more than the others, and trimming all four the same does not give you a slightly worse plan — it gives you a wrong one: too little on the bad edge and your first part carries the defect, too much everywhere else and you have paid for material you never had to lose.

In 1D and Wood a bar has two ends, so the Start trim / End trim pair is shown instead.

The sawing plan — now on bars as well as sheets

The Cutting Sequence used to be a 2D feature. It now runs in 2D Panel, 1D Linear and Wood, on the Pro plan.

On a sheet the plan walks the board down stage by stage: one step per fence setting, with the cut direction and the position, so a cross-cut is never asked for before its strip has been ripped off.

On a bar there is no cut tree — the timber is crossed end to end — so the plan is the running offset: after each part the blade drops at that mark, then advances by the kerf. Each bar reads as the calibration skim (if switched on), then the start-trim head cut (if set), then one step after each part, except a last part that finishes flush with the usable end when there is nothing to trim off it.

Every step gives a stop position measured from the head of the bar. That is the point: a number you can set on a stop, instead of adding part lengths and kerfs in your head twenty times down a six-metre length.

Two ways to use it:

  • The player now sits directly above the sheet or bar diagrams it steps through, rather than at the top of the results. Controls are ◀ Previous, the step readout, ▶ Next, the new ⏮ Restart, and ▶ Play. Restart pauses playback and takes you back to step 1 — for the second board, or the second run of a job.
  • The table below the cut list is the whole plan on one screen: the order, the sheet or bar, the direction or the part, and the position. Click any row and the player jumps to that step, with the row highlighted. It is what gets read before starting, and what gets screenshotted and sent to the saw.

One honest limit: 1D Linear reports positions but no cut length, because linear stock carries no cross-section for the blade to cross. Wood mode does know the section, so it reports a sawn length there. We would rather leave a figure out than invent one.

The calibration cut, on bars too

The calibration cut skims a thin strip off the material before any part is cut. You measure the strip, compare it with what you asked for, and correct the fence or stop by the difference — so the first real part is already accurate, instead of being the one you sacrifice to find out the setup was off. It is a Pro feature.

It now runs in every mode. On a sheet you pick which of the four edges is skimmed. On a bar the skim always comes off the head, and the side picker is hidden — a bar has one head, and offering four edges would be a control the plan could not honour.

It rides on the start trim: the material reserved at the head is start trim plus calibration. With both set, the head is crossed twice — once for the strip you measure, once to take the rest of the trim off — and the sawing plan lists both passes, in that order.

Two controls that describe your machine

Both are 2D, and both are on the Workshop plan.

  • Max. cutting stages. A stage is a run of parallel cuts between two turns of the material — which is exactly how panel saws are specified, as 2-, 3- or 4-stage machines. Tell CutOptim what yours allows and the plan respects it where the job permits — and where a job cannot be sawn within the limit, it warns you instead of handing back an unsawable plan. All without giving away yield or a board.
  • Minimise rotation. Prefers layouts that turn fewer parts, but only when that costs no extra sheet. A sheet is money, a rotation is seconds, so yield is never traded for it.

If a limit cannot be met, you still get the plan. The optimizer returns it and warns which boards need extra setups at the saw — a usable plan with a caveat, never an error.

In the PDF and in Excel

  • A Sawing plan page in the PDF, on its own page, in all three modes. On a sheet: board, stage, direction, position and cut length. On a bar: bar, the part the cut frees, and the stop position. The counting convention is printed under the title, and a framed strip of key figures — cuts, saw passes, cut length, stages — sits under the table. Pro.
  • A Cutting Sequence tab in the Excel workbook, inserted straight after the Cut list, because it is what the operator works from. The totals are repeated at the bottom, so the tab stands alone when it is the only page taken to the saw. Pro.
  • Sheet layouts at full size. In 2D, every board is now repeated on its own landscape page at the back of the PDF, drawn as large as the paper allows. Inline in the portrait flow a 2800 × 2070 board printed at roughly 1:16 — fine as a picture, useless to work from. A landscape page gives about three times the area, and keeps the reading part of the document continuous instead of interleaved with full-page artwork.
  • The waste list says whether a leftover is worth keeping. It now starts on its own page and carries a Reusable column, Yes or No, with the keepers listed first — and a line under the table stating the rule in your own numbers: in 2D both sides must clear your minimum offcut size (a long thin strip is not useful), in 1D and Wood the leftover length must clear it.

What’s next

Off-cut auto-include and assembly groups are still on the list, along with a dedicated place for the sawing plan in the label and quotation exports.

Have a feature request or hit a bug? Reply to any CutOptim email or use the contact form.

Update 2026-09-25: the sawing plan (on screen, in the PDF and in Excel) and the calibration cut are now available on every signed-in plan, Free included; the two panel-saw limits stay on Workshop — see what each plan includes.

Fix

Seats that actually grant Workshop, materials that remember their blade, and a straight answer on oversize parts

An invited Workshop member was treated as a free user and never got what the owner paid for. That is fixed, with nothing to do at your end. Also: 1D Linear reports its sawn length once you give it a profile width, and materials remember their blade and trim.

Two things in this update were wrong, and one of them was costing paying customers something they had already bought. That one comes first, along with the feature it was holding up.

Your Workshop seats now grant Workshop

If you are on the Workshop plan and added colleagues under Team management, they were not getting the plan you were paying for. An invited member was treated as a free user at every check: three optimizations a month, room for a single saved project, and none of the Pro or Workshop exports. You paid for three seats and two of the three people on them had a free account.

That was a bug, not a policy. An invited member now gets the plan the owner is paying for, everywhere the plan is read.

There is nothing for you to do. No re-inviting, no re-saving, no setting to switch on — the colleagues already in your organization pick it up on their own. And it only ever lifts: a member who has their own Pro subscription is raised to Workshop while the seat covers them, never dropped. If the Workshop subscription lapses, the seat stops granting anything and each person falls back to the plan they hold themselves.

And the workspace those seats sit in is now genuinely shared

The other half of the same story. Until now the three of you had three private project lists, which made “shared workspace” a roster and not much else.

A project saved by any member while they are in the organization now belongs to the organization. Everyone sees it, opens it, renames it, and adds and edits the cuts inside it — including the per-sheet progress markers, which is the part that actually earns its keep: it is what stops two people cutting the same board twice.

Two limits, stated plainly rather than buried:

  • Nothing was shared retroactively. Projects saved before this update stay personal and stay invisible to your colleagues. If you are wondering whether your old quotes just became visible to your employees — they did not. Only newly saved projects join the organization.
  • Deleting stays with the owner. A member can edit a colleague’s project but cannot remove it. In the projects panel a colleague’s project carries a 👥 marker and has no delete button.

Full detail on the Team Workspace page.

“Too large for your sheets” no longer says that about a part that simply cannot turn

Reported by a user: a 2440 × 1220 board in stock, and the result said 550 × 1964 — too large for your stock sheets, with advice to add a bigger format or split the part. Turn that piece and it fits with room to spare.

The packer was right that the piece could not be placed — the Rot. box on that row was unticked, so it was only allowed to go on upright, and upright it does not fit. The message and the advice were the wrong ones. They would have sent someone to the merchant for a board already leaning against their wall.

The two cases are now told apart. A part that fails upright but fits turned is reported as would fit rotated, but Rot. is switched off, and the hint names the Rot. column and the row to tick in the Parts (2D) table. It also says to leave it off if the grain direction is why the part was locked — that is a legitimate choice, not a mistake to correct. Parts that really are bigger than your biggest sheet keep the old message and the old advice, which are right for them.

The PDF carries the new wording too, since the printed plan is the one that reaches the merchant.

1D Linear can tell you the sawn length — if you tell it the profile width

Linear stock is a length and nothing else. There is no section for the blade to cross, so the sawing plan could give you stop positions but never a sawn distance — and we would rather leave a figure out than invent one.

So instead of a guess, there is now an input. Profile width sits in Advanced settings and appears only in 1D Linear: the width of the material the blade crosses on one cut. Fill it in and Cut length joins the results header and the summary, and appears on the sawing-plan page of the PDF and in its Cutting Sequence tab in Excel.

Leave it at 0 and nothing changes — positions, no length, exactly as before. That default is deliberate: a job that never says what section it is cutting still gets no number rather than a plausible one.

Wood mode already knows its cross-section per material and never shows the field. For a job that mixes several sections, Wood mode is the answer — it tracks them material by material.

The sawing plan in the PDF and the Excel tab are Pro features; the Cut length figure on screen is not.

Materials remember the blade and trim they are cut with

Kerf and edge trim belong to the material, not to the job. The 3.2 mm blade belongs to the 18 mm board; the 12 mm trim belongs to the rough-edged plank. Until now you dialled them in again for every material, and forgetting produced a plan that only turned out to be wrong at the saw.

A material in your Material inventory now carries its own Blade kerf and trim — a sheet stores four edges, a bar stores its two ends.

  • Nothing new to fill in. Whatever you have set is what gets saved with the material, on the same Save current and Add buttons you already use.
  • You can see what it holds. The material row shows a small settings badge with the kerf and trim it carries, so the capture is visible rather than magic.
  • Loading it says what moved. Load the material and those values go back into Settings, and the confirmation names the fields that actually changed. A setting that moves itself without telling you is worse than one you set by hand.

A material you saved before this update carries nothing, and loading it changes nothing. It will not quietly reset the kerf and trim you have dialled in for the job in front of you. Empty is not zero here: empty means the material says nothing about it, while 0 is a real answer meaning no trim.

Material inventory is a Pro feature.

What’s next

Both halves of the team gap are closed with this update — the seats grant the plan, and the projects are shared. Assembly groups are still on the list.

Have a feature request or hit a bug? Reply to any CutOptim email or use the contact form.

Update 2026-09-25: the sawing plan in the PDF and Excel and the material inventory are now available on every signed-in plan, Free included. The free plan no longer has a saved project: saving projects to the cloud is a Pro feature — see what each plan includes.

Feature

Cut from your rack first: automatic off-cut reuse and a materials list you can shop from

Every run now fills your saved off-cuts before opening new stock, and tells you exactly what to buy versus what to pull off the shelf. Plus product-price quotations, grain matching that shapes the layout, and price columns everywhere.

The cheapest board is the one you already own. This update makes CutOptim reach for your saved leftovers before it opens anything new — and then tells you, in plain terms, what you actually have to buy.

Automatic off-cut reuse

With Use off-cuts automatically switched on — it is on by default — every optimization now runs in two passes. First it packs your parts onto the off-cuts already in your Offcut Inventory, then it sends whatever is left to the normal optimizer on new stock.

  • All three modes. 2D panels, 1D linear and wood profiles.
  • Each piece is used at most once. Off-cuts are never cloned the way a stock format can be, because there is only one of each on your rack.
  • The plan names them. A sheet or bar that came from your inventory is marked ♻ and carries the name you gave it, so the person at the saw knows to fetch it rather than open a new board.
  • The results tell you what it saved. How many off-cuts were used, how much material that is, and — when the job is small enough to check — how many fewer new sheets or bars you needed.
  • Your inventory stays honest. Saving the run deducts what it consumed: a fully used off-cut leaves the list, a partly used one is replaced by its remainder.

Turn the checkbox off for a new-stock-only run — useful when you are quoting fresh material and do not want leftovers folded into the price.

Off-cut inventory is a Pro feature.

A material requirements summary you can shop from

Every result now carries a Material requirements summary, in all three modes, right before the cut list. It answers the one question you ask before starting: what do I have to buy?

It splits the job in two:

  • New stock — what you still need to purchase, by size, with quantity and total area or length.
  • Re-used off-cuts — what you already own, with a line telling you how many pieces to pull off the rack before you start.

The same split appears in the PDF and in the Excel workbook, so the merchant and the workshop are reading the same numbers.

Quotations that bill the finished piece

The quotation now offers two pricing modes. Margin on cost bills the boards the job consumed, as before. Product prices bills the finished pieces instead, at the selling price you set per part — the way most workshops actually quote a kitchen.

Alongside it: customer details, a tax rate, a validity date, a labour line and an optional per-cut charge. Your margin is folded into the unit prices rather than printed as a line, so the customer sees a clean document. If you want the margin spelled out, switch the document dropdown to Internal report — that one shows cost, revenue and gross margin, and never leaves your desk.

Quotations and the internal report are Business features.

Grain matching now shapes the layout

Grain matching groups no longer just record an intention. Grouped panels are held together on one sheet where the packer can manage it, their rotation is locked so the grain runs the same way, and they are kept out of the off-cut pass so a matched set never ends up split between a leftover and a new board. If a group genuinely cannot fit on one sheet, the result says so rather than silently splitting it.

Grain matching is a Business feature and applies to 2D panel mode.

Prices where you need them

  • Cost and selling price columns on the stock and parts tables, revealed by the Show price columns checkbox.
  • They travel with your data. Both columns are in the CSV templates, the CSV import and the Excel paste, so a priced cut list survives a round trip through a spreadsheet.
  • Material inventory now stores price and thickness alongside the size, and rows load into the job with one click.
Price columns and the material inventory are Pro features.

Exports

  • Cover page in every mode. Previously only wood plans got one. It now leads 2D and linear plans too, and lists the cut count alongside yield, sheets and waste.
  • Identical sheets are merged. A job that is twenty copies of one layout used to print twenty near-identical pages; 2D now collapses them into one diagram with a repeat: N× badge, as 1D has done for a while. The cut list gained the matching column.
  • Wood plans are grouped by material. One section per stock item and one per re-used off-cut, instead of everything under a single heading.
  • Names throughout. 2D stock rows can be named, and those names now appear on the sheet headers, in the Excel materials and waste tabs, and in the DXF.

Fixes worth knowing about

  • Excel’s separator. CSV import now detects comma, semicolon or tab from the file itself. If you are on a European Windows locale, where Excel writes semicolons, your file imports as it is.
  • Selling prices no longer default to 1. Clearing the cell used to store 1, so a part you deliberately left unpriced was quoted at one unit each — and slipped past the “items with no price” warning.
  • Pasting wood from Excel. The header row the paste hint itself suggests was being misread and the whole paste rejected. Both it and a related column-shift on blank cells are fixed.

What’s next

Closing the gaps in the Business team workspace: a shared project library, and members inheriting the owner’s plan.

Have a feature request or hit a bug? Reply to any CutOptim email or use the contact form.

Update 2026-09-25: the off-cut inventory, price columns and material inventory are now available on every signed-in plan, Free included; quotations, the internal report and grain matching stay on the Workshop plan (the former Business plan) — see what each plan includes.

Update 2026-10-13: grain matching has been rebuilt on sets — the parts of a set are now cut side by side from one piece of board, exactly one saw gap apart — and it is no longer limited to Workshop: it is on every signed-in plan (Free within its monthly runs, Pro with a monthly allowance, Workshop unlimited). See Grain matching, rebuilt.

Improvement

Tighter cut plans: a smarter 1D optimizer and fuller 2D sheets

The linear and wood cutting engine now tries several strategies and keeps the best, 2D sheet packing squeezes in full-width and full-height pieces, and the PDF lists anything that didn't fit.

Better cut plans mean less wasted material and fewer boards bought. This update rebuilds the engine behind linear and wood cutting, packs 2D sheets more tightly, and makes sure the PDF tells the whole story.

Smarter linear and wood cutting

  • Several strategies, best result wins. The linear and wood optimizer now runs multiple packing strategies for each job and keeps the one that uses the least material — instead of relying on a single approach.
  • Strong on repetitive jobs. For orders with many identical pieces, a new pattern-based method finds near-optimal layouts that were previously out of reach.
  • The same job, fewer offcuts. In practice this means shorter bars and boards left over, and often one less length to buy.

Fuller sheets in 2D

  • No more wasted edges. The 2D packer now fills in pieces that span the full width or full height of a sheet, using space along the edges that used to go to waste.
  • A real example. A layout that previously needed two sheets — each barely half used — now fits on a single sheet at 94% utilisation.

Nothing gets lost in the PDF

  • Every part accounted for. If a piece doesn’t fit or you run short of stock, the exported PDF now lists it clearly in all three modes (2D, linear and wood), so nothing quietly disappears between the screen and the workshop.
  • Faster, more private exports. PDF generation is now fully self-hosted — no third-party CDN — so exports are quicker and load nothing from outside CutOptim.

What’s next

Off-cut auto-include and assembly groups are next on the list.

Have a feature request or hit a bug? Reply to any CutOptim email or use the contact form.

Feature

Meet the CutOptim assistant — answers while you work

A built-in AI helper on the site and inside the app answers your questions about features, pricing and how to get the best cut plans — in your language, with links to the right docs.

Sometimes you just want a quick answer without digging through the docs. CutOptim now has a built-in assistant that can explain features, clarify pricing and point you to the right guide — right where you are, in your language.

Ask anything, in your language

  • Available where you need it. A small chat bubble sits in the corner of the marketing pages, the documentation and inside the app. Open it, ask a question, and get a straight answer.
  • Speaks all eight CutOptim languages. Ask in English, Hungarian, German, Italian, French, Romanian, Polish or Czech — the assistant replies in the same language.
  • Points you to the source. Answers link to the relevant guide or doc page, so you can read the full details when you want them.

Grounded and honest by design

  • Answers from the real documentation. The assistant is grounded in CutOptim’s own guides, pricing and help articles — it doesn’t make up features that don’t exist, and it declines questions that aren’t about CutOptim.
  • It doesn’t see your project data. The helper answers general “how do I…” and “what does this do…” questions. It has no access to your saved projects or cut lists.
  • A human is one click away. If the assistant can’t help, it offers a direct link to reach a real person, and each answer has a quick 👍 / 👎 so you can tell us what landed.

On your terms

  • Keeps its place as you browse. Your conversation carries over from page to page, so you don’t lose the thread.
  • Hide it whenever you like. A toggle in your dashboard — and a “don’t show again” link in the widget — keeps it out of the way if you’d rather work in silence.

What’s next

A data-aware in-app helper that can reason about your actual cut list is on the roadmap.

Have a feature request or hit a bug? Reply to any CutOptim email or use the contact form.

Feature

Guarantee the cuts that matter — even when stock is tight

Limited-stock mode plus Priority (must-cut) pieces, editable piece colours, and clearer PDFs — across 2D panels, linear and wood cutting.

This update is about staying in control when material is tight. A new Limited stock mode treats your quantities as a hard limit and mixes the formats you actually own, and Priority pieces let you guarantee the cuts you can’t afford to drop. Both work across 2D panels, linear and wood — alongside editable piece colours and clearer PDFs.

Limited stock, honest plans

By default, CutOptim assumes you can get as many boards as a plan needs. Now you can tell it what’s really on your shelf.

  • Switch supply to Limited. A new Unlimited | Limited toggle sits in the stock section, in every mode. In Limited mode, the quantities you enter become a hard cap.
  • Your real formats, mixed for you. Instead of leaning on the single biggest format, the optimizer combines the sheet and bar sizes you actually stock to fit as much as possible — and shows the exact breakdown of formats used.
  • An honest shortage notice. If you run short, a clear “Not enough stock” panel lists what’s missing, and separates a part that’s simply too big for any format from stock you’ve genuinely run out of — so you know whether to buy more or rethink the part.

Priority cuts come first

When not everything fits, you decide what’s guaranteed — not the algorithm.

  • Flag the must-haves with ⚑. In Limited mode, a priority (⚑) column appears in the parts table. Mark the pieces that absolutely have to be cut for this order.
  • Priority pieces get first pick of the material, so the urgent parts are cut and low-priority filler is what drops.
  • A clear result. A green ✓ confirms every priority piece was cut, or a red ⚠ tells you exactly how many didn’t fit — in 2D, linear and wood alike.

Your colours, clearer PDFs

  • Editable piece colours in every mode. Each part now has its own colour picker — including linear cutting, which never had one. Your colours flow through the on-screen diagram, the legend and every export.
  • Priority pieces stand out in the PDF. Must-cut parts get a clear (!) marker and a footnote in the cut list, plus a dedicated “Priority pieces” block right under the optimization summary — so whoever’s at the saw sees what matters first.

What’s next

Off-cut auto-include and assembly groups are next on the list.

Have a feature request or hit a bug? Reply to any CutOptim email or use the contact form.

Feature

Inch units, a smarter 2D optimizer, and no more lost work

Millimetres or inches across the whole app and every export, a rebuilt 2D optimizer that fits more on fewer sheets and compares every stock format, clear reporting when a panel won't fit, and automatic protection so an unsaved optimization is never lost.

This batch is more than polish. Imperial units arrive across the entire app, the 2D panel optimizer was rebuilt to waste less material, it now tells you when something doesn’t fit, and your unsaved work is protected from accidental loss.

Work in millimetres — or inches

CutOptim now speaks imperial as fluently as metric.

  • A simple mm / in switch sits right in the Settings row. Flip it and every measurement converts instantly — no need to re-enter your numbers.
  • Your choice is remembered on this device and on your account, so it carries across sessions and computers.
  • Every export is unit-aware. PDF cutting plans, CSV, DXF (with the correct $INSUNITS flag for CAD), labels and quotations all print in your chosen unit; 2D waste is shown in ft² in imperial mode.
  • Sensible imperial defaults. The demo data and starting values use round imperial sizes (96×48 sheet, 2×4 lumber) instead of awkward conversions, and each saved cut shows a small mm / in badge.
  • Switching units never re-runs the optimizer, so it won’t cost you a quota.

A smarter 2D panel optimizer

The 2D panel packer was rebuilt around how sheets are actually cut, and it wastes noticeably less material.

  • More on fewer sheets. A real job that used to spill across two sheets at 39% now fits on a single sheet at 77%. The new shelf/column packer keeps clean rows of same-width parts together, the way a real cut does.
  • It tries every stock format. If you stock more than one sheet size, the optimizer now compares running the job on each format and keeps the best result, instead of using them in the order you listed.
  • Tighter packing on hard jobs. A new “gap-reclaiming” strategy recovers the strip above a short part, so awkward mixes leave less offcut.
  • “First cut direction” now works in 2D. Choosing a horizontal or vertical first cut finally changes the layout the way you’d expect.

2D now tells you what didn’t fit

Previously, if a panel was too large or you ran short on sheets, it just quietly disappeared from the plan. Now you get an honest answer:

  • A red “unplaced panels” notice lists any part that is too big for any sheet you stock, with its name and size.
  • A yellow “not enough stock” notice tells you, per format, how many sheets the plan needs versus how many you have on hand — so you know exactly how many more to buy.
  • The piece count turns red whenever not everything was placed, so a short plan can’t slip by unnoticed.

Never lose an unsaved optimization

Running an optimization and then navigating away used to throw the result away. Not anymore.

  • A save prompt appears before you leave a page (or switch modes) with unsaved results, so you can keep your work with one click.
  • Automatic draft restore brings your last run back when you return — without spending another optimization.
  • A proper save-destination picker lets you choose the project, and either overwrite the loaded cut or save it as a new one (like “Save” vs “Save as”).
  • Cut names are now unique within a project, and deletions use a clear in-app confirmation dialog instead of a browser pop-up.

What’s next

Off-cut auto-include and assembly groups (Feature Pack 2 Phase 2) are next, along with an optional “use only the stock I have” mode for 2D.

Have a feature request or hit a bug? Reply to any CutOptim email or use the contact form.

Improvement

June 2026 — beautiful PDFs and cleaner cut-list tables

A reworked PDF export with print-friendly typography, padded and well-paginated 1D plans, redesigned on-screen cut-list tables (now in 2D as well), and fixes for double colons, abbreviations and Central-European characters.

This update is all about polish: the documents you print and the tables you read on screen now look the way they should.

We audited every PDF the app produces — the 2D / 1D / wood cutting plans, panel labels and the quotation — against typography and print best practices:

  • Readable everywhere. No more sub-6 pt micro-text; diagram labels now use a dark, high-contrast colour instead of the piece’s own (sometimes pale) hue, so part names stay legible on any colour.
  • Print-friendly contrast. Section headers and the footer were darkened to clear accessibility contrast ratios — easier on the eyes and on the toner.

Roomier, well-paginated 1D plans

The 1D plans (linear and wood) got the biggest cleanup:

  • Breathing room between each bar diagram and the cut list below it — no more text glued to the bar.
  • Larger fonts throughout the diagrams, tables and summary box, so a printed sheet is comfortable to read at arm’s length on the workshop bench.
  • Logical page breaks. Each bar’s header, diagram and cut list are now kept together on one page whenever they fit, so you never get an orphaned header at the bottom of a page.

Redesigned cut-list tables — now in 2D too

The result cut-list table was rebuilt from scratch:

  • Columns now size to their content and the table is centred, so the part name finally gets the room it needs while the rod / order / length columns stay compact.
  • A small colour dot before each part name ties the row back to its piece in the diagram.
  • 2D mode now has a cut-list table too (Sheet / Order / Part / Size), matching the 1D and wood views.

Text fixes

  • No more double colons in the PDF summary (Useful:: → Useful:).
  • The “Order” column is spelled out in full instead of being abbreviated.
  • Central-European characters (Hungarian ő/ű, Polish ł/ą/ż, Czech ř/ě/ů, Romanian ș/ț/ă) used to break in the PDF font; they now render as readable letters.
  • CSV import correctly handles quoted fields that contain commas.

What’s next

A fully embedded Unicode font for pixel-perfect diacritics in PDFs is on the list, along with Feature Pack 2 Phase 2 (off-cut auto-include and assembly groups).

Have a feature request or hit a bug? Reply to any CutOptim email or use the contact form.

Release

Spring 2026 update — precision pack, smarter exports & faster UX

Sprint 4 and Sprint 5 ship a workshop-grade precision pack (kerf tolerance, start/end trim, cost per cut), DXF/SVG exports, cross-project saved offcuts, and skeleton-loading UX across the app.

We have shipped two large sprints worth of improvements over the past three weeks. This post bundles the user-facing changes you can use right now.

Workshop-grade precision

Every cutting plan now respects three new physical-shop realities:

  • Kerf tolerance (±mm) — Free+. The optimizer first tries an exact-fit placement; only when nothing fits does it allow up to ±tolerance of give. Useful when your blade jitters between 3.0 and 3.2 mm or when imported demand sizes have rounding noise.
  • Start / End trim (mm) — Free+. The effective length of every bar or sheet is reduced by start_trim + end_trim. The damaged clamped edge stops being treated as offcut material, so your scrap reports match what the workshop actually keeps.
  • Cost per cut (€) — Pro+. Each piece adds 1 cut (1D) or 2 cuts (2D) to the project total, multiplied by your blade-and-time cost. The new “Cuts” and “Cut cost” stat cards make the trade-off between a tighter layout and an extra blade pass visible.

All three settings travel with the project. The dedicated Kerf tolerance article walks through a 5-step measurement protocol and a workshop-tolerance reference table (CNC 0 mm → hand-fed bandsaw 2–3 mm).

Workshop-grade exports

  • DXF + SVG export is now a stand-alone Pro feature on the landing page. The DXF target is R12, so it opens in AutoCAD LT, Inkscape, OnShape, Fusion, and every mainstream CNC post-processor without conversion.
  • SVG files now include an xmlns declaration and an <?xml ... ?> prologue so the downloaded file opens correctly in Inkscape and any standalone SVG viewer.
  • CSV files prepend a UTF-8 BOM so Excel automatically detects the encoding — no more garbled diacritics.
  • Filename pattern is unified across PDF / CSV / DXF / SVG: <company-slug>-cutting-plan-<timestamp>.<ext>.

Saved offcuts go cross-device

Pro and Business users no longer lose their offcut inventory when they switch browsers. The “Saved offcuts” list now lives in the database (/api/offcuts-inventory), with a one-time silent migration from your existing localStorage on your next visit. Free users keep their browser-local storage as before.

Settings audit + 5 real bug fixes

We audited the entire /app Settings sidebar against the running optimizer code. Five settings looked like they did something but actually had no effect on the result:

  • Stock prioritization (★ icon per row) now actually sorts the stock list before optimization.
  • Min. offcut size advanced inputs (W / H / L) are now actually consulted by the inline optimizer.
  • Cost minimization mode now sorts stock by _price ascending — pick the cheapest sheet first.
  • Cut type and Unit (mm/cm) selects were phantoms — the code never read them. They have been removed. Cut type stays guillotine in 2D Panel mode; true-shape nesting later shipped as a separate Nesting mode. Unit stays in millimetres; cm / inch is planned for v2.

Faster perceived UX with skeleton loading

We added a reusable Skeleton placeholder and wired it into five async paths so you no longer stare at empty space while data loads:

  • The optimization run paints a stats-and-sheet skeleton before computing, so the layout shift is gone on big jobs.
  • The PDF dropdown shows a busy state while jsPDF lazy-loads.
  • The dashboard billing-history list, project-delete card, and Pro offcut inventory load all show structured placeholders during their network round-trip.

Login and accessibility polish

  • Show / hide password toggle on Login + Register, with a Caps Lock warning.
  • Inline per-field validation with role="alert" for screen readers.
  • Public accessibility statement is now available in all 8 languages — see accessibility.

What’s next

Sprint 6 picks up Feature Pack 2 Phase 2 (P1): off-cut auto-include, assembly groups, and a richer Material Library. Sprint 7 brings the first Pillar A2 export (G-code).

Have a feature request or hit a bug? Reply to any CutOptim email or use the contact form.

Update 2026-09-25: cost per cut, DXF/SVG export and the cloud-saved offcut inventory are now available on every signed-in plan, Free included — see what each plan includes.