diff --git a/src/app/(dashboard)/[portSlug]/invoices/upload-receipts/page.tsx b/src/app/(dashboard)/[portSlug]/invoices/upload-receipts/page.tsx
new file mode 100644
index 0000000..716a8a9
--- /dev/null
+++ b/src/app/(dashboard)/[portSlug]/invoices/upload-receipts/page.tsx
@@ -0,0 +1,16 @@
+import type { Metadata } from 'next';
+
+import { UploadReceiptsGuide } from '@/components/invoices/upload-receipts-guide';
+
+export const metadata: Metadata = {
+ title: 'How to upload receipts',
+};
+
+export default async function UploadReceiptsPage({
+ params,
+}: {
+ params: Promise<{ portSlug: string }>;
+}) {
+ const { portSlug } = await params;
+ return
+ You paid out of pocket for something the marina needs (fuel, hardware, a part run, + lunch with a broker). Snap a photo of the receipt and this tool turns it into a + reimbursement request. It pulls out the vendor, the date, the total, and the currency, + drops them into the expense form, and queues the whole thing for the parent + company's finance team to approve and pay you back. +
++ The behind-the-scenes part is called OCR (short for “optical character + recognition”). Think of it as a fancy phone camera that knows how to read + printed text. Combined with a bit of AI to figure out which number is the total and + which is the tax, it turns a paper receipt into a ready-to-save expense in about five + seconds. No typing. No spreadsheets. No chasing finance for the form. +
+{description}
+Low-confidence read — please double-check the fields
+Low-confidence read - please double-check the fields
{engineLabel} returned {Math.round(parsed.confidence * 100)}% confidence.
@@ -132,7 +136,7 @@ function VerifyForm({Receipt parsed — confirm the fields and save
+Receipt parsed - confirm the fields and save
{engineLabel} · {Math.round(parsed.confidence * 100)}% confidence.
@@ -302,14 +306,14 @@ export function ScanShell() { setImagePreview(URL.createObjectURL(file)); setState({ kind: 'processing', engine: 'tesseract' }); - // Always run Tesseract first — it's free, on-device, and gives us a + // Always run Tesseract first - it's free, on-device, and gives us a // baseline parse we can fall back to if the optional AI pass is off // or fails. The WASM bundle dynamic-imports inside `runTesseract`. let tesseract: Awaited