Repository navigation
Configuration
Everything you can set, where it lives, and what it does by default. Every value on this page was read from the code. For a guided walk-through instead of a reference, see Make It Yours.
| File | What you set there |
|---|---|
src/resources/site-data.tsx |
Your details: domain, name, role, bio, hero text, social links, experience, studies, skills, gallery, GitHub user |
src/resources/content.tsx |
Page titles, labels and descriptions, and which About sections are shown |
src/resources/once-ui.config.ts |
Which pages exist, the header, password-protected pages, fonts, colours, effects, newsletter form, sharing buttons |
src/app/work/projects/*.mdx |
One file per project (see Adding Projects) |
.env.local |
Secrets and machine-specific settings (see Environment variables) |
next.config.mjs |
Next.js options: allowed image hosts, redirects, build timeout |
src/resources/custom.css |
Optional custom colour scales, plus layout CSS for the GitHub grid and project cards |
biome.json |
Formatter and linter settings |
Note: Values that are personal to the author (name, email, links, time zone and so on) are listed below as "author's value". Replace them with your own.
| Variable | Required | Default | What it does |
|---|---|---|---|
PAGE_ACCESS_PASSWORD |
Only if protectedRoutes has an entry set to true
|
not set | The password for protected pages. Checked by POST /api/authenticate. If it is missing when someone submits a password, the API answers 500 Internal server error and logs PAGE_ACCESS_PASSWORD environment variable is not set. |
CHROMIUM_PATH |
No | the executable from @sparticuz/chromium
|
The browser used to capture project screenshots in src/app/screenshots/[slug]/route.ts. Set it to use a Chrome or Chromium you installed yourself. |
Next.js sets NODE_ENV and NEXT_PHASE by itself. The code reads them to decide whether the password cookie is secure (production only) and whether a failed screenshot may fall back to the committed cover (during the build and in development).
-
On your machine: a file named
.env.localin the project root. Restartnpm run devafter editing it. - On Vercel: Project → Settings → Environment Variables.
Warning: The repository contains a committed
.envfile that already setsPAGE_ACCESS_PASSWORD, and.gitignoredoes not exclude.envfiles. Next.js loads.envtoo, so until you set your own value, the password is the one anyone can read in the public repository. Before you enable password protection, set your own password in.env.local(or in your host's settings; both take precedence over.env) and add.env*.localto.gitignore.
src/resources/site-data.tsx exports one object, siteData. The other files read from it.
| Key | Default | What it does |
|---|---|---|
meta.baseURL |
"https://umutbayraktar.vercel.app" |
Your site's address, without a trailing slash. Used in page metadata, Schema.org data, sitemap.xml, robots.txt, the RSS feed, and to load your avatar into generated Open Graph images. Change this first.
|
meta.keywords |
a list of keywords | Not read by any page at the moment. |
| Key | Default | What it does |
|---|---|---|
firstName, lastName
|
author's value | Stored in person; the pages display name. |
name |
author's value | Your display name: About page heading, page titles, Open Graph images, schema author, RSS. |
role |
author's value | Shown under your name on About, in Open Graph images, and in the Home page title (name | role). |
avatar |
"/images/avatar.jpg" |
Your picture, from public/. Shown on Home and About, and used in page schema, the RSS feed and generated Open Graph images. (The favicon is set separately in layout.tsx.) |
email |
author's value | Used in the RSS feed (managingEditor, webMaster, item author). |
timezone |
author's value | An IANA time-zone name such as Etc/UTC (full list). Shown on the About page next to a globe icon. |
languages |
["Türkçe", "English"] |
Shown as tags on the About page. Remove the key or leave the list empty to hide them. |
biography |
author's value | The meta description of the Home and About pages. |
phone, website, address
|
author's values | Not read by any page at the moment. |
| Key | Default | What it does |
|---|---|---|
hero.headline |
"Full-Stack Developer, AI Researcher & Content Creator" |
The big heading on Home. |
hero.subline |
author's text | The paragraph under the heading. Supports %project.key% live numbers and **bold**. |
hero.featured.badge, .label, .href
|
"Software studio", "Codeshare Technology", "https://codeshare.me"
|
A small badge above the headline. Only shown when home.featured.display is true in content.tsx (default false). |
hero.ctaPrimary, hero.ctaSecondary, hero.stats
|
author's values | Not read by any page at the moment. |
| Key | Default | What it does |
|---|---|---|
newsletter.display |
false |
Shows the Mailchimp signup block at the bottom of Home. |
newsletter.title |
"Build log" |
Heading of the block. |
newsletter.description |
author's text | Text under the heading. |
The form itself is configured in mailchimp below.
A list of links. Each entry is shown as a button on the About page and as an icon in the footer.
| Field | What it is |
|---|---|
name |
Label and tooltip, e.g. "GitHub"
|
icon |
A key from src/resources/icons.ts (see the list below) |
link |
The full URL. It is not validated, so double-check it. |
Default entries: Instagram, YouTube, TikTok, Discord, GitHub, LinkedIn, Twitter, Telegram, Facebook.
Icon keys available in src/resources/icons.ts:
arrowUpRight, arrowRight, email, globe, person, grid, book, openLink, calendar, home, gallery, discord, eye, eyeOff, github, linkedin, x, twitter, threads, arrowUpRightFromSquare, document, rocket, javascript, nextjs, supabase, figma, facebook, youtube, instagram, pinterest, whatsapp, reddit, telegram, tiktok
To add another icon, import it from react-icons in icons.ts and add it to iconLibrary.
| Key | What it does |
|---|---|
about.introDescription |
The intro paragraph on About. Supports live numbers and **bold**. |
about.experiences[] |
Work experience. Each item has company, timeframe, role and achievements (a list of strings that support live numbers). images and link are present in the data but the About page does not show them. |
about.studies[] |
Education. Each item has name and description. |
about.technical[] |
Skills. Each item has title, description and tags (each tag has name and an optional icon). The About page shows only the tag name; icon is not displayed. |
about.introTitle |
Not read; the intro heading comes from about.intro.title in content.tsx. |
A list of image paths shown on /gallery. The default list points at the eight live project screenshots (/screenshots/<slug>). You can use files from public/ (for example /images/gallery/one.jpg) or images on another host (see images.remotePatterns).
| Key | Default | What it does |
|---|---|---|
github.username |
"umutxyp" |
Whose repositories /github shows, and whose profile is read for pinned repositories. |
github.highlight |
["MusicBot", "Seo-Promt-Master", "Discord-Bot-Website", "Personal-Website", "slash-command-bot", "Shroudly"] |
Fallback list of pinned repositories, used only if the pins cannot be read from your GitHub profile. |
github.description |
author's text | Text under the "GitHub Projects" heading and the page's meta description. |
src/resources/content.tsx builds the page objects from siteData. Most values are filled in for you; these are the ones you are likely to change.
| Key | Default | What it does |
|---|---|---|
home.image |
"/images/og/home.jpg" |
Share image for the Home page. This file is not in the repository; add your own at public/images/og/home.jpg or change the path. |
home.title |
`${name} | ${role}` |
Home page title. |
home.featured.display |
false |
Shows the badge above the headline (see hero.featured). |
about.title |
`About - ${name}` |
About page title, also the text of the button on Home. |
about.avatar.display |
true |
Shows your avatar on About and in the Home button. |
about.calendar.display |
false |
Shows a "Schedule a call" pill on About. |
about.calendar.link |
"https://cal.com/umutxyp" |
Where that pill links to. |
about.intro.display / .title
|
true / "Hello!"
|
The intro section and its heading. |
about.work.display / .title
|
true / "Work Experience"
|
The experience section. |
about.studies.display / .title
|
true / "Studies"
|
The studies section. |
about.technical.display / .title
|
true / "Technical focus"
|
The skills section. |
about.tableOfContent.display / .subItems
|
true / false
|
Settings for the TableOfContents component in src/components/about/. The About page does not render that component at the moment, so these have no visible effect. |
work.title / .description
|
`Projects - ${name}` / author's text |
Heading and metadata of /work. |
gallery.title / .description
|
`Product gallery - ${name}` / author's text |
Metadata of /gallery. |
blog.title / .description
|
author's text | Used by the RSS feed. |
Which pages exist. A page whose value is false, or whose path is not listed, shows the 404 page. Paths under /work and /blog follow the value of /work and /blog.
| Path | Default |
|---|---|
/ |
true |
/about |
true |
/work |
true |
/blog |
false |
/gallery |
true |
/github |
true |
Turning a route off also removes its button from the header and its entry from sitemap.xml. Case study URLs (/work/<slug>) stay in the sitemap even when /work is off.
The header has a button only for these six paths. A new route you add here works, but gets no header button until you add one in src/components/Header.tsx.
Note: The repository has no blog pages, so leave
/blogset tofalseunless you add them yourself.
| Key | Default | What it does |
|---|---|---|
themeSwitcher |
true |
Shows the light/dark toggle in the header. |
location |
false |
Defined in the type; the header in this repository does not read it. |
time |
false |
Defined in the type; the header in this repository does not read it. |
Default: {} (nothing protected). To protect a page, add its exact path:
const protectedRoutes: ProtectedRoutesConfig = {
"/about": true,
};The match is exact: protecting /work does not protect /work/my-project. You also need PAGE_ACCESS_PASSWORD. (The comment above protectedRoutes mentions a .env.example file; the repository does not contain one, so use the example in Environment variables.) How it works is explained on Pages and Features.
All four use next/font/google:
| Key | Font | CSS variable |
|---|---|---|
heading |
Geist | --font-heading |
body |
Geist | --font-body |
label |
Geist | --font-label |
code |
Geist Mono | --font-code |
| Key | Default | Allowed values (from the code comments) |
|---|---|---|
theme |
"system" |
dark, light, system. Note: the start-up script in layout.tsx does not read this value; see Pages and Features. |
neutral |
"gray" |
sand, gray, slate, custom
|
brand |
"cyan" |
blue, indigo, violet, magenta, pink, red, orange, yellow, moss, green, emerald, aqua, cyan, custom
|
accent |
"red" |
same list as brand
|
solid |
"contrast" |
color, contrast
|
solidStyle |
"flat" |
flat, plastic
|
border |
"playful" |
rounded, playful, conservative
|
surface |
"translucent" |
filled, translucent
|
transition |
"all" |
all, micro, macro
|
scaling |
"100" |
90, 95, 100, 105, 110
|
For custom colours, define the --scheme-* variables in src/resources/custom.css. The file contains a commented example and points to once-ui.com/customize for generating them.
Settings for Once UI charts. The pages in this repository do not draw charts, so you only need these if you add some.
| Key | Default | Allowed values |
|---|---|---|
variant |
"gradient" |
flat, gradient, outline
|
mode |
"categorical" |
categorical, divergent, sequential
|
height |
24 |
number |
axis.stroke |
"var(--neutral-alpha-weak)" |
CSS colour |
tick.fill / .fontSize / .line
|
"var(--neutral-on-background-weak)" / 11 / false
|
The page background. Each group can be switched on with display.
| Group | Default | Settings |
|---|---|---|
mask |
cursor: false, x: 50, y: 0, radius: 100
|
Where the background fades out; cursor: true makes it follow the mouse |
gradient |
display: false, opacity: 100, x: 50, y: 60, width: 100, height: 50, tilt: 0, colorStart: "accent-background-strong", colorEnd: "page-background"
|
A large colour glow |
dots |
display: true, opacity: 40, size: "2", color: "brand-background-strong"
|
The dot pattern you see by default |
grid |
display: false, opacity: 100, color: "neutral-alpha-medium", width: "0.25rem", height: "0.25rem"
|
A square grid |
lines |
display: false, opacity: 100, color: "neutral-alpha-weak", size: "16", thickness: 1, angle: 45
|
Diagonal lines |
| Key | Default | What it does |
|---|---|---|
action |
"" |
The form's action URL from your Mailchimp embed code. |
effects |
its own mask, gradient, dots, grid, lines
|
Background of the newsletter block (same shape as effects). |
Note:
src/components/Mailchimp.tsxalso contains hidden fields copied from a Mailchimp embed form (a group checkbox and ab_..._...field). If you use your own list, copy the matching fields from your own embed code.
-
schema(logo, type"Person", name, description, email) andsameAs(social profile URLs) are exported but no page reads them at the moment. Page schema is built directly in each page withpersonandbaseURL. -
socialSharing(display: true; X, LinkedIn, email and copy-link on; Facebook, Pinterest, WhatsApp, Reddit and Telegram off) is read only bysrc/components/blog/ShareSection.tsx, which no page renders in this repository.
| Option | Value | Why |
|---|---|---|
pageExtensions |
ts, tsx, md, mdx
|
MDX files can be pages |
transpilePackages |
next-mdx-remote |
|
serverExternalPackages |
@sparticuz/chromium, puppeteer-core
|
Chromium is loaded from disk at runtime |
outputFileTracingIncludes |
/screenshots/* → Chromium binaries and src/app/work/projects/**
|
So the screenshot function has what it needs when deployed |
staticPageGenerationTimeout |
180 (seconds) |
Each screenshot is captured during the build; a slow site needs more than 60 seconds |
images.remotePatterns |
https://www.google.com/** |
The only outside host next/image may load from. Add your own hosts here. |
redirects() |
/work/code-share-marketplace → /work/codeshare-technology (permanent) |
An old link of the author's. Safe to remove in your copy. |
sassOptions |
compiler: "modern", silenceDeprecations: ["legacy-js-api"]
|
A few values are not in a config file. Change them in the file listed if you need to.
| Value | Default | File |
|---|---|---|
| Live numbers source | https://codeshare.me |
src/lib/live-stats.ts (SOURCE, SOURCES, FALLBACK) |
| Live numbers refresh | 604800 s (7 days) | src/lib/live-stats.ts |
| Screenshot refresh | 604800 s (7 days) | src/app/screenshots/[slug]/route.ts |
| Screenshot size | 1600 × 1000 at 1.25× (2000 × 1250), JPEG quality 80, dark colour scheme | src/app/screenshots/[slug]/route.ts |
| Screenshot page timeout | 25 s to load, function maxDuration 60 s |
src/app/screenshots/[slug]/route.ts |
| GitHub data cache | 3600 s (1 hour) | src/app/github/page.tsx |
| Footer text |
© <year> umutxyp, linking to https://github.com/umutxyp
|
src/components/Footer.tsx |
| Favicon |
/images/avatar.jpg (plus src/app/favicon.ico) |
src/app/layout.tsx |
| Password cookie |
authToken, 1 hour, httpOnly, sameSite: strict
|
src/app/api/authenticate/route.ts |
| Setting | Value |
|---|---|
| Indentation | 2 spaces |
| Line width | 100 |
| Quotes (JS/TS) | double |
| Linter | on, recommended rules |
| VCS integration | off |
Run npm run biome-write to format the whole project.
Personal Website by Umut Bayraktar · MIT License · Codeshare
Start
Reference
Go live
Community