# Express SPA — project and identity

Page: https://hexly.ai/projects/express-spa

Integrate Express SPA using the Hexly single-project identity API.

GET https://hexly.ai/api/projects/nocoo/express-spa
No authentication. Public CORS. Request exactly one GitHub owner/repository pair; include the owner in the path and preserve repository dots and hyphens. Owner and repository names are case-insensitive. Current projects belong to nocoo; never assume that owner for future integrations. No list, batch, search or query parameters. Do not fetch the full catalogue.

Example:
const response = await fetch("https://hexly.ai/api/projects/nocoo/express-spa");
if (!response.ok) throw new Error(`Hexly API HTTP ${response.status}`);
const project = await response.json();
const title = project.title;
const description = project.description.en;
const github = project.github;
const icon = project.icons.small;

Expect a single JSON object: schemaVersion (1), id (Hexly slug), owner (GitHub user or organization), repo (GitHub repository name), title, description {en, zh}, emoji, category, archived, github, website (string or null), url (Hexly detail page), icons {small, large}, logos[], and brand {manifest, iconManifest, source, originalSha256}. Use owner/repo together as the integration key. Small/large icons are 64/512px. Each logo has id, url, width, height, format, background, role, usage and theme. URLs are absolute HTTPS CDN URLs; use the returned URLs unchanged and preserve aspect ratio with object-fit: contain. Use textContent or framework text bindings for text, not innerHTML.

Logo selection:
- Prefer icons.small for a 24–32px header/sidebar and icons.large for a larger project card. Active Hexly entries use the approved textured presentation: original family foreground colors and composition over a pale texture, with continuous corners already rendered. Do not add a CSS mask, tile or shadow. The manifest is brand.iconManifest when available; it records native dimensions, resampling and original source hashes.
- When an original transparent mark is explicitly required, select role="project-identity", background="transparent", usage="navigation". Prefer a PNG matching the required resolution (16/32px favicon; roughly 2x CSS size for high-DPI UI). Do not add a background tile, mask, shadow, crop or recolor the mark.
- Opaque presentation variants are intended for README artwork and platform icon masters. The ios-app-icon variant is an opaque 1024px square; iOS applies its own mask. Use usage="apple-touch-icon" for touch bookmarks. Rounded presentation variants have transparent corners with an opaque textured interior; they are not transparent foreground marks.
- role="hexly-campaign" is separately labelled artwork for Hexly-related presentation. It does not authorize replacing the product's own Logo, favicon, colors or UI. Check brand.manifest and its license/provenance before adopting campaign materials.
- background="original" preserves the source background; transparency is not guaranteed. Some projects only have original/emoji assets. Missing variants are unavailable: do not fabricate URLs or claim transparency. Use icons.small/large as supplied when no suitable transparent identity exists.
- Keep original geometry, colors, bytes, licenses and provenance. brand.originalSha256 verifies the original logo only, not its derivatives. Do not regenerate or upload new logos for this integration.

Cache successful metadata for at most one hour. Edge responses also cache for one hour; previously cached metadata may remain visible for up to one hour after deployment. Do not cache failures as project data. A 404 means unknown repository; 400 means invalid request; 405 means unsupported method; 503 means temporarily unavailable. Handle network failures, nullable website and archived projects explicitly. An entry is not proof of service health. No polling or credentials are needed.

Verify the integrated title, en description, GitHub destination, logo aspect ratio, light/dark contrast, mobile layout and failure state. Fetch current metadata rather than copying the preview as permanent configuration.


An early exploration of single-page applications built on Express.js.

Project ID: express-spa. Catalogue state: archived. This is not a product release or health assertion.

Repository: https://github.com/nocoo/express-spa
Website: not listed

Original project identity: https://h.no.mt/projects/express-spa/identity/v1.0.0/express-spa-7c0923ee71d9.png
Original SHA-256: 7c0923ee71d9cad5f78561072378c0a2e121a23db05528fbd62cc93b23fe2f26
Source: https://github.com/nocoo/nocoo/blob/9a7ad63e1e96428f9dcd12214bcdbd470b3b51c6/README.md

Reuse the approved downloadable files. Preserve the original Logo geometry, proportions, colors and bytes. Hexly campaign styling belongs to this archive and Hexly promotional material; the product's own palette and UI remain independent.

Archived project: basic support only. Preserve existing pages, links, downloads, licenses and provenance, including already completed artwork. Exclude this project from bulk redesign, new brand/media generation and gap-filling unless the owner explicitly requests it by name.

## Sources

- [Single-project identity API](https://hexly.ai/api/projects/nocoo/express-spa)
- [Project catalogue JSON](https://hexly.ai/data/projects.json)
- [Agent index](https://hexly.ai/llms.txt)
- [Published site version and revision](https://hexly.ai/api/live)
