Internal tool · Engraving automation

Laser Station

Scan the order paper, the laser is already set up · Artwork, font and size set automatically · About 40% less time at the engraving station

A program I built for Mignon and Mignon, a personalized jewelry brand that engraves names, initials, birthstones and pet portraits onto necklaces, bracelets, rings and charms. Every engraved piece is marked by a laser driven by EZcad, and setting up each piece used to be ten minutes of manual work: find the customer's artwork on Google Drive, download it, import it, choose the right font, resize and position everything, set the speed and power. Laser Station reads the QR code printed on the order paper and does all of that automatically. When the setup is done, it shows READY TO MARK and the operator presses F2 to engrave.

Before By hand, per piece

Read the order paper, search Google Drive for the photo, download it, import it into the laser software, pick the font the paper names, resize and move the text until it fits, set the speed and power, then mark.

After Laser Station

Scan the QR on the paper. The template opens, the artwork is already on this computer, the text, font, size and position are set, the speed and power match the finish, and the screen says READY TO MARK.

The whole run at the real machine, uncut: one scan after another. Each scan replaces what is on the laser's canvas with the next order's artwork and text in a few seconds, and the green bar says READY TO MARK.

Security note: the clip is the capture as it was recorded, uncut and silent. No personal information reaches this program. What a customer gives the shop is the text they want engraved, and on photo items a picture of their pet. The one black box on the order papers covers the printed header block, which the engraving never uses; everything it does use is left as printed: the QR code, the item code, the font and finish, and the personalization.

Why I Built This

Setting up each piece took longer than engraving it

Marking a piece takes seconds. Getting the laser ready took minutes, every time: find the artwork in the day's Drive folder, find the font in a list, then size and place the text so it fits inside an 18 mm coin without touching the ring hole. None of it is difficult, but it has to be done carefully for every piece, all day.

A coin is only one of the items on that bench. The same machine marks name bars, hearts, rings, cuffs, bookmarks, charm necklaces, urns, dog tags and medical bars, each with its own template, default font and rules about where the text may sit. Adding an item family to the program means writing those rules down once. I did it for every family the shop sells.

The printing program already knew everything the laser needed, because it had just printed the order. So I connected the two programs: the printing program adds one QR code per engraved item to the order paper, and Laser Station reads it at the machine. Before, a person re-read the paper and entered it into the laser software. Now the code carries the order number, the item, the finish, the text and the font, with a checksum that catches a partial scan before anything is engraved.

The program does not fire the laser. It drives everything in EZcad except Mark, and it answers No to every save prompt. Someone's hand may be on the jig, so the operator presses F2 to engrave.

40%
less time at the engraving station, measured by the shop after the program went into daily use
1
keystroke left for the operator: F2, which is Mark. The program sets up everything else and stops

Type

Internal tool

Role

Developer, Experience Designer, Implementation

Built with

Python · EZcad · Claude Code

The problem, and what changed

Ten minutes of setup per piece, or one scan

The laser could already do all of this, and the team was already doing it correctly. The problem was the time each step took, on every piece. Below is the same job, before and after.

1 · The setup: from eight manual steps to one scan

Before · By hand

Re-read the paper into the laser

About ten minutes, every piece

  1. Read the order paper and work out what is being engraved
  2. Open Google Drive and find the folder for that day
  3. Find the customer's artwork in it and download it
  4. Import the file into the laser software
  5. Find the font the paper names in a long list
  6. Type the name, then resize and move it until it fits the piece
  7. Set the speed and power for the finish
  8. Check the paper once more, then mark

Each manual step is a chance to engrave the wrong name, font or item.

After · Laser Station

Scan, then press F2

Seconds, while the piece goes on the jig

  1. Point the scanner at the paper and pull the trigger
  2. The green bar says READY TO MARK, and the operator presses F2

What is left is the physical work: picking up the paper and putting the piece on the jig.

2 · Task by task

