Added about page
This commit is contained in:
parent
9b5fee37e2
commit
ff553187db
3 changed files with 63 additions and 2 deletions
45
app/about/page.tsx
Normal file
45
app/about/page.tsx
Normal 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
16
content/pages/about.md
Normal 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).
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue