Small tools. One-time purchases. Real examples and setup guides. Try the available previews before buying.

Perunlight Corp

KupalaKit · Worked example

Keep the flower order and the revised class plan together

Two cancellations change the stems you need. One late booking changes which session needs them. A short delivery changes what is actually available. Work through each change before printing the preparation pack.

By Perunlight · AI-assisted. Original fictional workshop; the exact free CSVs were independently recalculated without application code. Published .

Count spare and demo sets for each kit and session

Willow Lane is a fictional posy workshop with morning and afternoon sessions. Open varieties.csv, recipes.csv and sessions.csv in the free pack. Garden posy K1 uses 3 garden roses (GR), 5 spray roses (SR), 3 snapdragons (SN), 4 eucalyptus (EU) and 5 waxflower (WX) stems per set. Petite posy K2 uses SR 3, EU 2 and WX 3.

The morning starts with ten Garden posy seats and one tutor demo. The afternoon starts with six Garden posy seats and four Petite posy seats. Add one spare set per five seats, rounded up separately for every session and kit. Zero seats get zero spare sets.

Morning K1:   10 seats + ceil(10 / 5) spares + 1 demo = 13 sets
Afternoon K1:  6 seats + ceil( 6 / 5) spares + 0 demo =  8 sets
Afternoon K2:  4 seats + ceil( 4 / 5) spares + 0 demo =  5 sets

Every spare or demo set receives the same recipe as a participant set. If you import the three CSVs into a new paid-app project, choose the one-per-five spare policy explicitly: that policy is not encoded in these CSV files. The built-in example already includes it.

Round the first order to whole bunches

There are 21 Garden posy sets and five Petite posy sets. Multiply these by the recipes. Garden roses arrive in bunches of 12 stems; the other varieties use bunches of ten. This exercise keeps the allowance at zero.

                    GR    SR    SN    EU    WX
R1 stems needed      63   120    63    94   120
Stems per bunch      12    10    10    10    10
Whole bunches         6    12     7    10    12
Ordered stems        72   120    70   100   120
Left after the plan   9     0     7     6     0

The order is 47 bunches. At the fictional CSV prices it totals 443.60 when GBP is selected; these are sample prices, not supplier quotes. Freeze this order as R1. Later seat changes must not silently rewrite what you originally ordered.

For garden roses, the morning needs 13 × 3 = 39 stems. Open four bunches, take 39 and carry nine loose stems forward. The afternoon needs 8 × 3 = 24: use those nine, then open two more bunches and take 15. Nine stems remain.

The plan has one seat bucket per variety per session, plus one combined spares-and-demo bucket per session: ten seat-bucket labels and two combined labels, twelve total. Allocation rows inside the combined buckets are not additional physical buckets.

Keep the order and received stems distinct. Willow Lane R3 needs 95 waxflower stems from a delivery of 100. The original order remains 120. Blank Received cells are assumed deliveries, not confirmed stock.
Willow Lane R3 needs 95 waxflower stems from a delivery of 100. The original order remains 120. Blank Received cells are assumed deliveries, not confirmed stock. View full size

This screenshot shows the later R3 plan. Its Ordered column still records R1. A blank Received cell explicitly means assumed from the order, not a confirmed delivery. Enter what actually arrives before using the plan to prepare a real class.

Keep the cancellation and late booking in a new revision

For R2, two morning Garden posy attendees cancel, leaving eight seats. One afternoon Petite posy attendee joins, increasing that kit to five seats. The morning still needs two spare sets and one demo; afternoon Garden posy remains six seats plus two spares, while Petite posy has five seats plus one spare.

                    GR    SR    SN    EU    WX
R2 stems needed      57   113    57    88   113
Available            72   120    70   100   120
Left after the plan  15     7    13    12     7

Available stock is unchanged, so the comparison can express planned transfers: three spray roses, two eucalyptus and three waxflower stems from morning seat allocations to afternoon seat allocations. The remaining reductions return GR 6, SR 7, SN 6, EU 6 and WX 7 to the unallocated pool.

Replan after cancellations and a late booking. R1 to R2 keeps the same available stock. The plan transfers 3 spray roses, 2 eucalyptus and 3 waxflower stems from morning seat buckets to afternoon seat buckets.
R1 to R2 keeps the same available stock. The plan transfers 3 spray roses, 2 eucalyptus and 3 waxflower stems from morning seat buckets to afternoon seat buckets. View full size

These are differences between two plans. They do not establish that the original buckets were prepared or that anyone moved stems. Compare the plan with your actual buckets, label the change and approve R2 when it is feasible.

Resolve the short delivery without inventing received stock

