
Shipping a parcel means guessing three things at once: which box, what it will cost, which carrier. PackShip answers all three from a LiDAR scan, a photo or a product name.
A React Native app with the packing solver and the 3D view running on the phone, and an Express backend on Railway with Postgres and Redis that proxies UPS, FedEx and USPS rates and the dimension lookup. Measuring is ARKit with the LiDAR scanner. 349 Jest tests cover the app and 22 the backend. Version 1.2.0 is on the App Store.
Outcome
PackShip: Shipping Calculator is on the App Store at version 1.2.0, with a free tier and two subscriptions through RevenueCat. Every screen on this page is the app's own, captured on a Pro iPhone. The two at the top are the same package seen twice: the 20 by 14 by 10 inch box the solver chose, filled to 94.5 percent, and the rates quoted for it, cheapest first.
Finding the box
The solver runs on the phone. It starts from 149 boxes, envelopes and mailers across USPS, FedEx, UPS and the sizes a store sells, plus any custom box the user adds. It drops every one that is too small, too short for the longest item or rated under the items' weight, then tries the rest smallest first, with envelopes and mailers ahead of boxes because they ship cheaper. Each box gets six item orderings and each item six rotations. The first box that takes every item is the answer, drawn in 3D with the used volume against the box volume.
When nothing fits, the app names the item that blocked the pack and the box that came closest, and offers to split the order across up to five packages. A second pass re-packs the chosen box for stability, so six thin items do not end up in one tall column that collapses in transit, and keeps that result only if stability improves and the fill rate drops by less than three percent. The app carries 349 Jest tests, 18 of the 31 files on the solver.
Three carriers, one list
Rates come from the carriers' own APIs through the backend, one call per carrier in parallel, so one carrier failing never blanks the other two. Each quote is cached in Redis for 15 minutes, keyed on the exact box, both zip codes, the weight and whether the address is residential, and the list comes back sorted cheapest first with the cheapest and the fastest marked. A user who links their own UPS, FedEx or USPS account gets their negotiated rates instead, and the account number is stored encrypted with AES-256-GCM.
Each carrier sits behind a circuit breaker: three failures open it for two minutes, and the app is told at once that the carrier is unavailable. An expired OAuth token is refreshed and the call retried once before it can count as a failure. Rate lookups are metered per user, per month, in Postgres, 15 per carrier on the free tier, and the counter is a single atomic upsert, because two concurrent requests once collided on the same row.
Getting the dimensions in
Type the dimensions, tap the AI chip beside the name field to look them up, or tap the scan icon beside a field and measure it with the phone's LiDAR. The scan is ARKit with scene depth, so it needs a Pro iPhone. Each point is sampled across up to fifteen frames and placed at the median, then anchored in the room so it stays put while the phone moves. If tracking is limited or there is no surface under the crosshair, the app says so and places nothing.

Looking an item up, and keeping it
The lookup is a server call. The name, brand and model go to OpenAI, or a photo goes first to identify the product, and the answer comes back as dimensions in inches with a confidence level. The lookup refuses a low-confidence answer rather than guessing: anything below medium is rejected and the user is asked for a brand or model. A hit is cached for seven days in Redis and kept in Postgres, so the next request for the same product is served from the cache.
What comes back is saved to the account, so the second time is a tap. Items and packages live in Postgres behind Apple, Google or email sign-in, import and export as CSV, and a rate list exports as a PDF.


Dimensions retrieved from available online resources.
Project details
- Tests349 Jest on the app · 22 on the backend
- DeploymentApp Store 1.2.0 · Express backend on Railway
- Year2026
- PlatformiOS
- App Storeapps.apple.com/app/id6754204899
Have an app that needs to reach the App Store?