Added about page

This commit is contained in:
HangerThem 2026-08-04 08:21:11 +02:00
parent 9b5fee37e2
commit ff553187db
3 changed files with 63 additions and 2 deletions

45
app/about/page.tsx Normal file
View file

@ -0,0 +1,45 @@
import { metadata } from '@/app/metadata'
import { ImageWrapper } from '@/components/content/ImageWrapper'
import { TableOfContents } from '@/components/post/TableOfContents'
import { getPostBySlug } from '@/lib/posts'
import { slugify } from '@/utils/slug'
import { Pencil, SendHorizonal } from 'lucide-react'
import type { Metadata } from 'next'
import Link from 'next/link'
export async function generateStaticParams() {
return await getPostBySlug('about', 'content/pages')
}
export const dynamicParams = false
export async function generateMetadata(): Promise<Metadata> {
const { meta } = await getPostBySlug('about', 'content/pages')
return {
title: `${meta.title} | ${metadata.title!.toString()}`,
description: meta.description,
openGraph: {
type: 'website',
title: `${meta.title} | ${metadata.title!.toString()}`,
description: meta.description,
url: process.env.SITE_URL + `/about`,
siteName: metadata.title!.toString(),
},
}
}
export default async function Post() {
const { meta, content } = await getPostBySlug('about', 'content/pages')
return (
<main className="flex w-full">
<article className="max-w-3xl 2xl:max-w-4xl mx-auto px-4 py-8 mb-8 lg:py-16 min-w-0">
<h1 className="text-4xl font-bold mb-4">{meta.title}</h1>
<p className="text-fg text-lg mb-4">{meta.description}</p>
<div className="prose">{content}</div>
</article>
<div className="w-80 2xl:w-100 hidden lg:block" />
</main>
)
}

16
content/pages/about.md Normal file
View file

@ -0,0 +1,16 @@
---
title: About
description: Learn more about me, my background, and my passions. Discover what drives me as a software developer, IT instructor, and lifelong learner. Get to know the person behind the code and the projects.
---
Hey, I'm Frank (František Borisjuk) — a freelance full-stack developer and IT instructor based in Czechia.
By day, I build things with Next.js, TypeScript, Supabase, and Prisma — mostly full-stack web projects for clients, ranging from B2B platforms to niche tools that solve one very specific problem well. I also run my own self-hosted infrastructure stack (Coolify, Traefik, Authentik, Forgejo, and the rest) on a Hetzner VPS, because I like understanding — and controlling — every layer of what I ship.
I also teach. At my old high school, I run a web development and cybersecurity curriculum for teenagers, which somehow keeps me both humble and sharp — nothing forces you to actually understand something like explaining it to a room of sixteen-year-olds.
Outside of client work, I tinker on my own projects: an open-source cookie consent library built on an anti-dark-pattern philosophy, a branching narrative RPG engine, and the occasional deep dive into things that have nothing to do with code — Czech constitutional law, obscure mythology, grimdark fiction, Linux package conflicts at 2am.
I run Arch (btw), care a lot about privacy and self-hosting, and generally believe most software problems are actually just under-specified problems in disguise.
This site is where I write about what I'm building, what I'm learning, and occasionally what's breaking. Feel free to look around, or reach out at [f.borisjuk@hangerthem.com](mailto:f.borisjuk@hangerthem.com).

View file

@ -62,8 +62,8 @@ export function getNextAndPreviousPosts(slug: string): {
return { next, previous } return { next, previous }
} }
export async function getPostBySlug(slug: string) { export async function getPostBySlug(slug: string, postDirectory: string = postsDirectory) {
const fullPath = path.join(postsDirectory, `${slug}.md`) const fullPath = path.join(postDirectory, `${slug}.md`)
const { data, content } = matter(fs.readFileSync(fullPath, 'utf8')) const { data, content } = matter(fs.readFileSync(fullPath, 'utf8'))
let processor = remark().use(remarkParse).use(remarkGfm) let processor = remark().use(remarkParse).use(remarkGfm)