Change Log

45 entries
Treat BrickLink 204 response as success in updateOrderStatus

The BrickLink API returns HTTP 204 (no content) on a successful order status update. Previously this caused a JSON parse failure or a spurious API error; now it returns early as a success.

Update ShipList weight input to grams and extra cover to multiples of 100

Weight is now entered in grams and converted to kg on export. Extra cover steps in multiples of 100 with no decimal places.

Reformat pick list order column to show shipping name above order number

No additional details.

Show shipping name instead of buyer username in pick list order column

Falls back to buyerName if shippingName is absent.

Add part image popup dialog to pick list and order detail

Clicking a thumbnail opens a modal showing the full-size image, part number, name, lot description, color, and a link to the BrickLink catalog entry. Extracted the order items table into OrderItemsTable island so it can hold interactive state.

Replace e.target type coercions with e.currentTarget in event handlers

No additional details.

Extract OrderCard into components/OrderCard.tsx

No additional details.

Replace programmatic location.href navigation with anchor tags

Allows f-client-nav to intercept all navigation in OrdersTable and OrdersFilterTabs instead of triggering full page reloads.

Add admin logs page for viewing KV-stored log records

Adds /admin/logs route using listLogRecords() from logtape-kv-sink, rendering entries in a paginated table with cursor-based navigation. Includes sidebar Admin section with Logs link and scroll icon.

Add Fresh v2 partials for SPA-like navigation between pages

Sidebar links now swap only the main content region without reloading the page shell. Deep linking still works via full-page SSR. Fixes stopPropagation on order table links so partial nav is not blocked.

Persist sidebar collapsed state to localStorage across page navigations

No additional details.

Add message count column to orders and customer order history tables

Fetches BrickLink order message counts and displays a chat bubble icon with count next to each order that has messages. Results are cached in Deno KV with a 60-second TTL to avoid hammering the API on every page load.

Add buyer typeahead filter to customers page

Adds a text input with live suggestions fetched from /api/crm/buyers?q=, backed by a KV buyer index built during CRM refresh. Selecting a buyer filters to that customer via server-side lookup. Pagination is hidden while a filter is active.

Add customer detail page with member rating and order history

Adds /customers/{username} detail page showing the BrickLink member rating (PRAISE/NEUTRAL/COMPLAINT with percentages) and a full order history table drawn from the local order cache. Rating fetch failures are shown as a warning rather than a hard error.

Introduces BLMemberRating type matching the actual API wire format. Adds getMemberRating() to BricklinkClient and listCachedOrdersByBuyer() to kv.ts. Converts routes/customers.tsx to routes/customers/index.tsx to support nested routing, and links buyer names in the customers table to the detail page.

Add CSV import for backfilling purged order history in CRM

Adds POST /api/crm/import which accepts a multipart CSV file and maps rows (order_id, buyer_name, date_ordered, value) into BLOrderSummary records in the order cache. Returns a summary of imported/skipped/error counts with per-row error details.

Adds an Import CSV button to the Customers page that opens a dialog with a file picker and displays the import result summary inline.

Add BLOrderSummary type for GET /orders list response

Introduces BLOrderSummary to accurately represent the smaller payload returned by the orders list endpoint, distinct from the full BLOrder shape returned by the detail endpoint. getOrders() now returns BLOrderSummary[], the order cache stores summaries, and crm.ts aggregates from them.

Lazy-memoize Deno KV instance and return commit results from writes

Opens Deno KV at most once per process via a module-level singleton. Write functions now return Promise<Deno.KvCommitResult> by returning the KV promise directly rather than awaiting it, removing the redundant suspend point.

Preserve order history in local cache to survive BrickLink purges

Introduces a local order cache in Deno KV. The CRM refresh is now two phases: first sync live API orders into the cache (skipping PURGED entries to protect the last known-good data), then aggregate customer records from the full cache so history beyond BrickLink's 6-month window is retained.

Add order messages section to order detail page

Fetches messages from BrickLink API and displays them as chat bubbles in a tabbed layout alongside Order Items. Buyer messages are chat-start (primary), seller messages are chat-end (secondary), sorted ascending by date. Messages tab only appears when messages exist.

Add CRM customer aggregation with paginated customers page

Aggregates all inbound BrickLink orders by buyer_name (excluding cancelled) into a Deno KV-backed CRM. Tracks order count, first/last order date, and spend totals per currency. Customers page at /customers supports KV cursor-based pagination with Prev/Next navigation. An Update button triggers a manual refresh; a Deno cron job runs the same refresh automatically at midnight daily.

Split Package column into Package Type and Dimensions in ship list

No additional details.

Fix text colours for non-exportable rows in ship list

No additional details.

Remove ship order button and dialog from orders table

No additional details.

Add Prepare to Ship button to pick list, enabled when all orders are packed

No additional details.

Consolidate recipient email and phone into Recipient Info column in ship list

No additional details.

Consolidate ship list table columns into Order Info and Package

No additional details.

Add recipient phone number to ship list and AusPost manifest export

No additional details.

Disable Export Manifest button until all exportable rows have required fields

No additional details.

Exclude non-tracking shipping methods from exportable rows in ship list

No additional details.

Hide packaging fields for non-exportable rows in ship list

No additional details.

Move Drive Thru Templates to Settings section in sidebar

No additional details.

Rename Navigation section to Processing in sidebar

No additional details.

Move Shipping Methods to Settings section in sidebar

No additional details.

Add order total column to ship list table

No additional details.

Add Export Manifest button to ship list generating dated AusPost CSV

No additional details.

Strike through non-AU orders in ship list as they won't be exported

No additional details.

Add extra cover amount field to ship list table

No additional details.

Add weight field to ship list table

No additional details.

Add recipient email column to ship list, pre-populated from buyer_email

No additional details.

Add AU address verification to ship list edit dialog via AddressFinder

No additional details.

Add address line 3 field to AusPost address in ship list

No additional details.

Replace buyer/ordered columns with item count in ship list table

No additional details.

Add editable AusPost address mapping to ship list with KV persistence

No additional details.

Format shipping address as multi-line label in ship list

No additional details.

Remove status column from ship list table

No additional details.

© 2026 Kitson P. Kelly. All rights reserved.