Webdesign

tmpo.pt

t.mpo
2026 t.mpo studio website
a lista - books i →

The Project

A portfolio and store for a creative practice working across illustration, design and architecture. Built from scratch with no framework, no CMS, no dependencies.

Stack

Cloudflare Pages

HTML / CSS / Vanilla JS

Shopify + Printful (store)

Live

tmpo.pt

store.tmpo.pt

2026

tmpo.pt

A complete digital platform for a creative practice that spans illustration, graphic design, and set design for television. The site needed to work as a portfolio, a storefront, and a credibility surface for broadcast credits, all without feeling like three different products stitched together.

The previous site ran on Adobe Portfolio: a grid of images linking to bigger images. No data layer, no commercial integration, no editorial voice. The brief was to replace it with something that could grow with the practice.

The new platform had to support four core functions. First, a portfolio that organizes 81 illustrations into 19 named series with editorial depth: statements, palettes, technique metadata, and cross-linking between sister collections. Second, a design catalog for television props, displaying 400+ designed objects across 7 TV shows with per-prop photography, production credits, and network logos. Third, a commercial layer that connects every illustration to its matching product on Shopify, turning the portfolio into a seamless storefront serving 35+ countries. Fourth, a credibility surface for broadcast work, treating TV and streaming placements as a first-class feature rather than a buried footnote.

Beyond those functions, the site had to be fast, maintainable without a CMS, and built on a design system strict enough to hold across portfolio, store, and editorial contexts without visual drift.

Before: Adobe Portfolio
After: tmpo.pt
132 auto-generated project pages
19 illustration series + 7 TV show pages
43 props collections across 4 networks
Shopify store across 35+ regions
Full SEO + sitemap + redirects
Design system: 1 typeface, 5 surfaces

The artwork comes first. Everything else steps back.

Every design decision serves one goal: let the illustration speak, then get out of the way. The visual system uses a single typeface, five neutral surfaces, and zero decoration. No rounded corners, no gradients, no shadows, no accent colors.

Hierarchy is built from typographic weight, size, and whitespace alone. The interface stays monochrome so the artwork provides all the color. When an illustration fills the screen, nothing competes with it.

This constraint-driven approach holds across seven distinct page types, each with different content needs but the same visual DNA. Homepage, portfolio landing, project page, series editorial, props catalog, show landing, and archive grid all feel like one site without feeling templated.

The system is strict enough that new pages can be generated automatically and still look designed. Every surface, every margin, every type choice is an intentional decision, not a default.

Design Constraints
0 border-radius — sharp rectangles only
1 typeface — Inter across 5 weights
5 neutral surfaces — no accent colors
0 decorative elements — no shadows, no gradients
7 Surface Types
Homepagehero, featured grid, store strip
Portfolio landingstatement, series band, paginated archive
Project pagegallery, palette, technique, series strip
Series editorialstatement, member grid, sister links
Props catalogprop groups, production badge, credits band
Show landingproduction meta, collection grid, categories
Store integrationShopify storefront, wear-this-artwork CTAs
Aa Bb Cc
Inter
One typeface carries everything: display titles, navigation, body copy, metadata, and labels.
Aa Light 300
Aa Regular 400
Aa Medium 500
Aa Bold 700
Aa Black 900
tmpo.pt Display · Black 900 · -0.03em tracking
Section heading Heading · Black 900 · -0.02em tracking
Subtitle and descriptions Subtitle · Regular 400 · 60% ink
Body copy across all pages Body · Regular 400 · 75% ink
SECTION LABEL Label · Bold 700 · 0.28em tracking
Ink #0E0D0B
Paper #F9F9F9
Stone #F3F3F0
Cream #EDDFBE
Warm grey #C8B391
GRID
Selected works: 3 columns. Archive: 4 columns. Series strip: 3 tiles. Props catalog: 1/2/3 columns by image count.
RESPONSIVE
Mobile: 2 columns everywhere. Fluid spacing via clamp(). No fixed breakpoints in the grid, only min-width thresholds.
01
No border-radius anywhere. Every surface is a sharp rectangle.
02
No decoration. Hierarchy comes from weight, size, and spacing alone.
03
One typeface. Inter carries display, body, metadata, and navigation.
04
Generous whitespace. Sections breathe; density lives inside, not between.
05
Monochrome interface. The artwork brings the color; the UI stays neutral.
06
Fluid sizing. clamp() scales type and spacing continuously across viewports.
tmpo.pt/pages/projects/pessoa

