This commit is contained in:
Parker TenBroeck 2026-01-16 22:02:02 -05:00
commit 6449151d7a
38 changed files with 779 additions and 0 deletions

38
config.toml Normal file
View file

@ -0,0 +1,38 @@
# The URL the site will be built for
base_url = "https://parkertenbroeck.com/"
# The site title and description; used in feeds by default.
title = "Parker TenBroeck"
description = "Personal website"
# Whether to automatically compile all Sass files in the sass directory
compile_sass = true
# The default language; used in feeds.
default_language = "en"
# When set to "true", a feed is automatically generated.
generate_feeds = true
# The default author for pages
author = "Parker TenBroeck"
# The filename to use for the feed. Used as the template filename, too.
# Defaults to "atom.xml", which has a built-in template that renders an Atom 1.0 feed.
# There is also a built-in template "rss.xml" that renders an RSS 2.0 feed.
feed_filenames = ["rss.xml", "atom.xml"]
# Whether to build a search index to be used later on by a JavaScript library
build_search_index = true
taxonomies = [
{name = "tags", feed=true}
]
[markdown]
# Whether to do syntax highlighting
# Theme can be customised by setting the `highlight_theme` variable to a theme supported by Zola
highlight_code = true
render_emoji = true
bottom_footnotes = true
github_alerts = true

6
content/blog/_index.md Normal file
View file

@ -0,0 +1,6 @@
+++
title = "Blogs"
sort_by = "date"
template = "blog.html"
page_template = "blog-page.html"
+++

10
content/blog/first.md Normal file
View file

@ -0,0 +1,10 @@
+++
title = "My first post"
description = "moving from an abandond react website which hasn't been updated in over 4 years to Zola"
date = 2026-01-16
[taxonomies]
tags = ["web", "zola"]
+++

6
content/crafts/_index.md Normal file
View file

@ -0,0 +1,6 @@
+++
title = "Crafts"
sort_by = "date"
template = "blog.html"
page_template = "blog-page.html"
+++

View file

@ -0,0 +1,10 @@
+++
title = "QTip-Cube"
description = "Boredom can lead to wonderful discoveries. One such discovery is the fact that Qtips can be carefully arranged in such a way that they form a strong(ish) cube held together by nothing but pure Qtip"
date = 2025-05-12
[taxonomies]
tags = ["6-sided", "crafty"]
+++
I'm so sorry for whoever opened this page expecting to see such a object. Unfortunately I have not yet uploaded the image. Please yell at me if needed

9
content/crafts/spoon.md Normal file
View file

@ -0,0 +1,9 @@
+++
title = "Spoon"
description = "I went from a tree all the way to a spoon in a few weeks"
date = 2026-01-16
[taxonomies]
tags = ["wooden", "crafty"]
+++

View file

@ -0,0 +1,6 @@
+++
title = "Pictures"
sort_by = "date"
template = "blog.html"
page_template = "blog-page.html"
+++

View file

@ -0,0 +1,6 @@
+++
title = "Projects"
sort_by = "date"
template = "blog.html"
page_template = "blog-page.html"
+++

10
content/projects/ansi.md Normal file
View file

@ -0,0 +1,10 @@
+++
title = "Ansi"
description = "A `no_std` incremental, panic free, allocationless ansi parser"
date = 2025-09-23
[taxonomies]
tags = ["embedded", "rust"]
+++
https://github.com/ParkerTenBroeck/ansi

View file

@ -0,0 +1,12 @@
+++
title = "Automata"
description = "A compiler, visualizer, and simulator for different classes of automata"
date = 2026-01-14
[taxonomies]
tags = ["web", "deno", "rust"]
+++
https://github.com/ParkerTenBroeck/automata
parkertenbroeck.com/automata/

View file

@ -0,0 +1,9 @@
+++
title = "Brainfuck"
description = "A brainfuck parser, interpreter, compiler, and optimizer"
date = 2024-05-09
[taxonomies]
tags = ["rust", "x86"]
+++
https://github.com/ParkerTenBroeck/brainfuck_compiler

