Nupik Wenpach LLC · Independent software studio

Obsessive about the parts you will never even notice.

Which is exactly the point. A week of work scrapped on a Thursday. The same screen rebuilt four times. A Sunday spent on something nobody will click. Two hours on one word. Custom sites, web apps, and native iOS, built end to end and still looked after once they ship.

01 / Work

Latest projects

Nearly everything here is live, in use, and built and run end to end by this studio: a town’s own board, a bakery’s ordering, the platform that bakery grew into, a work order system for field crews, the portal clients sign in to, and the tools the studio built for itself along the way. The one still being built, Agger, is for contractors. The screens are the real apps, running on invented data.

The front page of getagger.com in its day sheet, drawn as a blueprint: the name in block letters on a road profile, the headline From bid to bill, without typing it twice, and an isometric drawing of an invented central tank battery beside it.
A priced bid in Agger for an invented pipeline job: the price, cost and margin across the top, the customer and markup, and bid items for clearing, ditching, welding and lowering in, each with its crew, hours and materials costed beneath it.
The job cost report for that pipeline once it was won: the bid as budget, cost to date and projected cost, then a table with one line per cost code: its budget, what it has cost, the quantity installed, percent complete, the projection and how far over or under it lands, with a note under the two codes that have no quantity installed yet, and a total.
Web In development

Agger

Estimating and job cost for oilfield contractors. A bid is built at the contractor’s own rates, from the estimator’s workbook or an operator’s rate sheet, with takeoff quantities brought in, vendor quotes compared and the gaps named. Win it and the bid becomes the job’s budget by cost code, so nothing is keyed in twice.

A crew in the field logs hours, equipment and quantities to the job’s codes on a phone, with or without signal. Job cost reads what has been spent and what the job is projected to cost against the budget, and the bill lines come out at each operator’s rates in an OpenInvoice upload file, checked line by line. Month end reports for each client, and invoices, are still being built. Its first testers are being taken on now.

  1. Bidbuilt
  2. Job costbuilt
  3. Month end reportsbuilding
  4. Invoicesbuilding
How it was built

A bid, its budget and its bill must agree to the cent, so every figure is whole cents, rounded once, half up. Every estimating route checks the caller’s seat first, and a script fails the build if one does not.

estimating routes
37
check scripts
58
  • Next.js
  • Postgres
  • Prisma

Details

  1. Letters on the ground line The orange station dots sit where the extruded letters actually stand, not under their front faces, so the wordmark rests on its ground line the way a real extrusion would.
  2. Priced as unit times quantity A bid is read as unit price times quantity. Here $0.83 a foot over 22,400 feet is $18,592, so each unit price rounds once, to the cent, half up, and the item total follows from it.
  3. No percent, no guess A code with nothing installed has no percent and no projection, and the report says so in words rather than printing a zero or a guess. Here, 4 of 6 codes have a projection.
getagger.com
The Desk in modulate.pro, Work side: a strip of notes that need attention, a timeline of the day’s deadlines, and three columns of notes headed Today, Ahead and Unscheduled, with a note box across the bottom.
A work order opened as a full page beside a list of twelve: a dump valve rebuild with its form, project, priority and estimate across the top, the requester’s answers on the left, a four line cost ledger on the right, and crew notes below.
The forms studio editing a Maintenance Request form: its number prefix, estimate and four phases, one shown only when a leak is reported, beside a live preview of the questions a requester sees.
Web Live

modulate.pro

Your own notes, your team’s work and your work orders, on one account. A thought written in the truck is waiting on the desk: Today, Ahead, and the ones nobody has dated yet, with the day’s deadlines laid out above them. Offline is not a failure state.

On the company side, anybody with a link can file a request: a form that asks only what the answers before it make relevant, photographs, and a GPS fix from the phone. It lands on a project board as a numbered work order carrying its checklist and its cost ledger, and a technician closes it in three taps. What the forms collected comes back out as a spreadsheet and a field report with the sites drawn on a map.

How it was built

A note written with no signal must not be lost. It waits on the phone and goes up when the signal returns. Each send carries a key, so a retry after a lost reply gets the work order already made, not a second.

data models
143
API routes
246
  • Next.js
  • React
  • Postgres

Details

  1. Numbers replace the form name Give a form a prefix and its work orders count from MR-1001, and the card drops the form's name, which the letters, the words and the colored chip would otherwise say three times.
  2. A question tied to another Compressor hours only appears if the unit is a compressor. The studio names the question each one hangs on, since a hinge you can see named is one you can follow.
  3. Actual adds itself up The actual is added up from the cost lines unless you type a total over it, and it says so under the field. The gap to the estimate reads in words: $216.10 under.
