Twisted Wood Guitars — rebuild notes
Public preview: https://twistedwoodguitars.swiftstudios.ca
Source shop: https://twistedwoodguitars.com
Pulled from the public WooCommerce store API on 2026-10-09. Prices are USD, as the current shop lists them.
What this tree is
This is the catalog, not a finished store. SQLite is the product database. Images sit beside it under predictable paths so a later pass can rebuild pages without scraping the old site again.
- `data/catalog.sqlite` — products, categories, images, variations
- `data/raw/products.json` — the store API response
- `data/raw/categories.json` — the category tree
- `public/` — the first site, generated from the database
- `public/assets/products/<slug>/` — that product's photos, in shop order
- `public/assets/brand/logo-white.png` — the white wordmark used on the dark header
The Unix user is `twistedwoodguitars` because `twistedwoodguitars.swiftstudios.ca` is 35 characters and a Unix name cannot be longer than 32. The public name is still the long hostname.
Design
The current shop is an XStore / WooCommerce theme. Keep that character. Do not turn it into a generic white catalog.
- Header and footer are near-black (`#111111`). The logo is a white wordmark, so it belongs on that dark bar.
- Body type is Lato. The display face is Abril Fatface, used for the big line, not for prices.
- The green is the action color. The live theme uses `#127926` and a brighter `#47C285`. Use the deeper green for buttons and the brighter one only for small highlights.
- Pages are light below the header: white ground, black text, product photos large and uncropped.
- Voice is a Canadian instrument shop, not a discount gadget store. Canada's ukulele specialists, made-in-Canada pro instruments, artists, and dealers. Write short and specific. Do not invent woods, prices, or stock.
- A product page leads with the photo, the name, the from-price, then the real options (size, pickup, and so on) with each option's own price. Descriptions stay in the product's own words.
Commerce
Checkout is not built. The next pass should cart against this SQLite file: one row in `variations` is what a customer buys, and a simple product with no variations sells as the `products` row. Currency stays USD until someone decides otherwise. Many instruments are marked out of stock; show that instead of hiding them.
Tables
`categories` (id, parent_id, name, slug, product_count)
`products` (id, slug, name, product_type, sku, prices in cents, stock, description_text, description_html)
`product_categories` (product_id, category_id)
`images` (product_id, position, source_url, local_path, alt)
`variations` (id, product_id, sku, prices in cents, stock, attributes_json)