View file

@ -0,0 +1,9 @@
+++
title = "FastExpr"
description = "A java 24 library that runtime compiled math expressions into native JVM bytecode. Also supporting expression simplification and operations such as derivatives"
date = 2025-04-03
[taxonomies]
tags = ["java", "bytecode"]
+++
https://github.com/ParkerTenBroeck/fastexpr

View file

@ -0,0 +1,9 @@
+++
title = "Generators"
description = "A java 24 library that adds stackless coroutines to standard java code by transforming method bytecode into state machines at load time"
date = 2025-05-07
[taxonomies]
tags = ["java", "bytecode"]
+++
https://github.com/ParkerTenBroeck/generators

View file

@ -0,0 +1,10 @@
+++
title = "Highschool Programs"
description = "A collection of programs I made while in highschool. Don't look too hard at the code ;)"
date = 2020-01-01
[taxonomies]
tags = ["java", "fun", "highschool"]
+++
https://github.com/ParkerTenBroeck/HighSchoolPrograms

View file

@ -0,0 +1,9 @@
+++
title = "Kernel"
description = "A from scratch bootloader, and kernel for the milkv-duos development board. Featuring VGA output, virtual memory support, rudimentary scheduling, UART, and kernel image loading through UART"
date = 2024-08-08
[taxonomies]
tags = ["rust", "embedded", "risc-v"]
+++
https://github.com/ParkerTenBroeck/milkv-duos-rs

View file

@ -0,0 +1,10 @@
+++
title = "Legend Of XOR"
description = "A 'game' but mostly game engine I wrote in a group that is surprisingly 'ok' for what it is"
date = 2020-01-16
[taxonomies]
tags = ["java", "fun", "game", "highschool"]
+++
https://github.com/ParkerTenBroeck/Legend-of-Xor

View file

@ -0,0 +1,10 @@
+++
title = "My CPU"
description = "A CPU I designed based off a SAP-1 CPU but expanded to be a much more 'capable' 16 bit CPU. THE ISA is about as good as you'd expect"
date = 2018-01-16
[taxonomies]
tags = ["hardware", "logic gates", "highschool"]
+++
https://github.com/ParkerTenBroeck/MyCPU_16bit

View file

@ -0,0 +1,9 @@
+++
title = "QC Backend"
description = "A quality control tool for RCT - Niagara I developed while working for them. Despite the name it is also the frontend"
date = 2024-04-21
[taxonomies]
tags = ["rust", "sql", "web"]
+++
https://github.com/ParkerTenBroeck/qc-backend

View file

@ -0,0 +1,9 @@
+++
title = "Software Rasterizer"
description = "A software rasterizer written in C++ for a parallel computing class. Using OpenMP and OpenMPI together to support multi threaded rendering of single frames and distributed rendering of multiple frames across networks. With dynamic coloured lighting, normal, diffuse, ambient, specular, roughness, and shininess maps supported using Blinn-Phong shading."
date = 2025-12-12
[taxonomies]
tags = ["C++", "graphics"]
+++
https://github.com/ParkerTenBroeck/3P93

5
default.nix Normal file
View file

@ -0,0 +1,5 @@
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
buildInputs = [ pkgs.zola ];
}

8
sass/blog.scss Normal file
View file

@ -0,0 +1,8 @@
.blog-page {
.title {
h1 {
font-size: 2.2em;
}
padding-bottom: 2em;
}
}

9
sass/footer.scss Normal file
View file

@ -0,0 +1,9 @@
footer {
display: flex;
flex-wrap: wrap;
margin: 1em 0;
border-top-style: solid;
border-top-width: 4px;
border-top-color: var(--grey);
}

28
sass/header.scss Normal file
View file

@ -0,0 +1,28 @@
header {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
margin: 1em 0;
font-size: large;
.title * {
font-size: xx-large;
text-decoration-color: var(--primary)!important;
&:hover {
text-decoration-color: var(--grey)!important;
}
}
nav {
a {
margin-right: 0.5rem;
}
}
padding-bottom: 1em;
}