modulate.pro
The Carlsbad Sourdough storefront with ordering open for a Sunday pickup: four pools of bread marked sold out, almost gone, some left and in stock, the week’s featured loaf, a phone number box to start an order, and the top of a card explaining how ordering works.
The bakery’s open orders for one week’s drop: the order count, takings and unpaid total above cards for orders to review, confirmed, and ready for pickup.
The pickup day sheet: every customer against every product with quantities, what each still owes, collected orders struck through, and totals along the bottom.
The storefront on a phone: four bread pools sold out or some left, the featured loaf, a box for a phone number.
Web Live

Carlsbad Sourdough

Where OvenBoard started. A neighborhood bakery that used to sell out through a third party storefront and a phone full of messages now opens its own ordering window every Friday morning, and closes it the moment the last pool sells out. Every loaf is promised once, however many people press order at the same second.

The regulars are recognized without anybody keeping a list: the biggest spenders become Founders, a weekly streak earns early access, and the drop text goes out in waves in that order. Pickup day is one sheet of names against loaves, with what each person still owes beside them.

How it was built

Everyone presses order the minute a window opens. Each order is a serializable transaction, and one that loses a race tries again after a short pause. A test sends eight two loaf orders at a ten loaf pool at once, and no more than ten sell.

tests
465
tries per order
6
  • Next.js
  • React
  • Postgres
  • Prisma

Details

  1. Status, not a count Stock shows as five notches and a word, not a number. A number invites arithmetic, and the only decision here is whether to hurry.
  2. One number, one customer However a phone number is typed, with dashes, spaces or a leading 1, it collapses to the same ten digits, so one person never becomes three customers each holding part of their history.
  3. The screen stays awake The pickup sheet sits propped up all through fulfillment, and an iPad dims just when both hands are in a bag of bread. Keep screen on holds it awake: off by default and remembered.
carlsbadsourdough.com
The price section of an offer in The Portal, for an invented bike shop: two packages to choose between with the recommended one selected, three optional add-ons, and below them the total with New Mexico gross receipts tax, what is due today, what comes later, and buttons to accept, decline or ask a question.
A client’s workspace in The Portal, for an invented coffee roaster: the engagement’s title, a line saying it is signed and paid, four dated next steps, a documents section and a link to something new the studio suggests.
The message thread between an invented coffee roaster’s owner and the studio: a question about a Friday cutoff for pickup orders, the studio’s answer beneath it, and a box to write the next message.
An offer on a phone: two packages, three add-ons, and a fixed bar with the total and an Accept button.
Web Live

The Portal

Where the studio’s offers are read, signed and paid. A prospect opens one link on a phone, with no account: the work built for them, the whole price with every choice added up by the server, and Accept, Not interested and Ask a question given equal weight. Signing is a six digit code sent to their email and a typed name, and the deposit is paid by card, or by bank transfer or check at a discount.

Once it is paid, the client signs in by an emailed link, with no password, to a workspace of their own: the next steps with their dates, the signed agreement, invoices and receipts, and a thread for writing to the studio, answered by the person who built the work. The studio’s side, where offers are composed, sent and followed, is private.

How it was built

A prospect opens one link on a phone with no account, so the server adds every total, in whole cents, and the page only shows it. An offer can be read, configured and signed with scripts off.

tests
2,732
data models
79
  • Next.js
  • Postgres
  • Prisma
  • Stripe

Details

  1. Tax on each payment Gross receipts tax is its own line, never inside a price, and each payment is taxed alone: $214.48 today, $214.48 at launch. That can differ by a cent from taxing the total and splitting it.
  2. Rules said on the card Gift cards say "Only with Booking and shop site" right under the line. A selection that breaks a rule is refused with the rule in words, never silently corrected.
  3. Never sent twice Each message gets a key before its first try and waits in the browser until the server confirms it, so a dropped connection can neither lose it nor post it twice.
portal.nupikwenpach.com
The Carlsbad411 board: a composer with starter prompts, a neighbor asking who to trust for air conditioning repair with the answers ranked by agreement and tagged with the business each one names, and side rails showing badges, a football score and this weekend’s events.
The Carlsbad business directory: a map of central Carlsbad and the Pecos River covered in business pins, beside a list of places ranked by neighbors’ star ratings.
The town events calendar for October, most days filled with color coded community events, high school games, city meetings and farmers markets.
Web Live

Carlsbad411

The town’s own board. Carlsbad has been running its news, its questions and its rumor mill through four different Facebook groups, and this is the one it owns. Ask who to call and the answers rank themselves by how many neighbors agree, naming the businesses they mention, so the directory learns who the town trusts from what people actually say.

