Workshop notes

G-code is just instructions

G-code is just instructions

I used to be intimidated by G-code. It looked like terminal vomit. G0 this, G1 that, M3, M5, feed rates, spindle speeds, coordinates with more decimals than felt reasonable. Then I spent an afternoon watching a 3-axis router cut a sign out of MDF while the operator calmly read a newspaper. I realized G-code is not the brain surgery part. The thinking happens before the code exists.

G-code is just a list of instructions. Move here. Spin at this speed. Plunge this deep. Feed this fast. If the geometry is clean and the feeds and speeds match the material, the machine does the rest. That is the job: turn a good design into good instructions.

Toolpaths are decisions, not defaults

When I prepare a CNC toolpath generation service feeds speeds optimization job, the first thing I ask is not “what software do you use?” It is “what are you cutting, and with what?” Same bit in hardwood and soft plywood behaves completely differently. Same material on a rigid industrial router and a hobby benchtop machine wants different feeds. There is no universal button.

I usually work with 6mm and 8mm compression or upcut carbide bits for plywood, and 3mm single-flute bits for detail work or aluminum. For an 18mm birch ply sheet on a reasonably rigid 3-axis router, a 6mm compression bit might run at 12,000–14,000 RPM with a feed rate around 1,200–1,800 mm/min and a depth of cut of 6–9mm per pass. That is a conservative starting window for a shop that wants to hear the cut before pushing it. On a stiff machine with good hold-down I often run 16,000–18,000 RPM and 2,500–4,000 mm/min in the same material. Those numbers move depending on the machine, the hold-down, and whether the shop wants to baby the tool or push it.

The important part is that I deliver the reasoning, not just the numbers. If a shop sees a feed rate that looks aggressive for their machine, they can adjust. If they see a feed rate that looks timid, they can speed up. If they see no notes at all, they guess.

Feeds and speeds in context

Feed rate is how fast the bit moves through the material. Spindle speed is how fast it spins. Chip load is the bite each flute takes per revolution. Get chip load wrong and you either burn the bit or snap it.

For plywood, I aim for a chip load in the neighborhood of 0.05–0.1mm per flute for a 6mm bit, depending on whether it is two-flute or single-flute. For MDF, slightly higher because the material is softer and more forgiving. For aluminum, much lower chip load, much more coolant or air blast consideration, and usually a climb-biased strategy to keep the heat in the chip instead of the tool.

I also separate operations by intent. Roughing clears material fast with a larger bit and leaves a small stock allowance. Finishing comes back with a smaller bit or a lighter pass to clean the edges. Drilling or pecking handles holes. Profile cutting handles the outside contours, usually with a finishing pass on the last millimeter or two to leave a clean edge.

When I deliver a G-code generation service for CNC router files, I include separate toolpaths named clearly: 1_rough_pocket_6mm, 2_finish_profile_6mm, 3_drill_holes_3mm, 4_slot_hinges_4mm. Naming matters. A confused operator calls you at 8pm.

Tabs, ramps, and the stuff nobody models

The geometry in CAD is perfect. The material on the table is not. That is why I add tabs to keep small parts connected to the sheet until the operator breaks them free. I add ramp or helix entries so the bit doesn’t plunge straight down and burn a hole. I add bridges or lead-ins that avoid starting on a visible edge.

I learned the ramp lesson the hard way. Early on I sent a file with straight plunges into 18mm plywood. The operator ran it anyway because they assumed I knew what I was doing. The bit overheated in the third hole, chipped a flute, and left a burned ring that showed through the paint. Now every plunge is a ramp unless there is a very good reason, and I note that reason.

What I deliver

For a typical router job, the folder contains:

  • The G-code files, one per tool and operation, clearly named.
  • A setup sheet with material, thickness, tooling, origin point, and safe Z height.
  • The original DXF or SVG geometry in case the shop wants to regenerate paths.
  • A rendered preview image showing which areas are pockets, profiles, and drills.

I do not deliver a single mystery file called job.nc and hope for the best. The goal is to remove ambiguity before the machine turns on.

G-code is not the product

The product is the physical part that comes off the machine. G-code is the envelope it travels in. A clean design with bad code gives a bad part. A bad design with perfect code gives a bad part faster.

That is why I model with the toolpath in mind. I avoid tiny internal corners a round bit cannot reach. I keep pockets at depths the available flute length can handle. I think about hold-down access while the geometry is still easy to change.

If you are getting into CNC, my advice is simple: learn what good G-code looks like, but spend more time learning what good geometry for G-code looks like. The code is learnable in a weekend. The geometry judgment takes longer. I’m still building mine.