Lockyard

Remaining gaps

Who it is for

Anyone deciding what to build next. This page is the gap list. The other pages describe what the site already does.

What already works

A person can run a facility from the screens in this guide. Staff can add a location, units, and size codes, take a reservation, move someone in or out, record a payment, run the next rent invoice, apply late fees, schedule a rate change, and print a statement. A customer can browse open units, and can reserve or move in when that facility's policy allows it. Card pay and autopay go through Stripe when keys are set.

Those jobs do not run by themselves. Someone has to open the screen and click.

What still has to be programmed

The site does not run unattended

There is no scheduled job. sst.config.ts does not define a cron.

These actions exist, and each one waits for a staff click:

  • The billing run, generateRecurringRent in lib/recurringRent.ts, on /admin/facilities/[id]/billing.
  • Late fees, applyLateFees in actions/delinquency.ts, on /admin/facilities/[id]/delinquency.
  • Expired holds, expireDueReservations in actions/expireReservations.ts, on the Rentals tab.
  • Due rate changes, applyDueRateChanges in lib/rateChanges.ts, on /admin/facilities/[id]/rates.

Leave the site alone and rent is not billed, a hold does not expire, a late fee is not posted, and a scheduled rate change does not apply.

Nobody is emailed

There is no mailer in the app. No reservation confirmation, invoice, late notice, or password reset is sent.

A rate-change notice is a timestamp. Staff click markNoticeSent in actions/rateChanges.ts. That does not send a letter or an email. Password reset and account deletion are not in the sign-in flow. See Signing in.

Money and the customer account

  • A ledger reversal does not refund the card. reverseLedgerEntry and issueCredit in actions/leaseView.ts write ledger lines only. The lease screen says the card was not refunded.
  • Facility settings can offer monthly, quarterly, and annual billing. The billing run ignores that choice. lib/recurringRent.ts always creates the next monthly period. It does not read billingCadence.
  • A customer cannot edit their own name, phone, or address. Contact fields are on the staff tenant page.
  • The gate code is a string staff type in. Nothing generates it, and nothing talks to a gate vendor.
  • Insurance can appear as a ledger kind. There is no screen to add an insurance charge to a lease.
  • Tenant.idPhotoUrls is stored and always saved as an empty list. There is no upload on the tenant page.
  • Room.combinedWith is stored. No screen merges two units or keeps their rates and map boxes in step.

Left for later on purpose

DATA_MODEL.md already parked these, and the code still does not have them:

  • Letters or email templates from facility policy.
  • A gate or access-control vendor.
  • Lien and auction.
  • Selling shop merchandise on the move-in screen.

The Shop is a separate catalog. A shop order is not a storage lease, and move-in does not add retail to the invoice.

What is not a gap

The tour is a short look, not the whole product. Reports, rate changes, late fees, Stripe, and the Rentals tab are programmed. They are described in this guide and left out of the video on purpose. See Overview.

DATA_MODEL.md and FEATURE_STATUS.md still say large parts of this app are unbuilt. Those checkboxes are stale. Trust this guide and the code.

npm run lint is broken because of an ESLint config cycle. That is a tooling problem, not a missing screen.