One file runs the entire site.

Every project, every series, every show, every tag lives in a single data.js file. Three Node.js generators read it at build time and produce 132 static project pages, 20 series pages, and 8 show pages, all with full SEO metadata and cross-linking.

No CMS, no database, no framework. The data file is the CMS. Edit a description, run the generators, push to Cloudflare. The site rebuilds in seconds.

The file holds three data structures. PORTFOLIO contains 132 entries across illustration and design, each with structured fields for series membership, palettes, technique metadata, and editorial statements. SERIES_META maps 19 illustration series with editorial voice, sister-set pairings, and taxonomy. SHOWS_META maps 7 TV shows with production companies, broadcast networks, and external links.

The dispatch logic routes each project to the right generator: illustration series pages get palette documentation and image statements. Props pages get per-prop catalogs with front/detail/context photography. Design case studies get editorial layouts. The schema grew from 5 fields to 20+ but the workflow never changed: edit one file, run one command.

Data Layer
1 file — data.js is the entire CMS
20+ structured fields per project entry
3 data structures — PORTFOLIO + SERIES_META + SHOWS_META
Auto-resolved cross-references and SEO metadata
data.js
// illustration entry
{
  id:     'la-vie-03',
  series: 'la vie',
  store:  true,
  palette: ['#0E0D0B 38%', ...]
}
// props entry
{
  id:        'alista-drinks-1',
  show:      'alista',
  propsPage: true,
  category:  'Packaging / Bottles'
}
tmpo.pt/pages/series/archidrawings

19 series. 81 illustrations. All connected.

Each illustration belongs to a named series. Series have landing pages with editorial statements, technique metadata, and palette documentation. Sister sets are visually linked: jump and kick, birds and fishes, naked and portrait.

Series titles are italic and clickable everywhere they appear on the site: in the project hero, in the meta strip, in the "more from this series" band. Every mention leads to the series landing page. Nothing dead-ends.

Each series page carries its own editorial voice: a three-paragraph image statement, technique breakdown, format specifications, and a five-color palette with percentage distributions extracted from the source artwork. The series strip at the bottom of every project page shows three sibling works from the same collection.

Sister sets create visual conversations across the body of work. Jump pairs with kick. Birds pairs with fishes. Naked pairs with portrait. These pairings surface in the series footer as navigational links between related collections.

The series index at /pages/series/ lists all 19 collections in a single grid. Each series page is generated from SERIES_META in data.js, where editorial statements, sister-set pairings, and taxonomy are maintained alongside the portfolio entries themselves.

Sister Sets
jump ↔ kick — movement and force
birds ↔ fishes — creatures in motion
naked ↔ portrait — the figure, revealed and observed
Per-Series Data
Three-paragraph image statement
Five-color palette with percentage distributions
Technique metadata + format specifications
Sister-set pairings + navigational links
19 Named Series
50/25 · poets · archidrawing · la vie · ballet on bed
birds · fishes · jump · kick · naked · portrait
girl bench · girls on geometry · estrada fora · japan
flowers and lines · girl bed · collage · standalone
tmpo.pt

The portfolio is the storefront.

Every illustration with a matching product on store.tmpo.pt gets a "wear this artwork" band at the bottom of its project page, linking directly to the Shopify product. The illustration landing page has a dedicated store strip. The main navigation links to the store. The entire site is a sales funnel that never feels like one.

Three Shopify markets serve distinct regions. Portugal with EUR pricing. The USA with dollar pricing and US sales tax. International covering 26 EU countries plus the UK, Canada, Mexico, Switzerland, Norway, Iceland, Australia, New Zealand, and Japan.