Now only 100 of the originally ordered 120 waxflower stems arrive. R2 still needs 113, so it is short by 13. The proposed top-up is ceil(13 ÷ 10) = two bunches. Recording that proposal as ordered does not make the stems available; received quantities must be entered when they arrive.

Catch a short delivery before approval. With only 100 waxflower stems received against a need of 113, approval and the ready packet are blocked. Two proposed top-up bunches are not received stock.
With only 100 waxflower stems received against a need of 113, approval and the ready packet are blocked. Two proposed top-up bunches are not received stock. View full size

While the shortage remains, KupalaKit blocks approval and the ready packet. You can still inspect the draft and print documents labelled DRAFT. In this fictional example, the tutor instead changes the Petite posy recipe: replace its three waxflower stems with two snapdragons in every participant and spare set. This is an example of an entered decision, not flower-substitution advice.

Afternoon K2: 5 seats + 1 spare = 6 sets
Waxflower reduction: 6 × 3 = 18 stems
Snapdragon addition: 6 × 2 = 12 stems

                    GR    SR    SN    EU    WX
R3 stems needed      57   113    69    88    95
Available            72   120    70   100   100
Left after the plan  15     7     1    12     5

The afternoon seat allocation changes from 18 to 28 snapdragons and from 45 to 30 waxflower. Its spares-and-demo allocation changes from six to eight snapdragons and from 13 to ten waxflower. That is four changed allocation rows and sixteen unchanged rows out of twenty; these rows are not counts of physical buckets.

Use a revised plan when stock changes. R2 to R3 changes received stock and the Petite posy recipe. KupalaKit shows allocation changes and does not generate a move list.
R2 to R3 changes received stock and the Petite posy recipe. KupalaKit shows allocation changes and does not generate a move list. View full size

Available stock changed between R2 and R3. The app therefore shows a revised preparation plan without a transfer list. The old physical buckets may never have existed as planned. Review the revised quantities and actual stock before approving R3.

Check the print pack and keep an editable project

For this article, an independent calculation parsed the exact free CSV files and reproduced R1/R2/R3 needs, whole-bunch orders, leftovers, the twelve labels, booking transfers, the thirteen-stem shortage and the four changed allocation rows. It also checked garden-rose bunch breaks. This checks the worked arithmetic; it does not verify real flower deliveries or a physical printer.

  • Set the spare policy per kit and session before freezing the order.
  • Keep Ordered and Received distinct; blank Received means assumed delivery.
  • Resolve shortages before approving and downloading the ready packet.
  • Check planned allocations against the actual buckets.
  • Download project before closing, then keep the JSON file with your other class records.

In the paid app, open 6 Print & export and select A4 or US Letter. Prep sheets are grouped by session and can continue across pages. Bucket labels use two columns, with up to ten per page; longer combined spares-and-demo lists use additional label parts. Participant recipe cards form one card set per kit, not per attendee. Long recipes split into numbered parts, up to two parts per page, each repeating the whole-kit stem total; print enough copies for your class. Content length can add pages. Use 100% scale and Default margins, inspect every preview page, and check a physical test page.

A ready ZIP is capped at 10 MiB (10,485,760 bytes), including archive headers. It includes CSV order/bucket/bunch-break data, printable A4 and Letter HTML, the project and a revision record. The canonical order CSV preserves names; use the spreadsheet-safe order CSV when opening untrusted names in a spreadsheet. Choose Download project for an editable .kupalakit.json copy with all approved revisions. Download project and the ready packet validate the serialized project with the same rules used when reopening it. Invalid text remains in the draft for correction and is not downloaded. A structurally valid project with a shortage can be saved and reopened; the shortage still blocks approval and the ready packet. Draft printing remains available and is marked DRAFT. Historical revisions show only top-ups recorded before that revision was approved. There is no autosave.

KupalaKit supports up to 60 varieties, three kits, six sessions, 200 total seats, 30 approved revisions and 30 recorded top-up orders. Project input is capped at 4 MiB. Each CSV is capped at 512 KiB, with usable limits of 60 variety records, 60 recipe-line records and 18 session/kit records. It is a local planning tool with no booking or wholesaler integration and no physical inventory tracking. It is designed for desktop Chrome on Linux, with A4 and US Letter layouts. Other systems and physical printing remain unverified. Read the full guide for import limits and the license.

Perunlight product

Prepare your next flower workshop

KupalaKit turns per-seat recipes and session bookings into whole-bunch orders, session allocations, bucket labels and participant recipe cards, with saved revisions for later changes.

KupalaKit · $19 onceRead the guide

Extract the buyer ZIP and open KupalaKit.html in desktop Chrome. Designed for desktop Chrome on Linux. Save projects explicitly with Download project.