app.zeens.portfolio

Configuration for a user's public Portfolio site (e.g. alice.zeens.app). One per user, keyed 'self'. A portfolio is a curated list of the user's COLLECTIONS, displayed beautifully: it holds the subdomain, a theme + layout/columns/gap applied to every collection, the ordered list of collection AT-URIs to show, and an optional home collection. Collections own their own title/subtitle/description/photos/slug, which the portfolio reuses; the site header comes from the user's profile. Stored on the user's own PDS so the site is portable and user-owned; PocketBase only mirrors {subdomain -> did} for host routing + uniqueness. Rendered publicly only when `enabled` is true.

Repository @zeens.app did:plc:pwpuqwge6g7xrjmfbw73uycw namespace authority
Details · record, key literal:self
Kindrecord
Record keyliteral:self
Authorityzeens.app
Indexed

Record

record · key literal:self

Properties

Optional About page (alice.zeens.app/about). Absent, or present with enabled=false, means the portfolio has no About page and no About entry in its rail.

Reference

Zeens marker so the firehose / lua filters can identify our records.

Light/dark appearance. 'auto' (default) follows the visitor's system preference; 'light'/'dark' force the theme's respective palette.

  • knownValues: auto | light | dark

Ordered list of the collections shown in the portfolio menu. Each entry references an app.zeens.collection record on the same repo. Array order is the menu order.

  • maxLength: 50
itemsref
Reference

columns

integer

Column count for grid/masonry layouts. Allowed 2-4. Default 3.

  • minimum: 2
  • maximum: 4

createdAt

requiredstring · datetime

enabled

requiredboolean

Whether the public site is live. When false, the subdomain 404s even if reserved.

gap

integer

Gap in pixels between photos. Allowed 0, 4, 8, 16, 24, 32. Default 8.

  • minimum: 0
  • maximum: 32

hero

ref

The home page's hero — the owner's own photos across the top. ABSENT DOES NOT MEAN NO HERO: the render path falls back to the owner's 6 most-liked photos as a square grid, so a portfolio has a hero without its owner picking one. Present means they chose the photos themselves.

Reference

home

ref

Optional plain-text heading + paragraph shown ABOVE the home page's existing content (the collection card grid, or homeCollection's photos when one is set). Absent means the home page renders exactly as it did before this field existed, so no portfolio changes without its owner acting.

Reference

homeCollection

string · at-uri

DEPRECATED. AT-URI of a collection rendered inline as the portfolio's home page. Superseded by the portfolio's own home page (see `home`): the editor no longer offers this, and new records should not set it. Still honoured on read so existing sites don't change appearance, and the editor lets an owner who has it set turn it off.

layout

string

Photo layout applied to every collection shown in the portfolio. 'single' = one full-width column; 'grid' = uniform columns; 'masonry' = variable-height columns.

  • knownValues: single | grid | masonry

menu

ref

How the navigation menu renders. Absent means the default: the home page shows the owner's collections.

Reference

palette

string

Id of the chosen color palette (each has a light+dark variant, defined app-side, e.g. 'mono'). Independent of typography. Unknown/absent falls back to the default at render time. (Legacy records may carry a bundled 'theme' field instead; read paths migrate it.)

  • maxLength: 64

Which of the owner's profile social links the public site shows. ABSENT MEANS SHOW ALL — every portfolio created before this field keeps showing every link with no migration.

Reference

subdomain

string

The chosen subdomain slug (the 'alice' in alice.zeens.app). Lowercase DNS-safe label; uniqueness + reserved-word validation happen at write time and are mirrored into the PB portfolio_slugs table. Absent until the user picks one.

  • maxLength: 63

tagline

string

One-line tagline for the site. Mirrored onto site.standard.publication.description, since the portfolio IS the publication — this is the line other standard.site readers show under the name.

  • maxLength: 2000
  • maxGraphemes: 200

title

string

Custom site title shown in the portfolio rail (free text, e.g. 'Ro', 'Alice Photography'). Falls back to the user's profile display name when absent.

  • maxLength: 120

Id of the chosen typography pairing (font choice, defined app-side, e.g. 'space-grotesk'). Independent of palette. Unknown/absent falls back to the default at render time.

  • maxLength: 64

#aboutPage

object

The portfolio's About page. Plain text, like #homePage. The owner's portrait is NOT stored here: `useProfileAvatar` is a flag and the avatar is resolved from the profile at render time, so it tracks their Zeens avatar with no copy to go stale.

Properties

body

string

About text, rendered with preserved line breaks.

  • maxLength: 4000