Around it: a directory on a map, a calendar where a moderator has seen every event before the town does, a marketplace, groups, and weather alerts, road closures, city meetings and the high school’s scores brought in on their own. Residents who prove they live here get a room that is theirs alone. It installs on a phone like an app, and signing in is a text rather than a password.

How it was built

A directory that learns who the town trusts must not read like star ratings. It counts the times a neighbor named a place while answering someone else’s question, and shows nothing at zero. An answer may name three places at most.

tests
1,153
places per answer
3
  • React
  • Node
  • Express
  • WebSockets
  • Postgres

Details

  1. Going around, ranked The rail card ranks open talk by pull: a reply counts double a reaction, and a question gets a small boost. It also says plainly whether anyone has checked it yet.
  2. Named by neighbors Beside the stars, a place shows how many neighbors named it while answering someone else's question. That is a different fact from a rating, and it stays blank at zero instead of a hopeful 0.
  3. Warned before you post While you type, the composer can warn you about things like a house number in your draft. The check runs on the spot, and nothing you type is stored to do it.
carlsbad411.com
OntoStrata searching an invented company’s locker for deploy: filters for every kind of item and every repository, then results each labeled gotcha, decision or rejected, with the reasoning, the words it came from, the file it came from and the names it touches.
One decision about how an invented app signs people in, marked replaced, with its reasoning and source quote, beside a record of all three versions of that decision from the first to the one that holds today.
The graph view of an invented company’s locker: its products, services, people and libraries drawn as a network around the main product, beside a list of every named thing and how often it appears.
Tool In house

OntoStrata

The studio’s memory. Every decision, standard and hard won gotcha across these projects is distilled into one short item that keeps its reasoning, the words it came from and where it was said. When a decision changes, the new one points at the one it replaced, so the locker answers with what is true now and can still show how it got there.

Two doors onto one query layer: a web app for reading, and an MCP server that coding sessions ask before they build and write to as they decide. A scheduled harvest reads new commits and documents and files what they settled, and a guest portal lets an invited person put questions to it. These screens run on an invented company, because the real locker is private.

How it was built

A person on the web and a coding session over MCP both ask the locker, and neither may be told what the other would not be. Both go through one file of queries. Nothing in the graph is inferred: an edge is something an item names, or a decision it replaced.

MCP tools
9
data models
14
  • Next.js
  • Postgres
  • pgvector
  • Prisma
  • MCP

Private, by invitation only

Details

  1. Every result shows its source Each result carries the sentence it was drawn from, word for word, plus its file and date. Search blends full text with meaning, so a paraphrase still finds it.
  2. Replaced, never overwritten When a decision changes, the old version stays in the record, marked replaced, with its date and reasoning. You can see what was held, when, and what replaced it.
  3. A click only selects Clicking a dot selects it and offers choices; it never takes you anywhere. The first version navigated on any tap, which fails on a phone, where there is no hover to learn what a dot is.
A bakery’s storefront during an open drop: loaves marked almost gone, sold out pastries each offering to say when they are back, and an order rail with the buyer’s basket, a chosen pickup time and an offer to make it a standing order.
The maker’s board for one weekly drop: twelve orders across To review, Confirmed, Ready and Picked up, each carrying its pickup time, items, total and whether it is paid, under the pool counts and this week’s standing orders.
The banner press: four ready to post pictures drawn from the live board, reading Ordering is open, Last call, Still on the board with what is left, and Sold out, each carrying the shop’s own address.
Web Live

OvenBoard

Sell your bread the way you bake it. A shop of its own for independent bakers who work in weekly drops: the window opens on its own, the caps hold inside the order itself, and the regulars get a head start they have earned. Nobody is promised the same last loaf in two different messages again.

Buyers pick a pickup time, join a waitlist when a pool sells out, or turn a basket into a standing order that is filled before the public gets a look. Pickup day is a board, the bake sheet and labels print themselves, and the banner press draws a ready to post picture straight off the board. One plan, and every shop gets its own address.

How it was built

Every shop is one baker’s, and none may see another’s. Routes never touch the raw database client. The one they get adds the shop to every query, so nobody has to remember, and a probe in CI tries to cross the line.

data models
31
migrations
39
  • Next.js
  • React
  • Postgres
  • Prisma

Details

  1. A waitlist, no held seats Sold out items offer "Tell me when it's back". When stock frees up, everyone waiting is told at once and first to check out gets it, so no loaf sits unsellable behind someone who never answers.
  2. Regulars filled first Standing orders fill into each recurring drop before the public can order, so a regular's claim comes off the top of the cap. That is the 3 standing orders committed on this board.
  3. Banners cannot overpromise Each banner is drawn fresh from the live board, so a posted picture is never a promise the board can't keep. Two loaves and eighteen cookies left is what the board says.