87
sass/style.scss Normal file
View file

@ -0,0 +1,87 @@
@use "theme.scss";
@use "header.scss";
@use "footer.scss";
@use "blog.scss";
body {
background: var(--bg-0);
color: var(--fg-1);
font-size: 16px;
line-height: 1.6em;
letter-spacing: .5px;
}
.content {
margin-bottom: 4em;
margin-left: auto;
margin-right: auto;
max-width: 800px;
padding: 0 0.5em;
}
@media screen and (min-width: 978px) {
.content {
margin-left: 4rem;
}
}
a {
color: var(--fg-0);
font-weight: bold;
text-decoration: underline;
text-decoration-thickness: 0.30ex;
text-decoration-color: var(--grey);
&:hover {
text-decoration-color: var(--primary);
}
}
h1,
h2,
h3,
h4,
h5,
h6 {
color: var(--fg-0);
font-weight: bold;
margin-top: 2em;
}
h1 {
font-size: 2rem;
}
h2 {
font-size: 1.4rem;
}
h3 {
font-size: 1.2rem;
}
h4 {
font-size: 1.1rem;
}
h5 {
font-size: 1rem;
}
h6 {
font-size: 1rem;
}
code {
background: var(--bg-1);
border-radius: 3px;
font-family: 'Berkeley Mono';
padding: .15rem .3rem;
}
time {
padding-bottom: 1em;
color: var(--fg-2);
}

14
sass/theme.scss Normal file
View file

@ -0,0 +1,14 @@
:root {
--bg-0: #1d1d1d;
--bg-1: #131313;
--grey: #777;
--fg-0: #eee;
--fg-1: #ccc;
--fg-2: #999;
--primary: #daa520
}

BIN
static/resume.pdf Normal file

Binary file not shown.

17
templates/404.html Normal file
View file

@ -0,0 +1,17 @@
{% extends "base.html" %}
{%- block title -%}Page not found{%- endblock -%}
{%- block robots -%}
<meta name="robots" content="noindex, follow">
{%- endblock -%}
{%- block main -%}
{%- filter indent -%}{%- filter indent -%}
<section class="framed">
<h2>Page not found...</h2>
<p>Sorry, this page doesn't exist. Go back <a href="{{ config.base_url | safe }}">home</a>?</p>
</section>
{%- endfilter -%}{%- endfilter -%}
{%- endblock -%}

137
templates/base.html Normal file
View file

