CLIENT WORKSHIPPED

Yacht Assets Reviewer

One shared review app for 115 yacht interior assets: swipe, agree live, export the picks in one click. Built in a day.

AT A GLANCE

AT A GLANCEYACHT-ASSETS-REVIEWER
STATUS
SHIPPED
TIMELINE
2025-12 — 2025-12 · 1 DAYS
LANGUAGES
Python / JavaScript / HTML / CSS
CATEGORY
CLIENT WORK
0

ASSETS REVIEWED

OUTCOME

All 115 assets land in one shared, image-led review pass, and approved picks export as a numbered ZIP the 3D designer can use with zero reassembly.

Yacht Assets Reviewer cover

METRICS

0

M.01ASSETS REVIEWED

Premium assets reviewed and exported across 10 interior design categories

0

M.02PRODUCT URLS SCRAPED

Supplier product URLs collected by the scraper (91 from one supplier, 24 from the other)

0

M.03REVIEW CATEGORIES

Asset categories: tableware, seating, tables, storage, decor, plants, lighting, audio, textiles, accessories

0

M.04PYTHON SOURCE LINES

Python powering the scraper, uploader, and Flask backend

THE CASE, CHAPTER BY CHAPTER

CH.01

The problem

A team had to agree on 115 premium furnishing assets from two suppliers — over a spreadsheet of links with no images and no shared state.

Reviewers worked from URLs alone, pasted screenshots into chat, and reconciled decisions by email. Approvals collided, picks went missing, and the 3D designer reassembled the final set by hand.

CH.02

What I built

A web app where the whole team swipes through product images, approves or rejects each one, and sees everyone's decisions in real time.

No accounts, no installs, any browser. A separate scraper collected all 115 product images from both supplier sites first, so the review tool had a self-contained data layer with nothing to log into.

CH.03

How it works

Shared state lives in one Dropbox JSON file — every decision is instantly visible to everyone, with no database to run.

A Flask backend serves the catalog and generates image links on demand to avoid 115 calls at once on load. Reviewers use keyboard shortcuts or buttons; a live sidebar tracks progress and filters by category or status.

CH.04

The handoff

One click exports approved assets as a numbered ZIP plus a links manifest — ready for the designer with no manual cleanup.

Images are renamed with numeric prefixes so anyone can say "use item #7." A CSV export covers the full catalog for direct Notion import.

CH.05

Results

Built, documented, and deployed to cloud hosting in a single day — replacing hours of spreadsheet and screenshot back-and-forth.

The scraper automated all image prep, the app turned 115 assets across 10 categories into one image-led review pass, and the export hands off a clean selection with no manual cleanup. Deployed on Render.com in about 30 minutes with token-based Dropbox sign-in — no passwords stored.

THE BUILD, WEEK BY WEEK

6 COMMITS

6 COMMITS — IN 1 DAYS — AVG 6/DAY

Docs
57.6% 2.4K
Python
22.1% 922
HTML
19.8% 825
Config
0.4% 18

FEATURES

Card-swipe review interfaceReviewers approve, decline, top-rate, back, or skip each asset by keyboard or button, with live progress stats and category filters.
Shared Dropbox stateThe catalog JSON lives in a Dropbox App Folder, so every reviewer's decision persists instantly and shows up in all other sessions.
Image scraper pipelineA scraper pulls product images from two supplier sites, sorts them by category, and uploads the full dataset to Dropbox before review begins.
ZIP exportOne click builds an in-memory ZIP of approved images, renamed with numeric prefixes and bundled with a category-grouped links manifest.
CSV / Notion exportThe full catalog exports as a CSV with order, category, source, URL, status, and rating columns, ready to import straight into Notion.

ARCHITECTURE

scrape_yacht_assets.pyScrapes 115 product URLs from two suppliers, downloads images into category subfolders, and produces the initial JSON catalog
upload_to_dropbox.pyUploads the local catalog JSON and image folders to the Dropbox App Folder that the web app reads from
app.pyFlask backend: serves the SPA, exposes REST endpoints for catalog read/write, per-image link generation, ZIP export, CSV export, and stats
templates/asset_reviewer.htmlSingle-page frontend: card review UI, sidebar filters, stats panel, keyboard shortcut handler

STACK

LANGPythonJavaScriptHTMLCSS
FXFlaskgunicorn
INFRARender.comDropbox API (OAuth2)

SKILLS DEMONSTRATED

Same-day delivery of a working tool · Multi-user review apps without a database · Web scraping across different site structures · Flask REST API design · Dropbox OAuth2 integration · Cloud deployment (Render.com) · Clean export and handoff pipelines · Replacing manual workflows with automation

THE CODE, MAPPED

55 NODES · 62 EDGES · 14 COMMUNITIES — EXTRACTED FROM THE CODEBASE BY TREE-SITTER

GRAPH