chore: Revise website.
All checks were successful
Release code / build (push) Successful in 3m15s

This commit is contained in:
Tera << 8 2025-02-19 21:49:31 -05:00
parent 408434ece8
commit 265f03c21f
Signed by: imterah
GPG key ID: 8FA7DD57BA6CEA37
11 changed files with 139 additions and 44 deletions

View file

@ -1,2 +0,0 @@
ErrorDocument 404 /404.html
ServerName terah.dev

View file

@ -6,4 +6,4 @@ RUN npm run build
FROM httpd:2.4 AS run
WORKDIR /app
COPY --from=build /build/dist /usr/local/apache2/htdocs
COPY .htaccess /usr/local/apache2/htdocs
COPY --from=build /build/httpd.conf /usr/local/apache2/conf/httpd.conf

17
LICENSE Normal file
View file

@ -0,0 +1,17 @@
Copyright (c) 2025 Tera
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.

90
httpd.conf Normal file
View file

@ -0,0 +1,90 @@
ServerRoot "/usr/local/apache2"
Listen 80
LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule filter_module modules/mod_filter.so
LoadModule mime_module modules/mod_mime.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule env_module modules/mod_env.so
LoadModule headers_module modules/mod_headers.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so
<IfModule unixd_module>
User www-data
Group www-data
</IfModule>
ServerAdmin me@terah.dev
ServerName terah.dev:80
<Directory />
AllowOverride none
Require all denied
</Directory>
DocumentRoot "/usr/local/apache2/htdocs"
<Directory "/usr/local/apache2/htdocs">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
<Files ".ht*">
Require all denied
</Files>
ErrorLog /proc/self/fd/2
LogLevel warn
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
# You need to enable mod_logio.c to use %I and %O
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog /proc/self/fd/1 common
</IfModule>
<IfModule headers_module>
RequestHeader unset Proxy early
</IfModule>
<IfModule mime_module>
TypesConfig conf/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
</IfModule>
ErrorDocument 404 /404.html
<IfModule proxy_html_module>
Include conf/extra/proxy-html.conf
</IfModule>
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>

View file

@ -22,7 +22,7 @@
]
}
],
"summary": "Hobbyist software developer with an affinity to server-side applications",
"summary": "Hobbyist software developer with a love for backend systems",
"labels": ["software developer", "homelabber"],
"aliases": ["imterah"],
"contact": {
@ -92,10 +92,6 @@
"residence": {
"state": "IN",
"countryCode": "US"
},
"origin": {
"state": "KY",
"countryCode": "US"
}
},
"education": [],
@ -116,6 +112,7 @@
"name": "API",
"summary": "The API server for Hermes.",
"role": "Creator",
"tags": ["resume_pdf"],
"technologies": [
{
"id": "go",
@ -140,6 +137,7 @@
"name": "Backend Infrastructure",
"summary": "Standardized system that lets you write 'backends' (methods to proxy services) in any programming language.",
"role": "Creator",
"tags": ["resume_pdf"],
"technologies": [
{
"id": "go",

View file

@ -10,6 +10,11 @@
'has too much servers',
'is in love with Proxmox VE',
'has an irrational hatred for smart toasters',
'has a zero-Windows policy',
'has a zero-macOS policy',
'loves NixOS',
'uses Arch Linux, by the way',
'installed Gentoo twice',
]
const fact = facts[Math.floor(Math.random() * facts.length)] ?? ''

View file

@ -5,10 +5,10 @@ import { recivi } from '@/stores/recivi'
let combinedPronouns: string = ''
// @ts-ignore
if (typeof recivi.bio['pronouns'] !== 'undefined') {
// @ts-ignore
const pronounSet = recivi.bio['pronouns'] as PronounSet[]
const pronounSet = recivi.bio['pronouns'] as PronounSet[] | undefined
// @ts-ignore
if (pronounSet !== undefined) {
// TODO: Implement multiple set support
if (pronounSet.length === 0) {
combinedPronouns = 'any/all'
@ -22,13 +22,16 @@ if (typeof recivi.bio['pronouns'] !== 'undefined') {
return
}
if (pronouns.pronouns.length === 0) {
combinedPronouns = 'any/all'
return
}
// Use a common English-speaking convention of only showing the first pronoun if we have
// multiple pronouns specified
if (pronouns.language == 'English') {
if (pronouns.pronouns.length === 0) {
return
} else if (pronouns.pronouns.length === 1) {
if (pronouns.pronouns.length === 1) {
const firstPronoun = pronouns.pronouns[0]
if (!firstPronoun) {
@ -49,8 +52,14 @@ if (typeof recivi.bio['pronouns'] !== 'undefined') {
}
} else {
for (const pronounInstance of pronouns.pronouns) {
combinedPronouns += pronounInstance.firstSet + '/'
combinedPronouns +=
pronounInstance.firstSet + '/' + pronounInstance.secondSet + ', '
}
combinedPronouns = combinedPronouns.substring(
0,
combinedPronouns.length - 2
)
}
}
---

View file

@ -2,7 +2,7 @@
layout: '@/layouts/content.astro'
title: Home
description: Hi! I'm Tera, a hobbyist software developer, with an affinity for Linux
description: Hi! I'm Tera. I'm a hobbyist software developer with a love for backend systems.
index: 0
---

View file

@ -2,7 +2,7 @@
slug: resume
title: Résumé
description: Peruse my résumé, encompassing my time developing software both as a hobbyist and full-time for many years.
description: Peruse my résumé, encompassing my time developing software.
index: 2
---
@ -26,5 +26,5 @@ software. Most of it is open-source. You can find my code on various Git hosting
sites, which are all listed on my <Link url='/'>contact page</Link>.
If you like what you see here and want to work with me, you can grab the
<Link url={import.meta.env.DEV ? '/resume/pdf' : '/resume.pdf'}>PDF version</Link>
<Link url='/resume/pdf'>PDF version</Link>
of this résumé. Print responsibly.

View file

@ -7,15 +7,6 @@ export const GET: APIRoute = async function () {
JSON.stringify({
name: siteStore.title,
start_url: '/',
icons: [
{ src: '/icon-512.png', type: 'image/png', sizes: '512x512' },
{
src: '/icon-512-maskable.png',
type: 'image/png',
sizes: '512x512',
purpose: 'maskable',
},
],
})
)
}

View file

@ -52,20 +52,6 @@ export function urlToDest(url: Url): string {
return typeof url === 'object' && 'dest' in url ? url.dest : url
}
/**
* Convert a given country code into the country's flag emoji. This is easier
* than mapping it to a country name, considering there can be multiple
* representations of the name.
*
* @param countryCode - the ISO 3166-1 Alpha-2 code for the country
* @returns the flag emoji
*/
function countryCodeDisplay(countryCode: string): string {
return countryCode
.toUpperCase()
.replace(/./g, (char) => String.fromCodePoint(char.charCodeAt(0) + 127397))
}
/**
* Convert the address into a string.
*
@ -73,12 +59,13 @@ function countryCodeDisplay(countryCode: string): string {
* @returns the string representation of the address
*/
export function addressDisplay(address: Address) {
let text = countryCodeDisplay(address.countryCode)
let text = ''
if (address.state) {
text = `${address.state}, ${text}`
text = `${address.state}, ${address.countryCode}`
}
if (address.city) {
text = `${address.city}, ${text}`
text = `${address.city}, ${address.countryCode}`
}
return text
}