@ -0,0 +1,137 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>
{%- block title -%}
{% if page.title %}{{ page.title }}
{% elif section.title %}{{ section.title }}
{% elif config.title %}{{ config.title }}
{% endif %}
{%- endblock -%}
</title>
{% block feeds %}
<link rel="alternate" type="application/rss+xml" title="RSS" href="{{ get_url(path='rss.xml', trailing_slash=false) }}">
<link rel="alternate" type="application/atom+xml" title="Atom" href="{{ get_url(path='atom.xml', trailing_slash=false) }}">
{% endblock %}
<link rel="stylesheet" href="{{ get_url(path='style.css', cachebust=true) }}">
{%- if page.extra.stylesheets or section.extra.stylesheets %}
{%- for stylesheet in page.extra.stylesheets | default(value=section.extra.stylesheets) %}
<link rel="stylesheet" href="{{ get_url(path=stylesheet, cachebust=true) }}">
{% endfor -%}
{%- endif %}
{%- if config.extra.favicon %}
{% set image_meta = get_image_metadata(path=config.extra.favicon) -%}
<link rel="icon" type="{{ image_meta.mime | safe }}" href="{{ get_url(path=config.extra.favicon) }}">
{%- if image_meta.mime is ending_with("png") %}
{% set resized_image = resize_image(path=config.extra.favicon, width=180, height=180, op="fit") -%}
<link rel="apple-touch-icon" href="{{ resized_image.url | safe }}">
{%- endif -%}
{%- elif config.extra.favicon_emoji %}
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>{{ config.extra.favicon_emoji }}</text></svg>">
{%- endif %}
{% if current_url %}
<meta property="og:url" content="{{ current_url | safe }}">
<link rel="canonical" href="{{ current_url | safe }}">
{% endif %}
{% if page -%}
<meta property="og:type" content="article">
{% else -%}
<meta property="og:type" content="website">
{% endif -%}
{% if page.title %}
<meta property="og:title" content="{{ page.title }}">
<meta property="twitter:title" content="{{ page.title }}">
{% endif %}
<meta property="twitter:card" content="summary_large_image">
{% if page.extra.preview_img %}
<meta property="og:image" content="{{ get_url(path=page.extra.preview_img) }}" >
<meta property="twitter:image" content="{{ get_url(path=page.extra.preview_img) }}" >
{% endif %}
{%- if page.authors -%}
{%- for author in page.authors %}
<meta name="author" content="{{ author }}">
{%- endfor -%}
{%- elif page and config.author %}
<meta name="author" content="{{ config.author }}">
{%- endif %}
{%- block description -%}
{%- if config.description %}
<meta name="description" content="{{ config.description }}">
{%- endif %}
{%- endblock %}
<meta name="color-scheme" content="dark">
{%- if page.description -%}
<meta property="og:description" content="{{ page.description | markdown(inline=true) | striptags }}">
{% elif page.summary -%}
{%- set inline_summary = page.summary | linebreaksbr | replace(from="<br>", to=" ") | striptags -%}
<meta property="og:description" content="{{ inline_summary | trim_end_matches(pat=".") | safe }}">
{%- elif section.description -%}
<meta property="og:description" content="{{ section.description | markdown(inline=true) | striptags }}">
{% elif config.description -%}
<meta property="og:description" content="{{ config.description }}">
{% endif -%}
<meta property="og:site_name" content="{{ config.title }}">
<meta property="og:updated_time" content="{{ now() }}">
{%- if page.date %}
<meta property="article:published_time" content="{{ page.date | date(format="%+") }}">
{%- endif -%}
{%- if page.updated %}
<meta property="article:modified_time" content="{{ page.updated | date(format="%+") }}">
{%- endif -%}
{%- if page.taxonomies and page.taxonomies.categories %}
<meta property="article:section" content="{{ page.taxonomies.categories[0] }}">
{%- endif -%}
{%- if page.taxonomies and page.taxonomies.tags -%}
{%- for tag in page.taxonomies.tags %}
<meta property="article:tag" content="{{ tag }}">
{%- endfor -%}
{%- endif -%}
</head>
<body data-theme="dark">
<div class="content">
<header class="header">
{% filter indent -%}{%- filter indent -%}
{%- block header -%}
{% include "partials/header.html" %}
{%- endblock -%}
{%- endfilter -%}{%- endfilter %}
</header>
<main id="main">
{% block main %}{% endblock %}
</main>
<footer class="footer">
{% filter indent -%}{%- filter indent -%}
{%- block footer -%}
{% include "partials/footer.html" %}
{%- endblock -%}
{%- endfilter -%}{%- endfilter %}
</footer>
</div>
</body>
</html>

19
templates/blog-page.html Normal file
View file

@ -0,0 +1,19 @@
{% extends "base.html" %}
{% block main %}
<div class="blog-page">
<div class="title">
<h1>{{ page.title }}</h1>
<p><time>{{page.date}}</time>
{% if page.taxonomies %}{% if page.taxonomies.tags %}
{% for tag in page.taxonomies.tags %} • #{{tag}} {% endfor %}
{% endif %}{% endif %}
</p>
</div>
{{ page.content | safe }}
</div>
{% endblock main %}

15
templates/blog.html Normal file
View file

@ -0,0 +1,15 @@
{% extends "base.html" %}
{% import "macros/post.html" as posts %}
{% block main %}
<div class="blog">
{% for page in section.pages %}
{{ posts::excerpt(page=page) }}
{% endfor %}
</div>
{% endblock main %}