What
Before · by hand
After · Laser Station
Finding the artwork
BeforeSearch Google Drive for the day's folder, find the customer's file, download it, import it
AfterThe laser computer is signed into the shop's Drive, so the artwork is already there. The program picks the right file out of it, trims the margin and imports it, and the window names the photo and the day's folder it came from
Placing it
BeforeDrag and resize by eye until the head looks centred in the coin
AfterCentred and scaled in millimetres, at the largest size that still clears the edge and the ring hole
The text
BeforeFind the named font in a list, type the name, resize and reposition it, often more than once
AfterSet in the named font, sized and positioned to fit on the first try, with a note such as "Long text: made smaller to fit" when it had to shrink
Speed and power
BeforeSet by hand for a dark or a light engraving
AfterSet from the finish on the paper; the frequency is deliberately left as the template has it
Checking it is right
BeforeRead the paper again and compare it with the screen
AfterOne green bar shows the name, item code, finish and marking settings, so the piece on the jig is quick to check
A bad scan
BeforeA misread was only noticed on the finished piece
AfterA checksum catches a partial scan and asks for another
More than one piece in an order
BeforeThe whole setup again, by hand, for the back face or the next charm
AfterAuto shift: the next piece loads itself once the mark finishes, with no second scan or button press
Who presses Mark
BeforeThe operator
AfterStill the operator. The program drives everything in EZcad except Mark, and never answers Yes to a save prompt
8 → 1
steps the person does per piece: eight manual ones became one scan, with F2 at the end
40%
less time at the engraving station, measured by the shop after the program went into daily use

How It Works

What happens between the scan and READY TO MARK

Laser Station is a small window that sits in the corner of the laser computer's screen. It has no file dialogs and nothing to type into. A code comes in, and either the laser is set up or the screen explains why not.

The path of one scanA Python desktop program for Windows
Printing program
One QR per item
Printed on the order paper. The code carries the order number, item code, finish, what to engrave and in which font, with a checksum
Scanner hook
Catch the keys
The 2D QR scanner types into whatever window is in front, which at the laser is EZcad. A low level keyboard hook recognises the code by its prefix and takes the keystrokes before they land anywhere
Laser Station
Work out the job
Decode and check the code, find the template for that item, find the customer's artwork, work out the text, the font, the size and the position
EZcad 2.14.10
Driven, not clicked
Opens the template, imports the artwork, sets the text, font, size, position, rotation and the pen's speed and power, each command waiting for EZcad to finish before the next one
READY TO MARK
The person presses F2
The program never presses Mark, and never takes the keyboard away from EZcad while it is showing this
Program I builtOutside program or serviceWhat comes out

Step by step

How a person uses it