ovenboard.com
The PikPach studio with an OvenBoard ad loaded from that brand’s set: its fields editable on the left, a live preview with the rail overlay marking where the platform’s own buttons will land, and a finished render ready to download.
All forty two ad formats, each rendered once by PikPach as a brand free layout and arranged in a numbered grid, from breaking news to venn diagram.
The twenty five feed ads in modulate.pro’s set, rendered and arranged in a grid with their names, above the ten layouts that brand refuses.
Tool In house

PikPach

The studio’s ad press. A study of sixteen paid social ads became forty two formats, and every one is drawn as a layout that knows nothing about whose ad it is. Each product brings a pack of its own colors, faces, mark, photographs and the layouts its positioning refuses, and the renderer holds that line.

A unit is refused when a face fails to load, when the copy gate objects, or when anything readable would sit under the platform’s own chrome. It runs as a command line and as a studio behind a password, off the same renderer, and draws for modulate.pro, OvenBoard, GrazePost, Carlsbad Sourdough and Carlsbad411.

How it was built

An ad can draw without an error and still be wrong. The renderer checks that each face loaded, because the browser’s own ready signal says yes when one failed, and it measures every readable word against the platform’s chrome. Each of its four refusals shipped something once.

refusals
4
brand packs
9
  • TypeScript
  • Chromium
  • Node

Private, draws for the studio’s own products

Details

  1. Where the buttons will land The dashed zones are where the platform's own buttons and caption cover an ad. Every readable word is measured against them, and a unit that hides its headline is refused, not shipped.
  2. Layouts a brand refuses A brand lists the layouts its positioning rules out, and the renderer holds the line. Here, ten of the forty four are closed to modulate.pro, and asking for one is refused by name.
  3. Copy checked before render Every line passes the brand's copy gate before a unit is drawn: no em dash, no banned words, no real names, and no phone number outside the 555-01xx fiction range.
A farm stand’s storefront asking the buyer to pick a Thursday farm gate or a Saturday market, pantry goods marked almost gone, and an order rail with a basket and morning pickup times.
The grower’s board for a Saturday market: ten orders across four columns with pickup times and paid state, pool counts with the boxes full at eight of eight, and three standing orders committed for the week.
The pack sheet for the Saturday market: twenty six items across ten orders grouped by pool with totals, beside tabs for order, item and bag labels.
Web Live

GrazePost

The same engine pointed at market day, behind a door of its own. Farm stands and market sellers take preorders through a shop of their own, across as many selling days as they keep, so the last jar is spoken for once instead of twice and the people who turn up every Saturday get the first pick they have earned.

Saturday morning it is a board at the stall: what is packed, what is paid, what is still to hand over. Pack sheets and labels come off it, and standing orders mean the regulars stop having to ask.

How it was built

One engine, two brands, and neither name may show on the other’s pages. A probe asks both addresses of one server and checks that each shop answers at its own brand’s address and not at the other’s.

tests, shared with OvenBoard
640
  • Next.js
  • React
  • Postgres
  • Prisma

Details

  1. Pick your day One shop can sell on several days, Thursday at the farm gate and Saturday at the market. Each selling day opens its own window with its own caps, name and place.
  2. Same totals at eleven The pack sheet counts everything not canceled, so a sheet reprinted at eleven, after half the pickups, shows the same totals as the one printed at four. Only a cancellation changes it.
  3. Only its own name A GrazePost shop's pages, emails and texts name GrazePost and never OvenBoard, though one engine runs both. A probe in CI checks that neither brand's name leaks across.
grazepost.com

If something here is close to what you need, start a project.

02 / Process

There is a process. It’s just not that interesting.

  1. Price up front

    Before a line is written, you know what it costs.

  2. A link in week one

    Something real to open and press, not a slide deck.

  3. The best idea wins

    Ideas get said out loud and taken seriously, whoever’s they are.

  4. Nobody disappears

    It is still looked after once it ships.

03 / Approach

In software, people make something, and it never grows past the original idea.

They see it as small.So they keep it small.

They don’t put the time, the effort, the perfectionism or the detailed design into it, because they never saw it as worthwhile in the first place.

Everything above started small. None of it was allowed to stay small.

Every project gets built like it’s worth something. Yours included.

04 / Contact

Tell me about it

A site, an app, or a half-formed idea you cannot quite describe yet. I read and answer everything myself, usually inside a day.

Or write directly

noah@nupikwenpach.com

Four short questions, one at a time

  1. What you need
  2. Where it stands
  3. Your words
  4. How to reach you

Your brief builds as you answer. Nothing is sent until you say so.