36
templates/index.html Normal file
View file

@ -0,0 +1,36 @@
{% extends "base.html" %}
{% import "macros/post.html" as posts %}
{% block main %}
<p>
Hi, I'm Parker. I like to talk about silly computer things and whatever else comes to mind.
</p>
<p>
You can find <a href="{{ get_url(path='@/blog/_index.md') }}">Posts</a>,
<a href="{{ get_url(path='@/projects/_index.md') }}">Projects</a>,
<a href="{{ get_url(path='@/crafts/_index.md') }}">Crafts</a>,
<a href="{{ get_url(path='@/pictures/_index.md') }}">Pictures</a>, and
<a href="{{ get_url(path='tags') }}">Tags</a> up above on any page.
</p>
<p>Please note that this page is currently under construction; not all content is finished.</p>
<p>If you'd like to employ me please take a look at my <a href="{{get_url(path='resume.pdf')}}">resume</a>.</p>
<br>
<p>Heres a list of stuff I'd like you to checkout:</p>
<ul>
<li>{{ posts::page_link(path="projects/automata.md") }}</li>
<li>{{ posts::page_link(path="projects/software-renderer.md") }}</li>
<li>{{ posts::page_link(path="projects/ansi.md") }}</li>
<li>{{ posts::page_link(path="projects/generators.md") }}</li>
<li>{{ posts::page_link(path="projects/fastexpr.md") }}</li>
<li>{{ posts::page_link(path="projects/kernel.md") }}</li>
<li>{{ posts::page_link(path="blog/first.md") }}</li>
</ul>
{% endblock main %}

View file

@ -0,0 +1,28 @@
{%- macro excerpt(page) -%}
<article class="excerpt">
<h1><a href="{{ page.permalink | safe }}">{{ page.title }}</a></h1>
<p><time>{{page.date | date(format="%b %d, %Y")}}</time>
{% if page.taxonomies %}{% if page.taxonomies.tags %}
{% for tag in page.taxonomies.tags %}
{% set url = get_taxonomy_url(kind="tags", name=tag, lang=page.lang) %}
<a href = "{{url}}">#{{tag}}</a>
{% endfor %}
{% endif %}{% endif %}
</p>
<div class="description">
{{page.description | markdown | safe}}
</div>
</article>
{%- endmacro -%}
{% macro page_link(path) %}
{% set p = get_page(path=path) %}
<a href="{{ p.permalink }}">{{ p.title }}</a>
{% if p.date %}
<time datetime="{{ p.date }}">
{{ p.date | date(format="%b %d, %Y") }}
</time>
{% endif %}
{% endmacro %}

View file

@ -0,0 +1,9 @@
{%- macro prettify(term) -%}
{%- if taxonomy.name == "categories" -%}
{{- "{" ~ term ~ "}" | safe -}}
{%- elif taxonomy.name == "tags" -%}
{{- "#" ~ term | safe -}}
{%- else -%}
{{- term | safe -}}
{%- endif -%}
{%- endmacro -%}

View file

@ -0,0 +1,8 @@
<p><a href="https://github.com/ParkerTenBroeck">ParkerTenBroeck</a> on GitHub
|
<a href="mailto:parker@parkertenbroeck.ca">parker@parkertenbroeck.ca</a>
|
<a href="{{ get_url(path='rss.xml', trailing_slash=false) }}">RSS</a>
|
<a href="{{ get_url(path='atom.xml', trailing_slash=false) }}">Atom</a>

View file

@ -0,0 +1,10 @@
<div class="title">
<a href="{{config.base_url}}">Hey! it's Grey</a>
</div>
<nav>
<a href="{{ get_url(path='@/blog/_index.md') }}">Posts</a>
<a href="{{ get_url(path='@/projects/_index.md') }}">Projects</a>
<a href="{{ get_url(path='@/crafts/_index.md') }}">Crafts</a>
<a href="{{ get_url(path='@/pictures/_index.md') }}">Pictures</a>
<a href="{{ get_url(path='tags') }}">Tags</a>
</nav>