The operator scans the order paper and presses F2. Everything in between is automatic.

  1. 01

    The order paper arrives with a code on it

    The printing program puts one QR code on the paper for every item that gets engraved.

    • The code carries the order number, the item code, the finish, and the text and font for each engraved face or piece
    • Below it, the same information is printed in words, so a person can read what the code says
    • An order with two engraved pieces gets two codes, in the order they are made
    How I built it: The order paper
    • Both programs read one shared payload file, so the printer and the laser use the same data
    • The code is versioned, and the reader handles every format the printing side has used
    • A three byte checksum catches a half read scan before anything is engraved
    Order paper · one pieceA printed order paper in a bag: an item code, a scannable QR code, and the engraving details printed in words below it, with a black box over the header block
    One code per engraved piece. The item code, finish, font and selections are printed underneath it, exactly as the laser will use them.
    Order paper · two namesA second printed order paper with a scannable QR code and a two name engraving, with a black box over the header block
    An order with two names and two birthstones. Everything the laser needs is in the code, and in print for the person. Only the header block is covered.
  2. 02

    Scan it, anywhere on the screen

    The operator points the scanner at the paper and pulls the trigger. Nothing has to be clicked first.

    • The scanner works whatever window is in front, including the laser software itself
    • A scan that is not a Laser Station code is handed straight back to whatever window was active, in order, so the scanner still works normally for everything else
    • A damaged or partial scan is caught by the checksum and asks to be scanned again
    How I built it: Scanning
    • A 2D QR scanner behaves like a keyboard, so a scan is a burst of keystrokes into whatever window has focus. At a laser that is EZcad, where stray characters land in the artwork
    • A low level Windows keyboard hook watches for the code's prefix, holds the keys while they could still be a code, and swallows them once it completes
    • Keys that turn out not to be a code are replayed into the active window in order, so normal typing still works
    The laser software's canvas filled by the program: a traced pet portrait inside a coin outline with the pet's name in script underneath
    A few seconds after the scan. The template, the customer's traced portrait and the name are all in place on the laser's canvas.
  3. 03

    The program sets the laser up

    Everything the operator used to do by hand happens while they put the piece on the jig.

    • Template: the right file for that item code is opened, discarding whatever was on the canvas
    • The item decides the rest: a photo coin wants a traced portrait with the name curved along the bottom, a cuff wants one line inside the guide box the shop drew, a medical bar wants the symbol out of the template with the text centred beside it, and a birth flower ring wants a picture and no text at all
    • Artwork: the customer's black and white portrait is found on this computer and imported, on white, with its margin trimmed
    • Text: set in the font the paper names, sized and positioned so it fits the piece and clears the ring hole
    • Laser settings: speed and power are set for a dark or a light engraving; the frequency is deliberately left as the template has it
    How I built it: Setting EZcad up
    • EZcad has no scripting, so the program drives it the way Windows does, by sending messages to its own windows and panels
    • Every command waits for EZcad to finish instead of pausing for a fixed time, so a setup takes seconds
    • EZcad quirks I found and worked around: Apply stays greyed out unless the change looks like a real keystroke, and size cannot be applied in the same step as text or the letters stretch
    • Save prompts are always answered No, so a template is never overwritten
    The laser software mid setup: the object list with the imported portrait selected, an object property panel showing position and size in millimetres, the pen parameter panel with speed, power and frequency, and the portrait and name on the canvas
    Mid setup. The imported artwork is selected, its position and size in millimetres have been applied in one step, and the pen's speed and power are set beside it.
  4. 04

    READY TO MARK, and the operator presses F2

    The green bar is the only thing the operator has to read.

    • The pet's name, the item code and the finish, so the piece on the jig can be checked against the screen in one glance
    • The marking settings being used, and which photo was chosen and from which day's folder
    • Any note worth knowing, for example "Long text: made smaller to fit"
    • Test runs a frame without firing, Log shows everything the program did, and Settings is where the folders live
    How I built it: READY TO MARK
    • A rule from reviewing the first version: clicking this window must not take keyboard focus from EZcad, because F2 is Mark
    • The window does not take focus, stays on top, and sits clear of the laser's own controls
    • A job counts as finished only when EZcad's Part counter rises on two consecutive reads while it is idle, so the next order loads only after the mark is done
    A photo coinThe Laser Station window showing a green READY TO MARK bar, the pet name, the item code and finish, the marketplace and item count with the order number blacked out, the marking settings, and Test, Settings and Log buttons
    The whole interface: name, item, finish, settings and the chosen photo. The operator then presses F2.
    A birth flower ring drawing, not a screenshotA drawing of the same window for a birth flower ring: the green READY TO MARK bar, the word May, a note about reading the month from what the customer wrote, and below it the ring band with the month's flower picture placed in the template's guide box
    The same window for a ring where nothing is typed. Twelve month pictures live in the template, and the one for the customer's month is copied into the guide box.
  5. 05

    An order with more than one piece carries on by itself

    Plenty of orders are not one engraving. A charm with a message on the back, a pendant with two faces, three charms on one bracelet: each of those is another setup at the same machine.

    • A job can hold several steps: one per piece, a front and a back, or one step with two faces
    • Without Auto shift, the operator moves between them with Back and Next, and a strip of dots shows which piece is on the laser now
    • With Auto shift ticked, the next step loads itself as soon as the mark finishes, with no second scan or button press
    • The tick is remembered between sessions, and the job on screen follows it the moment it changes
    • The steps are not always the same kind of thing: on one bookmark the verse goes on the bar and the reference goes on the heart, each in its own font
    • When the last step is done the window says Scan the next order paper
    How I built it: Auto shift
    • The next step rewrites the canvas, so it waits for the same Part counter check instead of a fixed delay
    • It advances only when there is somewhere to advance to, which stops a single piece job looping
    • Why it exists: pressing Next moved focus to Laser Station, so the operator's F2 went to the wrong window. With Auto shift, the usual case needs no click
    A three piece bracelet drawing, not a screenshotA drawing of the Laser Station window for a three piece bracelet: a green READY TO MARK bar, a blue strip reading BAR 1, piece 1 of 3 with three dots, the name Ava, and below it the three pieces in order, two name bars and a heart
    Two name bars and a heart, all from one scan. The bars come first and the heart last, the window names the piece in front of the operator before every Mark, and each name sits inside its own outline: 3 mm in from a bar's end, in the middle of the heart.

