This repository publishes public profile assets, favicons, and PWA manifests for use in personal websites, resumes, and other platforms.
Public builds are served at assets.patricioperpetua.com.
Use these defaults when you do not need a specific variant:
4096.png with yarn build and
no static size cap).All icons, profile pictures, and export variants in this repository come from the main design source created in Figma. If you ever need to review the original compositions, tweak a background, adjust borders, or export new sizes, you can open the full editable file here:
👉 Figma – Patricio Perpetua Assets
This file includes the master frames for square and circle shapes, light and dark theme variants, and all background/border combinations used across this asset library.
This README is used to generate the public asset index page. Contributor-only workflow details live in Profile Asset Workflow.
Build output now uses two profiles so CI artifacts stay under upload limits.
CI=true): static profile PNGs are capped at <= 512px.1024 and 4096, depending on preset).PROFILE_STATIC_MAX_SIZE=<number>.Examples:
# CI-friendly static outputs (320/512 only)
CI=true yarn build
# Explicit static cap for any environment
PROFILE_STATIC_MAX_SIZE=512 yarn build
# Full local static outputs from configured size groups
yarn build
When the static cap is active, stale PNG sizes in dist/profile/static are
pruned automatically so old 1024/4096 files do not remain in artifacts.
Here's a quick preview of the main icon variants available:
| Variant | Preview |
|---|---|
| bg-none (transparent) | |
| bg-yellow | |
| bg-mustard | |
| bg-white | |
| bg-none / bd-black | |
| bg-none / bd-white | |
| bd-black | |
| bd-white |
| Variant | Preview |
|---|---|
| bg-none (transparent) | |
| bg-yellow | |
| bg-mustard | |
| bg-none / bd-black | |
| bg-none / bd-white | |
| bd-black | |
| bd-white |
| Variant | Preview |
|---|---|
| dark / default | ![]() |
| dark / square | ![]() |
| light / default | ![]() |
| light / square | ![]() |
favicons/circle/bg-none/site.webmanifest: Transparent circle icons.favicons/circle/bg-mustard/site.webmanifest: Circled icons with a mustard background.favicons/circle/bg-yellow/site.webmanifest: Circled icons with a yellow background.favicons/circle/bg-none/bd-white/site.webmanifest: Transparent circle icons with a white border.favicons/circle/bg-none/bd-black/site.webmanifest: Transparent circle icons with a black border.<link rel="manifest" href="./favicons/circle/bg-yellow/site.webmanifest" />
<link rel="apple-touch-icon" href="./favicons/circle/bg-yellow/apple-touch-icon.png" />
<link
rel="icon"
type="image/png"
sizes="32x32"
href="./favicons/circle/bg-yellow/favicon-32x32.png"
/>
<link
rel="icon"
type="image/png"
sizes="16x16"
href="./favicons/circle/bg-yellow/favicon-16x16.png"
/>
<link rel="shortcut icon" href="./favicons/circle/bg-yellow/favicon.png" />
<link rel="manifest" href="./favicons/circle/bg-mustard/site.webmanifest" />
<link rel="apple-touch-icon" href="./favicons/circle/bg-mustard/apple-touch-icon.png" />
<link
rel="icon"
type="image/png"
sizes="32x32"
href="./favicons/circle/bg-mustard/favicon-32x32.png"
/>
<link
rel="icon"
type="image/png"
sizes="16x16"
href="./favicons/circle/bg-mustard/favicon-16x16.png"
/>
<link rel="shortcut icon" href="./favicons/circle/bg-mustard/favicon.png" />
<link rel="manifest" href="./favicons/circle/bg-yellow/site.webmanifest" />
<link rel="apple-touch-icon" href="./favicons/circle/bg-yellow/apple-touch-icon.png" />
<link
rel="icon"
type="image/png"
sizes="32x32"
href="./favicons/circle/bg-yellow/favicon-32x32.png"
/>
<link
rel="icon"
type="image/png"
sizes="16x16"
href="./favicons/circle/bg-yellow/favicon-16x16.png"
/>
<link rel="shortcut icon" href="./favicons/circle/bg-yellow/favicon.png" />
You can load the correct manifest dynamically depending on user preference:
<script>
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
const link = document.createElement('link');
link.rel = 'manifest';
link.href = prefersDark
? './favicons/circle/bg-yellow/site.webmanifest'
: './favicons/circle/bg-mustard/site.webmanifest';
document.head.appendChild(link);
</script>
The published site serves the dist/ directory at the site root, so public
URLs omit a /dist prefix (for example /favicons/...).
dist/ (generated + copied by yarn build)
dist/
├── index.html
├── favicons/
│ ├── circle/
│ │ ├── bd-black/
│ │ ├── bd-white/
│ │ ├── bg-mustard/
│ │ │ └── bd-white/
│ │ ├── bg-none/
│ │ │ ├── bd-black/
│ │ │ └── bd-white/
│ │ ├── bg-white/
│ │ ├── bg-yellow/
│ │ │ └── bd-black/
│ └── square/
│ ├── bd-black/
│ ├── bd-white/
│ ├── bg-mustard/
│ │ └── bd-white/
│ ├── bg-none/
│ │ ├── bd-black/
│ │ └── bd-white/
│ ├── bg-yellow/
│ │ └── bd-black/
├── profile/
│ ├── static/
│ │ ├── neutral/
│ │ │ ├── circle/.../320.png
│ │ │ ├── circle/.../512.png
│ │ │ ├── square/.../320.png
│ │ │ └── square/.../512.png
│ │ └── <expression>/
│ │ └── {circle|square}/.../{320|512}.png
│ └── animated/
│ └── animation-all/
└── og-image/
├── dark/
└── light/
Open Graph JPEGs are maintained under src/og-image/ (dark/, light/) and
copied into dist/ during the build. README links use ./og-image/...
because the live site serves the dist/ tree at the site root (same public paths).
Notes:
profile/static is capped to 320 and 512 by default.1024 and 4096) can
be generated when enabled by preset size groups.PROFILE_STATIC_MAX_SIZE, generated static sizes and README links should
be interpreted relative to the selected cap.192x192 and 512x512 sizes.application/manifest+json© 2026 Pato Perpetua. All rights reserved.