Woodsmith is a self-hosted Next.js application for the Beaman Woodworks company website. It combines a public portfolio, shop, process writing, buyer account flow, contact-first custom work intake, project tracking, media library management, and a private Woodshop dashboard in one deployment.
- Public portfolio pages backed only by verified or explicitly review-marked media from the NAS photo library mounted at
/app/pics - Portfolio category filtering managed through editable labels, matching terms, and icon styles in the Woodshop dashboard
- Shop pages with asking-price language, cart totals, coupon handling, tax estimate, pickup/delivery/shipping labels, and Stripe checkout plumbing
- Process writing under the dedicated
/processarchive, with markdown content and optional source-credit links for outside references - Contact-first custom work requests with attachments, lead-time context, material preferences, project tracking, and an optional live procedural 3D scale preview
- Optional server-side OpenAI image-model previews for custom work when
OPENAI_API_KEYandENABLE_PUBLIC_AI_RENDERING=trueare configured; generated previews are stored back into/app/pics - Buyer account pages for signup, login, password reset, profile editing, profile images, and account-linked projects
- Private Woodshop dashboard with focused workspace tabs for editing settings, pages, pieces, custom work types, users, media, process notes, projects, orders, reviews, and notifications through structured browser forms
- Admin-only pencil controls that edit mapped public text and links in place, with an explicit full-editor link for structural work
- A compact browser media desk with whole-library and AI-state filters, in-place paging and edits, explicit candidate review, guided local training actions, training-weighted visual ranking, upload/rename/delete safety, persistent assignment, crop/focal controls, and source credit against the writable NAS photo library
- Email notification queueing, Stripe invoice creation, and EasyPost shipping-label requests when the related environment variables are configured
- Full-size image lightbox support with zoom, pan, arrow navigation, plus
Escand close-button exit behavior - Keyword/metadata search plus visual search across public content and, for admins, private media, visual labels, clusters, unpublished content, and project records. The optional local sidecar supplies shared image/text CLIP vectors; Gemini or OpenAI embeddings remain opt-in alternatives.
- Persistent light/day and black OLED night themes using the local ITC New Rennie Mackintosh font assets
- Programmatic Beaman Woodworks favicon and brand mark
- Safe profile administration for renaming accounts, replacing legacy developer emails, and deleting non-current users from the dashboard
- Compact auto-hide navigation that keeps the public and dashboard workspaces usable on narrow and desktop viewports
- Persistence uses
node:sqlite, which emits Node's experimental warning during build and runtime. - Studio overview reports the active
DATA_ROOT, SQLitequick_check, journal mode, and seed version so rebuild-safe persistence can be verified from the browser. Seed upgrades are non-destructive for existing Studio-edited records. /journaland/journal/[slug]now redirect to Process. New public writing should be published as Process notes.- The public custom work flow is contact-first and includes a credential-free procedural 3D scale preview. The older SVG renderer remains for stored visualization snapshots. Optional photorealistic preview generation is available only when explicitly configured with a server-side OpenAI key and feature flag.
- The public site exposes admin-only edit controls when an admin is signed in. Mapped text and link fields save in place without a page reload; structural changes remain available through the linked
/studioeditor. - Scientist Desk remains published without photos until the correct black phenolic resin top, birds-eye maple rails, and white maple legs media are verified.
- New piece records can be created without guessed photos. Media should be assigned only after review in the Woodshop dashboard.
- Payment capture, invoice delivery, shipping-label creation, outbound email, image cleanup, photorealistic preview generation, and AI media analysis require their documented runtime configuration before they work live.
- ChatGPT Plus is not an API backend and does not include OpenAI API usage. The classification workflow is local-first; OpenAI remains an explicitly enabled compatibility option.
site/: the Next.js applicationtools/media-ai-sidecar/: optional Python service for local image hashes, pixel embeddings, zero-shot labels, deterministic clusters, and Ollama/Gemini arbitration- The repo-local
pics/folder is legacy/ignored and should not be used as the source of truth. Production mounts/volume1/homes/Cooper/Photos/Dad_Woodworking_09262025directly to/app/pics, andMEDIA_ROOTdefaults to/app/picsrather than creating a local media folder. design/Beaman_Woodworks_V2_Google_Stitch_Beta/: Beaman Woodworks 2.0 prototypes audited for layout, theme, and dashboard directionITC_New_Rennie_Mackintosh_Complete_Family_Pack/: source font assets for the site typographydocker-compose.synology.yml: Synology runtime modelsynology-nas-deploy.md: deployment and NAS operations guideadmin.md: private Woodshop dashboard manualwoodsmith_DeepWiki_Merged_03222026.md: codebase architecture reference
- Install dependencies from the repo root with
npm install. - Copy
.env.exampleto.envand fill the values you intend to use locally. - Start the app with
npm run dev. - Open
http://127.0.0.1:3000.
Root scripts proxy into site/:
npm run devnpm run typechecknpm run lintnpm run testnpm run buildnpm run start
Use the root .env.example as the canonical reference.
Required for a secure deployment:
STUDIO_PASSWORDSESSION_SECRETSITE_URLNEXT_PUBLIC_SITE_URLDATA_ROOT(production:/app/site/data)
Local-first media AI configuration:
AI_PROVIDER,AI_ANALYSIS_PROVIDER,AI_EMBEDDING_PROVIDER,AI_FALLBACK_PROVIDERLOCAL_AI_SIDECAR_URL, optionalLOCAL_AI_SIDECAR_TOKEN, andLOCAL_EMBEDDING_MODELOLLAMA_BASE_URLandOLLAMA_VISION_MODELENABLE_AI_MEDIA_ANALYSIS,ENABLE_EMBEDDING_SEARCH, andENABLE_LOCAL_IMAGE_EMBEDDINGSMEDIA_AI_MAX_BATCH,MEDIA_AI_CONFIDENCE_HIGH,MEDIA_AI_CONFIDENCE_MIN, andMEDIA_AI_AMBIGUITY_DELTA- sidecar-only
MEDIA_AI_MEDIA_ROOT,MEDIA_AI_CACHE,MEDIA_AI_SIDECAR_TOKEN,MEDIA_AI_USE_OLLAMA,MEDIA_AI_CLUSTER_SIMILARITY, andMEDIA_AI_DUPLICATE_HASH_DISTANCE - optional
GEMINI_API_KEY,GEMINI_VISION_MODEL,GEMINI_EMBEDDING_MODEL, andENABLE_GEMINI_FALLBACK
The sidecar processes bounded resumable batches through the Studio trainer: Train selected, Improve page, and Continue library run scan/analyze/embed/cluster/rank steps in the correct order without requiring the woodshop user to manage those internals. Manual accepted assignments and rejected suggestions are persisted as training labels and influence later rankings; raw Scan/Analyze/Embed/Cluster actions remain available inside the Advanced section for diagnostics. The sidecar writes SHA-256/perceptual hashes, generated 768px review thumbnails, embeddings, analyses, and cluster state only to its configured cache directory outside the mounted photo tree.
Required for optional live services:
STRIPE_SECRET_KEYSTRIPE_PUBLISHABLE_KEYEASYPOST_API_KEYSMTP_HOSTSMTP_PORTSMTP_SECURESMTP_USERSMTP_PASSWORDSMTP_FROM_NAMESMTP_FROM_ADDRESSSHIP_FROM_NAMESHIP_FROM_STREET1SHIP_FROM_CITYSHIP_FROM_STATESHIP_FROM_ZIPSHIP_FROM_COUNTRYOPENAI_API_KEYOPENAI_IMAGE_MODELOPENAI_IMAGE_SIZEOPENAI_IMAGE_QUALITYOPENAI_EMBEDDING_MODELENABLE_PUBLIC_AI_RENDERINGENABLE_AI_BACKGROUND_CLEANUP
See tools/media-ai-sidecar/README.md for Windows/WSL and GPU-host setup. If no sidecar or cloud provider is configured, the complete manual media workflow remains available.
Public:
//portfolio/portfolio/[slug]/shop/shop/cart/process/process/[slug]/commissions/commissions/status/about/search
Legacy redirects:
/journal/journal/[slug]
Buyer account and request access:
/account/signup/account/login/account/forgot/account/reset/account/profile/account/projects/requests/[reference]
Private Woodshop:
/studio/login/studio
The supported deployment target is Synology NAS with Docker Compose and reverse proxy termination. The compose file mounts /volume1/homes/Cooper/Photos/Dad_Woodworking_09262025 directly to /app/pics:rw; do not remount or bind the repo-local pics/ folder under docker_ssd. MEDIA_ROOT must be an absolute container path.
After deploying a build from this branch, the startup migration updates legacy lowestprime@proton.me developer references in persisted settings and seeded profile data to cooperbeaman@proton.me.
Use these docs together:
synology-nas-deploy.mdadmin.mdwoodsmith_DeepWiki_Merged_03222026.md