How I built it

How each part works

A Python desktop program for Windows, packaged as a single app and built with Claude Code. Most of the features below came from problems on the shop floor.

How each part works5 parts
01

Finding the customer's artwork

Finds the right picture in folders that are named by hand.

How I built it

  • The laser computer is signed into the shop's Drive, and today's and yesterday's folders are pulled down in the background, so the picture is already local when the code is scanned
  • Yesterday is searched too, because a photo prepared late in the evening lands in the previous day
  • File names are matched on the order number first, then narrowed by the pet's name, the finish and the face, so extra endings such as nobg or a copy's "(1)" are ignored
  • Colour photos are rejected: only black and white artwork is engravable, and the answer is remembered per file so it is ready before the order is scanned
  • The same path carries more than portraits: on a handwriting item the customer's own handwriting, photographed and reduced to black and white, is the engraving
02

Knowing how wide a text will be

Text sized to fit the piece on the first try.

How I built it

  • Letter shapes are read straight from the installed font files, and EZcad's "Height" is the font's em size, so font units convert to millimetres by a single scale per text
  • That lets the program measure the ink box of a name before it is placed, and shrink it to fit before anything is engraved
  • If a font is missing on this computer, or is a different file under the same name, the program says so and names the fix, because EZcad would silently substitute another font and the letters would come out wrong
03

Placing a portrait inside a coin

The head centred, at the largest size that still clears the edge and the ring hole.

How I built it

  • The picture is reduced to a grid of where it has ink, and the inked parts are centred on the coin's centre
  • The largest scale is found for which all the ink stays inside the coin's circle and outside the ring hole
  • For bookmarks cut around the head, the cut file's own outline is read back out of the DXF and the photo is lined up against it by overlap, so the engraved head matches the cut head
04

Reading the personalization text

Personalization fields are free text, and people put more in them than the engraving.

How I built it

  • Birthstone names, birth months and charm choices are recognised and taken out of the engraving, because "Mia, sapphire bs" means engrave Mia
  • Misspellings are matched by edit distance, with checks so a real name is not mistaken for a stone
  • A birth month arrives as a word, a sentence or a flower: “May”, “birth month is October”, “Rose” meaning June, and the right picture follows from it
  • On the breed coins a number is a picture: “#19 Max” means breed 19 out of the template's twenty, with Max underneath
  • Hearts, stars, paws and crowns are taken from the template's own symbol corner instead of a font, so they match the shop's own designs
  • Rules that only the shop can decide live in one plain text file per item code, in the shop's own words, so a rule can be corrected without changing the program
05

History and updates

A record of what was engraved, and updates that install themselves.

How I built it

  • Every job is kept and can be searched by order number or by pet name, so a re-print or a complaint can be checked
  • Only one copy of the program can run at a time, enforced with a named system lock, because two copies would both grab the scanner
  • New versions are published to a Drive folder and installed in place, and the program restarts itself into the new one