enabled

requiredboolean

Whether the About page exists and appears in the rail.

heading

string

Page heading, also used as the rail's label for it. Defaults to 'About' when absent.

  • maxLength: 120

photos

array

Photos chosen from the owner's own posts, in display order. Rendered as a grid below the About text: one photo full width, two side by side, three or more in three columns (six fills a 3x2 grid). Only the first image of a multi-image post is shown.

  • maxLength: 6
itemsref
Reference

Show the owner's live profile avatar as the portrait. Opt-in: absent means false, so a portrait never appears on the public page unless the owner asked for it.

#aboutPhoto

object

A reference to one of the owner's own posts, used wherever a block stores picked photos — the About page, page heroes, and Featured Work. Named for its first use; kept under that name because renaming a def would orphan the records already pointing at it.

Properties

cid

requiredstring

CID of the referenced post at pick time.

uri

requiredstring · at-uri

AT-URI of an app.zeens.post / app.bsky.feed.post record on the owner's repo.

#collectionRef

object

A reference to one of the user's collections, in menu order.

Properties

collection

requiredstring · at-uri

AT-URI of an app.zeens.collection record on the owner's repo.

#featuredBlock

object

Featured work: photos picked directly rather than through a collection. The heading is the owner's own — 'Featured Work' is one gallery's word for it and 'Selected' or 'Latest' is another's.

Properties

photos

requiredarray

Photos chosen from the owner's own posts, in display order.

  • maxLength: 12
itemsref
Reference

title

string

Section heading. ABSENT MEANS 'Featured Work' — the default lives in the render path, so it is not frozen into every record.

  • maxLength: 60

#heroBlock

object

A page hero: the owner's photos across the top of a page. One def serves all three arrangements because they are the same data seen differently. A hero with no photos is dropped on write rather than stored empty — an absent hero falls back to the owner's most-liked photos, which is a better empty state than a blank band.

Properties

mode

requiredstring

'single' = one full-width photo; 'carousel' = a swipeable run of them; 'grid' = all of them as a grid. Unknown/absent reads as 'single'.

  • knownValues: single | carousel | grid

photos

requiredarray

Photos chosen from the owner's own posts, in display order. Only the first image of a multi-image post is used.

  • maxLength: 6
itemsref
Reference

#homePage

object

Plain-text intro shown at the top of the portfolio home page. Deliberately NOT rich text: it renders into a public page, so a markup format would need sanitising and carry XSS surface. Mirrors how collections store their description.

Properties

body

string

Home page paragraph, rendered with preserved line breaks.

  • maxLength: 2000

heading

string

Home page heading. When present it supplies the page's <h1>, and a home collection's own title renders as <h2> so the page keeps exactly one top-level heading.

  • maxLength: 120

#menuSettings

object

Navigation menu appearance. Its one property defaults to the behaviour that predates this def, so an absent `menu` never changes how a portfolio renders. Records written before the template took over navigation may still carry `icons` and `collections`; both axes were retired and readers ignore them.

Properties

#socialsVisibility

object

Controls which profile social links the public portfolio shows. Filtering is applied server-side AFTER the Bluesky link is synthesised from the owner's handle, so hiding Bluesky works even though it is not stored on the profile record.

Properties

mode

requiredstring

'all' (also the meaning of an absent socials field) shows every link; 'selected' shows only the platforms in `shown`; 'none' hides the block entirely, website included.

  • knownValues: all | selected | none

shown

array

Platform ids to show when mode is 'selected'. Ignored for other modes.

  • maxLength: 32
itemsstring
  • maxLength: 32

website

boolean

Whether the profile website link is shown. Absent means true.

Similar lexicons

semantic match

Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.

  • A user-curated collection (folder) of Zeens posts and articles. Visibility controls whether anyone other than the owner can see it via the AppView. The cover is the owner's chosen `coverPhoto` when set, otherwise the most recently added item, resolved at render time.

  • Configuration for a Mooring site. The record at rkey 'self' is the owner's default site; other rkeys are reserved for possible future multi-site support.

  • A block-based page layout. Renders the home of a mochott profile or of a minisite.

  • A zeen: a sequence of 1:1.414 pages (ISO A-series proportion) mixing photographs and writing, published as a readable object. Pages may draw photos from a collection, from individual posts, or from the author's own uploads — a zeen is a standalone document, not a view of a collection. The AUTHORED PAGES are the artifact: layout is recomputed from them at read time, so a layout improvement reaches every existing zeen. Replaces an earlier record of this NSID that described a print-ready PDF; that