Controlling what's public
Your takuhon.json is the complete record. What actually reaches a public
reader — the profile page, the API, JSON-LD, the MCP endpoint, the exported CV —
is decided by four independent layers — in settings, on individual items, and
in meta. A value is public only when all the layers that apply to it allow
it (logical AND), and the same projection runs on every surface, so they always
agree.
1. Feature toggles — turn whole capabilities on or off
Section titled “1. Feature toggles — turn whole capabilities on or off”settings.enable* switches entire features:
| Setting | Default | Effect |
|---|---|---|
enableJsonLd | true | Emit Schema.org JSON-LD on the page. |
enableApi | true | Expose the public read API endpoints. |
enableAnalytics | false | Opt-in first-party analytics. |
2. Section visibility — hide whole sections
Section titled “2. Section visibility — hide whole sections”settings.publicVisibility (added in schema 0.6.0) lets you hide an entire
content section. Each key is a section name; setting it to false removes that
section from every public surface:
{ "settings": { "publicVisibility": { "education": false, "recommendations": false } }}- Default is all-visible. An absent key — or an absent
publicVisibilityblock — means the section is public, so older profiles are unaffected. - The 16 sections you can toggle are
links,careers,projects,skills,certifications,memberships,volunteering,honors,education,publications,languages,courses,patents,testScores,recommendations, andcontact. - Your profile identity (
profile.displayName, avatar, tagline, …) is always public and is intentionally not a toggle. To take a whole profile offline, don’t deploy it (or turn the API off).
3. Item visibility — hide a single entry
Section titled “3. Item visibility — hide a single entry”<item>.visibility (added in schema 0.7.0) hides one entry within a section
that is otherwise public. Set visibility to "private" on any item — a link,
a project, a career, … — and that entry is removed from every public surface
while its siblings stay:
{ "links": [ { "id": "site", "type": "website", "url": "https://example.com" }, { "id": "draft-blog", "type": "blog", "url": "https://blog.example.com", "visibility": "private" } ]}- Default is public. An absent value — or
"visibility": "public"— keeps the item visible, so older profiles are unaffected. - Works on items in any of the 15 array sections (
links,projects,careers, and so on). Use it for a link you’re not ready to share, a draft project, or any single entry you want to hold back without hiding the whole section. - A private item disappears entirely — neither its existence nor the section’s count is leaked.
- Hiding a whole section (layer 2) supersedes the item check. You still see and edit private items in the admin editor, which loads the full document.
4. Field-level controls — hide specific fields
Section titled “4. Field-level controls — hide specific fields”Within a visible section, individual fields stay governed by their own flags:
| Control | Default | Effect |
|---|---|---|
contact.showEmail | false | Email is hidden unless explicitly set to true. |
meta.privacy.hideCredentialIds | true | Strips certifications[*].credentialId. |
meta.privacy.hideEducationGrades | true | Strips education[*].grade. |
Hiding a whole section (layer 2) — or marking an item private (layer 3) — supersedes these field checks; a visible item still honors them.
One filter, every surface
Section titled “One filter, every surface”These controls are applied by a single projection in @takuhon/core (section →
item → field), so the profile page, /api/profile, /api/jsonld,
/takuhon.json, the MCP endpoint, and the derived CV all expose exactly the same
content. The admin editor loads the full document from the authenticated
export — including items you’ve marked private — so you can always edit them;
only the public surfaces strip them. It exposes the feature toggles, a checkbox
per section under Public sections, and the field controls; per-item
visibility is set on the item directly (a per-item toggle in the form is
planned).
For every field and its constraints, see the schema reference.