Configuration
Most of EnjuFolio is configured from a single file:
src/enju.config.tsThis page walks you through the main sections so you can make the site feel like home without reading the whole codebase.
Take it step by step
You don’t have to fill in everything on day one. Start with your name, links, and CV, then come back later to refine the rest.
IDE hover help
EnjuFolio ships with rich TypeScript docs for every field. When you’re editing enju.config.ts, you can hover over a property in your IDE (VS Code etc.) to see:
- A short explanation of what it does
- Notes about defaults and behavior
- One or more examples you can copy–paste
If you’re ever unsure about a field, let the hover docs guide you first, then come back here for the bigger picture.
1. Global site identity
These fields live at the top level of EnjuFolioConfig and control how your site introduces itself.
export const EnjuConfig: EnjuFolioConfig = {
title: 'Enju Folio | Academic Portfolio',
subTitle: 'Enju Folio',
siteShortName: 'Enju',
description: 'A portfolio for my academic work.',
siteUrl: 'https://example.com',
cvFileLink: '/cv/my-cv.pdf',
author: 'Your Name',
otherNames: ['Your Nickname'],
// ...
}title
- Shown in the browser tab and used for SEO.
- Recommended pattern:
"<Your Name> | <What this site is>"
Example:
title: "Zhuoran (Elara) Liu | Academic Portfolio",subTitle
- Appears after the
|on subpages. - Example page title:
Projects | Enju Folio. - Usually your site name or short brand.
subTitle: 'Enju Folio'siteShortName
- Short label in the top-left corner of the layout.
- Keep it very short: first name, nickname, or initials.
siteShortName: "Elara",description
- A one–two sentence summary used for SEO and social previews.
- Write this as if explaining your site to a kind, curious stranger.
description: "MSCS student working on human-centered intelligent systems for everyday work and health.",siteUrl
- The full public URL of your deployed site.
- Must:
- Start with
https:// - Not end with a trailing slash
- Start with
siteUrl: "https://portfolio.example.com",cvFileLink
- Where your CV PDF lives.
- Supports:
- Public Google Drive “file” URLs
- Direct HTTPS links to a PDF
- Relative paths in
public/(e.g./cv/my-cv.pdf)
cvFileLink: "https://drive.google.com/file/d/your_cv_id/view?usp=sharing",
// or
cvFileLink: "/cv/elara-liu-cv.pdf",author & otherNames
author: your main professional name (used in footer & meta).otherNames: any other names you use (nicknames, handles, different forms).
author: "Zhuoran (Elara) Liu",
otherNames: ["Zhuoran Liu", "Elara Liu", "Elara", "ZL Asica"],2. Home page (homePage)
The homePage block controls what visitors see first.
homePage: {
name: "Zhuoran (Elara) Liu",
picture: "/images/profile.webp",
otherInfo: "槐",
pronounce: "(she / her)",
position: "MSCS Student @ Northwestern University",
hobbies: [
{ emoji: "🏞️", name: "Hiking" },
{ emoji: "📸", name: "Photography" },
],
newsDateFormat: "MMM, YYYY",
newsCutoffYears: 2,
maximumNewsItemsOnHome: 5,
},name
- The name displayed prominently on the home page.
- Use whatever you’d put on your CV or talk slides.
picture
- Avatar/profile image on the home page.
- Either:
- A path starting with
/images/→public/images/… - A full remote URL
- A path starting with
picture: "/images/profile.webp",otherInfo
- Optional extra lines under your name:
- Name in another writing system
- Pronunciation hint
- Tiny tagline
Use \n for multiple lines:
otherInfo: "槐\n(“Enju” in Japanese)",pronounce
- A small string for your pronouns (despite the field name).
- Shown near your name; leave empty if you prefer.
pronounce: "(she / her)",position
- Your current role / position (optional).
- Example:
"PhD Student @ Example University".
hobbies
- Small list of hobbies with optional emojis.
- Makes the page feel more like a person, not just a CV.
hobbies: [
{ emoji: "🏞️", name: "Hiking" },
{ emoji: "🎧", name: "Ambient music" },
],newsDateFormat
- Controls how dates appear in the news section.
- Supports formats like:
YYYY-MM-DDYYYY/MM/DDMMM, YYYY(default, e.g.Nov, 2025)
newsDateFormat: "MMM, YYYY",newsCutoffYears
- How many years back to show news on the home page.
- Default is
2(shows news from the last 2 years).
newsCutoffYears: 2,maximumNewsItemsOnHome
- Maximum number of news items shown on the home page.
- Default is
5.
maximumNewsItemsOnHome: 5,3. Meta info & SEO (metaInfo)
The metaInfo block feeds JSON-LD / structured data so search engines can understand who you are.
metaInfo: {
affiliation: ["Northwestern University"],
alumniOf: ["University of California, Irvine"],
name: "Zhuoran Liu",
familyName: "Liu",
givenName: "Zhuoran",
alsoKnownAs: ["Elara", "ZL Asica"],
sameAs: [
"https://elaraliu.com",
"https://github.com/ZL-Asica",
],
},Key ideas:
affiliation/alumniOfWhere you work / study now, and where you studied before.name,familyName,givenNameOnly override if automatic guessing fromhomePage.namewould be wrong.alsoKnownAsOther name strings people might use to refer to you.sameAsURLs that clearly belong to you (GitHub, personal site, Google Scholar, etc.).
INFO
If you’re not sure how much you want to expose, you can start with just sameAs and add more later.
For a deeper breakdown, see:
- Meta Info & SEO (planned page)
4. Social links & RSS (socialLinks)
This block controls the icons in the footer and optional RSS feeds.
socialLinks: {
github: "https://github.com/ZL-Asica",
linkedin: "https://www.linkedin.com/in/your-handle/",
instagram: "https://www.instagram.com/your-handle/",
orcid: "https://orcid.org/0000-0000-0000-0000",
telegram: "https://t.me/your-handle",
bluesky: "https://bsky.app/profile/your-handle.bsky.social",
email: "[email protected]",
rss: {
news: true,
research: true,
projects: false,
},
},Social URLs
Each field (github, linkedin, instagram, etc.) is a full URL. Only fill in the platforms you’re comfortable making public.
email
Just the email address; the site will handle linking (mailto:) for you.
email: "[email protected]",rss
You can either:
- Set
rss: true→ enable RSS for all supported sections, or - Provide a config object to pick specific sections:
rss: {
news: true,
research: true,
projects: false,
},If rss is left undefined, RSS feeds are disabled.
5. LLM preferences (disableLlmstxt)
EnjuFolio can generate an optional llms.txt file to express how you’d like large language models and automated crawlers to treat your content.
disableLlmstxt: false,false→ enablellms.txtgeneration (expresses preferences)true→ disable this feature
If you care a lot about how AI systems might reuse your writing, enabling this is an extra layer of signaling — not a guarantee, but a gentle boundary.
For more context, see:
- llmstxt.org
- LLM & Privacy Settings (planned page)
Where to go next
Once your configuration feels roughly right, you can:
- Replace the demo content in
src/contents→ Content & Sections - Tweak metadata & JSON-LD details → Meta Info & SEO
- Customize styles & layout → Customization Guide
You can always come back to enju.config.ts as your “control panel” — it’s designed so that most changes to your identity and structure can live in this one file.