95
templates/robots.txt Normal file
View file

@ -0,0 +1,95 @@
User-agent: TurnitinBot
Disallow: /
User-agent: Google-Extended
Disallow: /
User-agent: GPTBot
Disallow: /
User-agent: CCBot
Disallow: /
User-agent: Omgilibot
Disallow: /
User-agent: 008
Disallow: /
User-agent: voltron
Disallow: /
User-agent: Bytespider
Disallow: /
User-agent: AdsBot-Google
Disallow: /
User-agent: Amazonbot
Disallow: /
User-agent: Anthropic-ai
Disallow: /
User-agent: AwarioRssBot
Disallow: /
User-agent: AwarioSmartBot
Disallow: /
User-agent: Bytespider
Disallow: /
User-agent: CCBot
Disallow: /
User-agent: ChatGPT-User
Disallow: /
User-agent: ClaudeBot
Disallow: /
User-agent: Claude-Web
Disallow: /
User-agent: Cohere-ai
Disallow: /
User-agent: DataForSeoBot
Disallow: /
User-agent: FacebookBot
Disallow: /
User-agent: Google-Extended
Disallow: /
User-agent: GPTBot
Disallow: /
User-agent: ImagesiftBot
Disallow: /
User-agent: Magpie-crawler
Disallow: /
User-agent: Omgili
Disallow: /
User-agent: Omgilibot
Disallow: /
User-agent: Peer39_crawler
Disallow: /
User-agent: Peer39_crawler/1.0
Disallow: /
User-agent: PerplexityBot
Disallow: /
User-agent: YouBot
Disallow: /
Sitemap: {{ get_url(path="sitemap.xml") }}

View file

@ -0,0 +1,18 @@
{% extends "base.html" %}
{% import "macros/taxonomy.html" as macros %}
{% block main %}
<h1>{{ taxonomy.name | title }}</h1>
{%- set num_terms = terms | length %}
<ul class="taxonomy-list{%- if num_terms > 16 %} three-column{%- elif num_terms > 8 %} two-column{%- endif -%}">
{%- for term in terms %}
{%- set page_count = [term.page_count ~ " post", term.page_count | pluralize] | join %}
<li><a href="{{ term.permalink | safe }}">{{ macros::prettify(term=term.name) }}</a> ({{ page_count }})</li>
{%- endfor %}
</ul>
{% endblock main %}

View file

@ -0,0 +1,39 @@
{% extends "base.html" %}
{% import "macros/taxonomy.html" as macros %}
{% import "macros/post.html" as posts %}
{%- block title -%}
{{ term.name | title }} | {{ config.title }}
{%- endblock -%}
{# {%- block feeds -%}
{%- if taxonomy.feed -%}
{%- for filename in config.feed_filenames -%}
{%- if taxonomy.name is ending_with("ies") -%}
{%- set singular_name = taxonomy.name | replace(from="ies", to="y") -%}
{%- else -%}
{%- set singular_name = taxonomy.name | trim_end_matches(pat="s") -%}
{%- endif -%}
{%- set feed_title = config.title ~ " | Posts in the '" ~ term.name ~ "' " ~ singular_name -%}
{%- set feed_filename = taxonomy.name ~ "/" ~ term.name ~ "/" ~ filename -%}
{{ feed_macros::link_alternate(filename=feed_filename, title=feed_title) }}
{% endfor -%}
{%- endif -%}
{%- endblock -%} #}
{% block rss %}
{% set rss_path = "tags/" ~ term.name ~ "/rss.xml" %}
<link rel="alternate" type="application/rss+xml" title="RSS" href="{{ get_url(path=rss_path, trailing_slash=false) }}">
{% endblock rss %}
{%- block main -%}
<h1>{{ macros::prettify(term=term.name) }}</h1>
<div>
{%- for page in paginator.pages | default(value=term.pages) %}
{{ posts::excerpt(page=page) }}
{%- endfor %}
</div>
{%- endblock -%}