Schema reference
This page documents every field of the takuhon.json schema: each section, its
type, whether it is required, its constraints, and what it is for. For a gentler
introduction to the document as a whole, see
The takuhon.json file.
The tables below are generated from the canonical schema (version 1.4.0). Field descriptions are reproduced verbatim from the schema, which is maintained in English as the canonical contract.
Top-level document
Section titled “Top-level document”| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
schemaVersion | string | Yes | pattern ^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.-]+)?$ | Semantic version of the takuhon schema this document conforms to. |
profile | Profile | Yes | — | — |
links | array of Link | No | ≤ 100 items | — |
careers | array of Career | No | ≤ 50 items | — |
projects | array of Project | No | ≤ 100 items | — |
skills | array of Skill | No | ≤ 200 items | — |
certifications | array of Certification | No | ≤ 50 items | — |
memberships | array of Membership | No | ≤ 50 items | — |
volunteering | array of Volunteering | No | ≤ 50 items | — |
honors | array of Honor | No | ≤ 50 items | — |
education | array of Education | No | ≤ 30 items | — |
publications | array of Publication | No | ≤ 100 items | — |
languages | array of Language | No | ≤ 30 items | — |
courses | array of Course | No | ≤ 100 items | — |
patents | array of Patent | No | ≤ 50 items | — |
testScores | array of TestScore | No | ≤ 30 items | — |
recommendations | array of Recommendation | No | ≤ 50 items | — |
highlights | array of Highlight | No | ≤ 50 items | — |
contact | Contact | Yes | — | — |
settings | Settings | Yes | — | — |
meta | Meta | Yes | — | — |
No additional properties beyond those listed.
Definitions
Section titled “Definitions”LocaleTag
Section titled “LocaleTag”BCP-47 language tag (e.g., ‘en’, ‘ja’, ‘zh-Hant’, ‘pt-BR’).
- Type:
string - Constraints: pattern
^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8})*$; 2–35 chars
Iso3166Alpha2
Section titled “Iso3166Alpha2”ISO 3166-1 alpha-2 country code (uppercase, two letters).
- Type:
string - Constraints: pattern
^[A-Z]{2}$
YearMonth
Section titled “YearMonth”Year-month in ‘YYYY-MM’ format (Gregorian calendar).
- Type:
string - Constraints: pattern
^[0-9]{4}-(0[1-9]|1[0-2])$
IsoDateTime
Section titled “IsoDateTime”ISO 8601 date-time (e.g., 2026-05-11T12:34:56Z).
- Type:
string - Constraints: format
date-time
- Type:
string - Constraints: format
uri; ≤ 2048 chars
- Type:
string - Constraints: format
email; ≤ 254 chars
URL-safe identifier (lowercase alphanumerics and hyphens, must start with alphanumeric).
- Type:
string - Constraints: pattern
^[a-z0-9][a-z0-9-]*$; 1–64 chars
Visibility
Section titled “Visibility”Per-item public visibility (added in 0.7.0). ‘private’ removes the item from every public surface via applyPublicPrivacyFilter; an absent value or ‘public’ keeps the item public.
- Type:
string - Constraints: one of:
public,private
LocalizedTitle
Section titled “LocalizedTitle”Map of BCP-47 locale tag to short title-like string (max 200 chars per value). Each value must contain at least one non-whitespace character.
- Type: object (map)
- Keys: pattern
^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8})*$ - Values:
string(pattern\S; 1–200 chars) - Constraints: at least 1 entry
LocalizedBody
Section titled “LocalizedBody”Map of BCP-47 locale tag to body-length string (max 5000 chars per value). Each value must contain at least one non-whitespace character.
- Type: object (map)
- Keys: pattern
^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8})*$ - Values:
string(pattern\S; 1–5000 chars) - Constraints: at least 1 entry
LinkType
Section titled “LinkType”Identifies the kind of link. ‘custom’ requires iconUrl.
- Type:
string - Constraints: one of:
website,blog,github,gitlab,linkedin,x,mastodon,bluesky,instagram,youtube,threads,facebook,email,rss,custom
Profile
Section titled “Profile”| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
displayName | LocalizedTitle | Yes | — | — |
tagline | LocalizedTitle | No | — | — |
bio | LocalizedBody | No | — | — |
avatar | Avatar | No | — | — |
location | Address | No | — | — |
No additional properties beyond those listed.
Avatar
Section titled “Avatar”| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
url | string | Yes | format uri-reference; ≤ 2048 chars | URL or path to the avatar image. |
alt | LocalizedTitle | No | — | — |
No additional properties beyond those listed.
Address
Section titled “Address”| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
country | Iso3166Alpha2 | No | — | — |
region | string | No | ≤ 100 chars | — |
locality | LocalizedTitle | No | — | — |
display | LocalizedTitle | No | — | — |
No additional properties beyond those listed.
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
id | Slug | Yes | — | — |
visibility | Visibility | No | — | — |
type | LinkType | Yes | — | — |
label | LocalizedTitle | No | — | — |
url | Url | Yes | — | — |
featured | boolean | No | — | — |
order | integer | No | ≥ 0 | — |
iconUrl | Url | No | — | — |
If type is custom, then iconUrl must be set.
No additional properties beyond those listed.
Career
Section titled “Career”| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
id | Slug | Yes | — | — |
visibility | Visibility | No | — | — |
organization | LocalizedTitle | Yes | — | — |
role | LocalizedTitle | Yes | — | — |
description | LocalizedBody | No | — | — |
startDate | YearMonth | Yes | — | — |
endDate | YearMonth or null | No | — | — |
isCurrent | boolean | No | — | — |
url | Url | No | — | — |
location | Address | No | — | — |
order | integer | No | ≥ 0 | — |
No additional properties beyond those listed.
Project
Section titled “Project”| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
id | Slug | Yes | — | — |
visibility | Visibility | No | — | — |
title | LocalizedTitle | Yes | — | — |
role | LocalizedTitle | No | — | The owner’s role/relationship on this project (added in 1.4.0), e.g. “Author & lead maintainer”, “Contributor”, “Product owner”. Rendered as a short line under the project title. Localized, like the section-entry roles in Career/Membership/Volunteering. |
description | LocalizedBody | No | — | — |
url | Url | No | — | — |
tags | array of string | No | ≤ 30 items; items: 1–50 chars | — |
relatedCareerId | Slug | No | — | — |
startDate | YearMonth | No | — | — |
endDate | YearMonth or null | No | — | — |
highlighted | boolean | No | — | — |
order | integer | No | ≥ 0 | — |
No additional properties beyond those listed.
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
id | Slug | Yes | — | — |
visibility | Visibility | No | — | — |
label | string or LocalizedTitle | Yes | — | Skill name. A plain string is locale-independent; a localized map (added in 1.4.0) resolves per request locale. Existing single-string labels stay valid — the map form is purely additive. |
category | string | No | 1–64 chars | Recommended values (extensible): programming, design, business, communication, language, music, art, sports, other. |
order | integer | No | ≥ 0 | — |
No additional properties beyond those listed.
SkillCategory
Section titled “SkillCategory”| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
id | string | Yes | 1–64 chars | Matches the category value on the skills that belong to this group. |
label | LocalizedTitle | Yes | — | Localized display heading for the group. |
No additional properties beyond those listed.
Contact
Section titled “Contact”| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
email | No | — | — | |
showEmail | boolean | No | default false | — |
formUrl | Url | No | — | — |
No additional properties beyond those listed.
Settings
Section titled “Settings”| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
defaultLocale | LocaleTag | Yes | — | — |
fallbackLocale | LocaleTag | No | — | — |
availableLocales | array of LocaleTag | Yes | 1–50 items; unique items | — |
theme | string | No | 1–64 chars | UI theme identifier. ‘default’ is the built-in theme; adapters may add more. |
showPoweredBy | boolean | No | default true | Display the ‘Powered by takuhon’ attribution in the rendered profile. |
enableJsonLd | boolean | No | default true | Emit Schema.org JSON-LD on the rendered profile page. |
enableApi | boolean | No | default true | Expose the public read API endpoints (GET /api/profile, /api/jsonld, /api/schema, /takuhon.json). |
enableAnalytics | boolean | No | default false | Opt-in flag for first-party analytics. Default is false to keep takuhon privacy-respecting by default. |
activity | ActivitySettings | No | — | — |
publicVisibility | PublicVisibility | No | — | — |
contact | ContactSettings | No | — | — |
appearance | AppearanceSettings | No | — | — |
skillCategories | array of SkillCategory | No | ≤ 50 items | Ordered skill-category display groups (added in 1.3.0). When present, the rendered profile groups skills by their category under these localized headings, in array order; absent = the flat skill list. A skill whose category is not listed here (or which has none) renders in a trailing group so nothing is dropped. |
sectionOrder | array of any | No | ≤ 18 items; unique items; items: one of: about, careers, projects, volunteering, skills, activity, education, certifications, publications, honors, memberships, courses, patents, testScores, languages, recommendations, highlights, contact | Explicit section display order (added in 1.4.0). A partial list is allowed — any renderable section not named here follows, in the default order. Absent = the default order. |
sectionLabels | SectionLabelOverrides | No | — | — |
highlightsIntro | LocalizedTitle | No | — | Optional localized intro line shown under the highlights section heading (added in 1.4.0). Absent = no intro line. |
No additional properties beyond those listed.
SectionLabelOverrides
Section titled “SectionLabelOverrides”Localized overrides for section headings and chrome labels (added in 1.4.0). Each present key retitles that label; the renderer merges these over its built-in locale pack. Absent keys keep the built-in label.
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
about | LocalizedTitle | No | — | — |
careers | LocalizedTitle | No | — | — |
projects | LocalizedTitle | No | — | — |
volunteering | LocalizedTitle | No | — | — |
skills | LocalizedTitle | No | — | — |
activity | LocalizedTitle | No | — | — |
education | LocalizedTitle | No | — | — |
certifications | LocalizedTitle | No | — | — |
publications | LocalizedTitle | No | — | — |
honors | LocalizedTitle | No | — | — |
memberships | LocalizedTitle | No | — | — |
courses | LocalizedTitle | No | — | — |
patents | LocalizedTitle | No | — | — |
testScores | LocalizedTitle | No | — | — |
languages | LocalizedTitle | No | — | — |
recommendations | LocalizedTitle | No | — | — |
highlights | LocalizedTitle | No | — | — |
contact | LocalizedTitle | No | — | — |
skipLink | LocalizedTitle | No | — | — |
localeNav | LocalizedTitle | No | — | — |
featuredLinks | LocalizedTitle | No | — | — |
otherLinks | LocalizedTitle | No | — | — |
poweredBy | LocalizedTitle | No | — | — |
No additional properties beyond those listed.
AppearanceSettings
Section titled “AppearanceSettings”Opt-in design tokens for the rendered profile (added in 1.2.0). A declarative re-skin seam: owners override the standard renderer’s built-in color and font defaults. This is a token map only, not arbitrary CSS — every value is length- and pattern-constrained so it cannot break out of the inline
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
fontFamily | string | No | pattern ^[A-Za-z0-9\s,'"._-]+$; 1–256 chars | CSS font-family stack for the page body, e.g. “Inter, system-ui, sans-serif”. Quotes and commas are allowed; CSS-structural characters (; { } < >) are not. |
colors | AppearanceColors | No | — | Light-mode (:root) color overrides. |
colorsDark | AppearanceColors | No | — | Dark-mode (prefers-color-scheme: dark) color overrides. Note: until the standard renderer ships a default dark palette, only the keys set here change in dark mode. |
No additional properties beyond those listed.
AppearanceColors
Section titled “AppearanceColors”A set of overridable color tokens. Each value is a CSS color (hex, rgb()/rgba(), hsl()/hsla(), or a named color); CSS-structural characters (; { } < > ” ’ ) are disallowed so a value cannot escape the inline
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
bg | CssColor | No | — | Page background. |
surface | CssColor | No | — | Raised surfaces such as skill/tag chips. |
text | CssColor | No | — | Primary body text. |
textMuted | CssColor | No | — | Secondary/muted text (taglines, meta, captions). |
border | CssColor | No | — | Hairline borders and rules. |
accent | CssColor | No | — | Accent color for emphasis and focus affordances. |
primary | CssColor | No | — | Primary interactive color, e.g. links. |
primaryContrast | CssColor | No | — | Foreground color used on top of the primary color. |
heading | CssColor | No | — | Heading color for the “About” section’s Markdown sub-headings (##/###). |
No additional properties beyond those listed.
CssColor
Section titled “CssColor”A CSS color value, restricted to a safe allowlist: a hex color (#rgb/#rgba/#rrggbb/#rrggbbaa), a bare keyword (named colors, currentColor, transparent), or a color function (rgb/rgba/hsl/hsla/hwb/lab/lch/oklab/oklch/color). url(), image-set(), var(), and other fetch- or reference-bearing functions are intentionally excluded so a value can never trigger an external request or escape the inline
- Type:
string - Constraints: pattern
^(?:#[0-9A-Fa-f]{3,8}|[A-Za-z]+|(?:rgb|rgba|hsl|hsla|hwb|lab|lch|oklab|oklch|color)\([A-Za-z0-9.,%/\s-]*\))$; 1–64 chars
ContactSettings
Section titled “ContactSettings”Opt-in contact form configuration (added in 1.1.0). Only public values live here; the Turnstile site key is safe to embed in the page. The Turnstile secret, the recipient address, and the From label are provisioned out of band as environment configuration and are never stored in takuhon.json. Adapters that support the form mount the widget and a POST endpoint when ‘enabled’ is true.
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
enabled | boolean | No | default false | Master switch. When false (the default), no contact form is mounted even if a site key is present. |
turnstileSiteKey | string | No | 1–128 chars | Public Cloudflare Turnstile site key, safe to embed in the page. Without it the widget is not mounted. |
endpoint | string | No | 1–2048 chars | Override the POST endpoint the widget submits to. Defaults to /api/contact on the same origin. |
subjectPrefix | string | No | 1–128 chars | Subject prefix for the delivered email, e.g. ‘[example.com contact]’. |
No additional properties beyond those listed.
PublicVisibility
Section titled “PublicVisibility”Per-section public visibility (added in 0.6.0). Each key is a content section; setting it to false hides that whole section from every public surface (GET /, /api/profile, /api/jsonld, /takuhon.json, MCP, and the derived CV) via the shared applyPublicPrivacyFilter. An absent key — or an absent object — means the section is public, so the default is all-visible and omitting this block is fully backwards-compatible. The profile identity (profile.displayName, …) is always public and is intentionally not a key here. Field-level controls (contact.showEmail, meta.privacy.*) still apply within a visible section: visibility is the AND of the feature toggle, this section flag, and the field flag.
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
links | boolean | No | — | Default true. When false, links[] is emitted empty on public surfaces. |
careers | boolean | No | — | Default true. When false, careers[] is emitted empty on public surfaces. |
projects | boolean | No | — | Default true. When false, projects[] is emitted empty on public surfaces. |
skills | boolean | No | — | Default true. When false, skills[] is emitted empty on public surfaces. |
certifications | boolean | No | — | Default true. When false, certifications[] is emitted empty on public surfaces. |
memberships | boolean | No | — | Default true. When false, memberships[] is emitted empty on public surfaces. |
volunteering | boolean | No | — | Default true. When false, volunteering[] is emitted empty on public surfaces. |
honors | boolean | No | — | Default true. When false, honors[] is emitted empty on public surfaces. |
education | boolean | No | — | Default true. When false, education[] is emitted empty on public surfaces. |
publications | boolean | No | — | Default true. When false, publications[] is emitted empty on public surfaces. |
languages | boolean | No | — | Default true. When false, languages[] is emitted empty on public surfaces. |
courses | boolean | No | — | Default true. When false, courses[] is emitted empty on public surfaces. |
patents | boolean | No | — | Default true. When false, patents[] is emitted empty on public surfaces. |
testScores | boolean | No | — | Default true. When false, testScores[] is emitted empty on public surfaces. |
recommendations | boolean | No | — | Default true. When false, recommendations[] is emitted empty on public surfaces. |
highlights | boolean | No | — | Default true. When false, highlights[] is emitted empty on public surfaces. |
contact | boolean | No | — | Default true. When false, the contact section (email, formUrl) is emitted empty on public surfaces. |
No additional properties beyond those listed.
ActivitySettings
Section titled “ActivitySettings”Opt-in developer-activity dashboard configuration (GitHub / WakaTime). Only the owner-curated settings live here; secrets are provisioned out of band and the synced metrics are stored in a separate document, never in takuhon.json.
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
enabled | boolean | No | default false | Master switch. When false (the default), the activity section is not rendered even if a snapshot exists. |
github | object | No | — | — |
wakatime | object | No | — | — |
showRank | boolean | No | default true | Display the derived activity rank / badge. |
refreshHintHours | integer | No | 1–168 | Advisory refresh cadence in hours. The real cadence is how often the sync step (CLI command or scheduled job) runs. |
No additional properties beyond those listed.
ActivitySettings.github
Section titled “ActivitySettings.github”| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
username | string | Yes | 1–39 chars | GitHub login whose public activity is summarized. |
showLanguages | boolean | No | default true | — |
showContributions | boolean | No | default true | — |
No additional properties beyond those listed.
ActivitySettings.wakatime
Section titled “ActivitySettings.wakatime”| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
username | string | Yes | 1–255 chars | WakaTime username whose coding-time stats are summarized. |
showCodingTime | boolean | No | default true | — |
No additional properties beyond those listed.
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
createdAt | IsoDateTime | No | — | — |
updatedAt | IsoDateTime | No | — | — |
generator | string | No | 1–100 chars | Tool that produced this document (e.g. ‘Takuhon’, ‘create-takuhon@0.1.0’). |
contentLicense | ContentLicense | Yes | — | — |
privacy | MetaPrivacy | No | — | — |
No additional properties beyond those listed.
ContentLicense
Section titled “ContentLicense”| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
spdxId | string | Yes | 1–64 chars | SPDX identifier (e.g., ‘CC-BY-4.0’, ‘CC0-1.0’) or ‘Proprietary’. No default; the profile owner must choose explicitly. |
url | Url | No | — | — |
attribution | object | No | — | — |
rights | string | No | 1–1000 chars | Free-form rights statement (used when spdxId=‘Proprietary’ or for additional notices). |
No additional properties beyond those listed.
ContentLicense.attribution
Section titled “ContentLicense.attribution”| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
name | string | No | 1–200 chars | — |
url | Url | No | — | — |
No additional properties beyond those listed.
MetaPrivacy
Section titled “MetaPrivacy”Opt-out flags that strip personally identifying fields from public API output (GET /api/profile, /api/jsonld, /takuhon.json). Admin endpoints (PUT /api/admin/*, GET /api/admin/export) ignore these flags. Privacy-by-default: omitting the object or individual flags is equivalent to true.
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
hideCredentialIds | boolean | No | default true | When true (default), strip certifications[*].credentialId from public responses. |
hideEducationGrades | boolean | No | default true | When true (default), strip education[*].grade from public responses. |
No additional properties beyond those listed.
Certification
Section titled “Certification”| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
id | Slug | Yes | — | — |
visibility | Visibility | No | — | — |
title | LocalizedTitle | Yes | — | — |
issuingOrganization | LocalizedTitle | Yes | — | — |
issueDate | YearMonth | Yes | — | — |
expirationDate | YearMonth or null | No | — | null = explicitly ‘no expiration’. Omit if unknown/unstated. |
credentialId | string | No | 1–100 chars | License or certificate number. Public exposure controlled by meta.privacy.hideCredentialIds. |
url | Url | No | — | — |
order | integer | No | ≥ 0 | — |
No additional properties beyond those listed.
Membership
Section titled “Membership”| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
id | Slug | Yes | — | — |
visibility | Visibility | No | — | — |
organization | LocalizedTitle | Yes | — | — |
role | LocalizedTitle | No | — | — |
description | LocalizedBody | No | — | — |
startDate | YearMonth | Yes | — | — |
endDate | YearMonth or null | No | — | null = ongoing. Omit if unknown. |
isCurrent | boolean | No | — | — |
url | Url | No | — | — |
order | integer | No | ≥ 0 | — |
No additional properties beyond those listed.
Volunteering
Section titled “Volunteering”| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
id | Slug | Yes | — | — |
visibility | Visibility | No | — | — |
organization | LocalizedTitle | Yes | — | — |
role | LocalizedTitle | Yes | — | — |
cause | LocalizedTitle | No | — | — |
description | LocalizedBody | No | — | — |
startDate | YearMonth | Yes | — | — |
endDate | YearMonth or null | No | — | — |
isCurrent | boolean | No | — | — |
url | Url | No | — | — |
secondaryLink | SecondaryLink | No | — | An optional second link for this entry (added in 1.4.0), rendered as a small pill beside the description — e.g. the organization’s GitHub org page next to its main site. The brand glyph is resolved from the URL host; no vendor name is hard-coded. |
order | integer | No | ≥ 0 | — |
No additional properties beyond those listed.
SecondaryLink
Section titled “SecondaryLink”A supplementary link with an optional localized label (added in 1.4.0). When the label is absent the renderer shows the URL host. The brand glyph is resolved from the URL host.
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
url | Url | Yes | — | The link target. |
label | LocalizedTitle | No | — | Localized display label. When absent, the renderer derives a label from the URL host. |
No additional properties beyond those listed.
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
id | Slug | Yes | — | — |
visibility | Visibility | No | — | — |
title | LocalizedTitle | Yes | — | — |
issuer | LocalizedTitle | Yes | — | — |
description | LocalizedBody | No | — | — |
date | YearMonth | Yes | — | — |
url | Url | No | — | — |
order | integer | No | ≥ 0 | — |
No additional properties beyond those listed.
Education
Section titled “Education”| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
id | Slug | Yes | — | — |
visibility | Visibility | No | — | — |
institution | LocalizedTitle | Yes | — | — |
degree | LocalizedTitle | No | — | — |
fieldOfStudy | LocalizedTitle | No | — | — |
description | LocalizedBody | No | — | — |
grade | string | No | 1–50 chars | Free-form grade / class / GPA. Public exposure controlled by meta.privacy.hideEducationGrades. |
startDate | YearMonth | Yes | — | — |
endDate | YearMonth or null | No | — | null = currently enrolled. |
isCurrent | boolean | No | — | — |
url | Url | No | — | — |
order | integer | No | ≥ 0 | — |
No additional properties beyond those listed.
Publication
Section titled “Publication”| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
id | Slug | Yes | — | — |
visibility | Visibility | No | — | — |
title | LocalizedTitle | Yes | — | — |
publisher | LocalizedTitle | No | — | — |
description | LocalizedBody | No | — | — |
date | YearMonth | Yes | — | — |
url | Url | No | — | — |
doi | string | No | 1–200 chars | DOI identifier (e.g. ‘10.1145/3548643.3548644’). The full URL goes in ‘url’. |
coAuthors | array of string | No | ≤ 50 items; items: 1–100 chars | Co-author names in original script. Excludes the profile owner. |
order | integer | No | ≥ 0 | — |
No additional properties beyond those listed.
Language
Section titled “Language”| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
id | Slug | Yes | — | — |
visibility | Visibility | No | — | — |
language | LocaleTag | Yes | — | — |
displayName | LocalizedTitle | No | — | — |
proficiency | string | Yes | one of: native, fluent, professional, intermediate, basic | LinkedIn-compatible 5-level proficiency. |
order | integer | No | ≥ 0 | — |
No additional properties beyond those listed.
Course
Section titled “Course”| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
id | Slug | Yes | — | — |
visibility | Visibility | No | — | — |
title | LocalizedTitle | Yes | — | — |
provider | LocalizedTitle | No | — | — |
courseNumber | string | No | 1–50 chars | — |
description | LocalizedBody | No | — | — |
completionDate | YearMonth | No | — | — |
certificateUrl | Url | No | — | — |
relatedEducationId | Slug | No | — | Optional reference to an education[].id (e.g. for university coursework). |
order | integer | No | ≥ 0 | — |
No additional properties beyond those listed.
Patent
Section titled “Patent”| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
id | Slug | Yes | — | — |
visibility | Visibility | No | — | — |
title | LocalizedTitle | Yes | — | — |
patentNumber | string | Yes | 1–100 chars | — |
office | string | No | ≤ 100 chars | Patent office name (e.g. ‘USPTO’, ‘JPO’, ‘EPO’). |
status | string | Yes | one of: pending, issued, expired, abandoned | — |
description | LocalizedBody | No | — | — |
filingDate | YearMonth | No | — | — |
grantDate | YearMonth | No | — | — |
url | Url | No | — | — |
coInventors | array of string | No | ≤ 20 items; items: 1–100 chars | — |
order | integer | No | ≥ 0 | — |
No additional properties beyond those listed.
TestScore
Section titled “TestScore”| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
id | Slug | Yes | — | — |
visibility | Visibility | No | — | — |
title | LocalizedTitle | Yes | — | — |
score | string | Yes | 1–50 chars | Free-form score string (e.g. ‘112 / 120’, ‘330’, ‘N1 Pass’, or a percentile). The validator does not interpret its contents. |
date | YearMonth | Yes | — | — |
relatedEducationId | Slug | No | — | Optional reference to an education[].id (e.g. for a university course exam). |
description | LocalizedBody | No | — | — |
url | Url | No | — | — |
order | integer | No | ≥ 0 | — |
No additional properties beyond those listed.
Recommendation
Section titled “Recommendation”| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
id | Slug | Yes | — | — |
visibility | Visibility | No | — | — |
body | LocalizedBody | Yes | — | — |
author | RecommendationAuthor | Yes | — | — |
relationship | LocalizedTitle | No | — | How the recommender relates to the profile owner (e.g. ‘managed directly’, ‘worked together’). |
date | YearMonth | No | — | — |
relatedCareerId | Slug | No | — | Optional reference to a careers[].id (the position the recommendation pertains to). |
relatedEducationId | Slug | No | — | Optional reference to an education[].id (e.g. a recommendation from a professor). |
order | integer | No | ≥ 0 | — |
No additional properties beyond those listed.
RecommendationAuthor
Section titled “RecommendationAuthor”| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
name | string | Yes | 1–100 chars | Recommender’s name, in its original script. Owner-curated; takuhon does not verify it. |
headline | LocalizedTitle | No | — | Recommender’s title / role / organization at the time of the recommendation. |
url | Url | No | — | Link to the recommender’s profile, for external verification by the reader. |
No additional properties beyond those listed.
Highlight
Section titled “Highlight”One curated “selected post” (added in 1.4.0), rendered as a card in the highlights carousel. A hand-picked link to an off-site post (Instagram, X, a blog, a talk, …) with a self-hosted thumbnail — deliberately not an automated social feed. Appears on the public page, /api/profile, /takuhon.json, and MCP; it is intentionally omitted from JSON-LD and the derived CV (no natural vocabulary/résumé slot).
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
id | Slug | Yes | — | — |
visibility | Visibility | No | — | — |
platform | string | Yes | 1–64 chars | Free-form source platform (e.g. ‘instagram’, ‘x’, ‘github’, ‘blog’, ‘event’). A value with a matching brand glyph renders a badge icon; others fall back to a text badge. Not an enum, so new platforms need no schema change. |
url | Url | Yes | — | Permalink to the original post; the card links here. |
image | string | Yes | format uri-reference; ≤ 2048 chars | Self-hosted thumbnail, as an absolute URL or a root-relative path (like avatar). Serving the asset is the deployment’s responsibility (a static build does not copy it; a Cloudflare deploy serves it via its assets binding / /assets/*). Do not point at a third-party CDN URL — those can be signed/expiring and leak visitor data. |
alt | LocalizedTitle | Yes | — | Required alt text for the thumbnail — the card must not depend on the image alone. |
title | LocalizedTitle | Yes | — | Localized card title / caption. |
description | LocalizedBody | No | — | Optional localized supporting text shown under the title. |
postedAt | string | No | format date; pattern ^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$ | Optional post date, ISO ‘YYYY-MM-DD’ (full date, unlike the YYYY-MM dates used elsewhere — a post has a specific day). |
tags | array of string | No | ≤ 30 items; items: 1–50 chars | — |
order | integer | No | ≥ 0 | — |
No additional properties beyond those listed.