Printful handles print-on-demand fulfillment from local facilities in each region. No inventory, no warehousing. A customer in Tokyo and a customer in Lisbon both get fast shipping because Printful prints locally.

Google Merchant Center feeds product data from Shopify across all active markets, making the store discoverable through Google Shopping in every supported region.

3 Shopify Markets
Portugal — EUR — local shipping at €4.99
USA — USD — US sales tax + local Printful fulfillment
International — EUR — 26 EU countries + 9 global regions
Purchase Funnel
01
Browse
Illustration grid, series pages, featured works
02
View
Full project page with images, palette, technique
03
Discover
"Wear this artwork" band links to Shopify product
04
Buy
store.tmpo.pt checkout, 3 markets, Printful fulfillment
tmpo.pt

400+ props designed for 7 television productions.

Bottle labels, book covers, magazine covers, vinyl records, posters, packaging, and digital screens, all designed as fictional props for Portuguese television. Each object had to look real enough to hold up on camera and carry its own visual identity within the show's world.

The site organizes this work into 43 collections across 7 shows. Each collection gets its own catalog page with per-prop photography grouped by object: front view, detail, and context. The generator reads image filenames at build time, detects view labels, and groups them automatically. A prop with three images gets a three-column layout. Two images get 50/50. One gets full width.

Each show gets a dedicated landing page with production credits, network logos, and external links to the broadcaster. The show pages mirror the series architecture: a hero, metadata section, collection grid, and category tags. The shows index at /pages/shows/ lists all 7 productions.

The editorial rule is strict: always "aired on," never "commissioned by." The language treats the props as creative work made for the production, and the network as the broadcaster, not the client.

7 Productions
Aired on SIC, RTP, TVI, Prime Video
Collections
43
Props designed
400+
Categories
Books, bottles, posters, vinyl, packaging, digital
Page types
Props catalog + show landing + index
Editorial Rules
Always "aired on" — never "commissioned by"
Props are creative work, networks are broadcasters
Production credits on every catalog + show page
External links to broadcaster when available
tmpo.pt/pages/projects/girl-bench-back

Built to be found.

Every page carries structured metadata: Open Graph tags, Twitter cards, canonical URLs, and a dynamically generated sitemap covering all 132 project URLs plus series and show pages. When someone shares a project on social media, the preview card shows the right image, title, and description.

Old Adobe Portfolio slugs redirect cleanly via Cloudflare rules. No broken links, no lost search equity from the previous site. Google Merchant Center feeds product data from Shopify across 27 active regions. GA4 runs on both tmpo.pt and store.tmpo.pt.

Cloudflare provides the CDN, security headers, and Access controls for the admin dashboard. Google Business Profile is verified as a service-area business. The infrastructure is invisible but load-bearing.

Open Graph + Twitter cards on every page
Dynamic sitemap.xml (132 project URLs)
Canonical URLs + meta descriptions
Cloudflare redirects from old Adobe Portfolio slugs
GA4 on tmpo.pt + store.tmpo.pt
Google Merchant Center (27 active regions)
Google Business Profile (service-area, verified)
Authenticated transactional email
Cloudflare CDN + security headers
Cloudflare Access (admin dashboard)
HTML5
Semantic markup for all 160+ pages
CSS3
Single stylesheet, no preprocessor, clamp()-based fluid design
Vanilla JS
No framework. ES6 modules for nav, lightbox, pagination, data binding
Cloudflare Pages
Git-deploy hosting with global CDN, no build step
Cloudflare Access
Zero-trust authentication protecting the admin dashboard via email OTP
Shopify
Store platform at store.tmpo.pt with 3 markets (PT, USA, International)
Printful
Print-on-demand fulfillment across 35+ shipping regions
Node.js
Three static page generators. Reads data.js, outputs 160+ HTML files at build time
Google Merchant Center
Product feed across 27 active shopping regions. Powers Google Shopping discoverability
a lista - books i →