This commit is contained in:
Elijah McMorris 2025-05-06 13:30:28 -07:00
parent d6006a0227
commit 70671e5a43
Signed by: NexVeridian
SSH key fingerprint: SHA256:bsA1SKZxuEcEVHAy3gY1HUeM5ykRJl0U0kQHQn0hMg8
17 changed files with 519 additions and 14 deletions

94
.github/workflows/docker.yml vendored Normal file
View file

@ -0,0 +1,94 @@
name: docker
on:
# workflow_run:
# workflows: [crane]
push:
branches: [main]
# types:
# - completed
# schedule:
# - cron: 0 0 * * 1
# # Publish semver tags as releases.
# tags: [ 'v*.*.*' ]
# pull_request:
# branches: [ "main" ]
env:
# Use docker.io for Docker Hub if empty
REGISTRY: ghcr.io
# github.repository as <account>/<repo>
IMAGE_NAME: ${{ github.repository }}
jobs:
build:
runs-on: ubuntu-latest
# https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#running-a-workflow-based-on-the-conclusion-of-another-workflow
# if: ${{ github.event.workflow_run.conclusion == 'success' }}
permissions:
contents: read
packages: write
# This is used to complete the identity challenge
# with sigstore/fulcio when running outside of PRs.
id-token: write
steps:
- name: Checkout repository
uses: actions/checkout@v3
# Install Nix
- name: Install Nix
uses: DeterminateSystems/nix-installer-action@main
- run: nix run -I nixpkgs=channel:nixos-unstable nixpkgs#attic-client login nex https://nix.nexveridian.com ${{ secrets.ATTIC_TOKEN }} || true
- run: nix run -I nixpkgs=channel:nixos-unstable nixpkgs#attic-client cache create NexVeridian-web || true
- run: nix run -I nixpkgs=channel:nixos-unstable nixpkgs#attic-client use NexVeridian-web || true
# Set up BuildKit Docker container builder to be able to build
# multi-platform images and export cache
# https://github.com/docker/setup-buildx-action
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
# Login against a Docker registry except on PR
# https://github.com/docker/login-action
- name: Log into registry ${{ env.REGISTRY }}
if: github.event_name != 'pull_request'
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GHCR_TOKEN }}
# Extract metadata (tags, labels) for Docker
# https://github.com/docker/metadata-action
- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
# Build Nix package
- name: Build Nix package
run: nix build .#my-docker
# https://github.com/orgs/community/discussions/25768#discussioncomment-3249183
- name: Downcase REPO
run: |
echo "REPO=${GITHUB_REPOSITORY,,}" >> ${GITHUB_ENV}
- name: Strip REPO Username
run: |
STRIP_REPO_USERNAME=$(echo "${{ env.REPO }}" | sed 's/nexveridian\///')
echo "STRIP_REPO_USERNAME=${STRIP_REPO_USERNAME}" >> ${GITHUB_ENV}
# https://github.com/docker/build-push-action/issues/538
- name: Push and tag Docker image
run: |
docker load < result
docker tag ${{ env.STRIP_REPO_USERNAME }}:latest ${{ env.REGISTRY }}/${{ env.REPO }}:latest
docker push ${{ env.REGISTRY }}/${{ env.REPO }}:latest
- run: |
for i in {1..10}; do
nix run -I nixpkgs=channel:nixos-unstable nixpkgs#attic-client push NexVeridian-web /nix/store/*/ && break || [ $i -eq 5 ] || sleep 5
done

1
.gitignore vendored
View file

@ -1 +1,2 @@
public
result

1
README.md Normal file
View file

@ -0,0 +1 @@
Source code for NexVeridian.com built using [Zola](https://github.com/getzola/zola)

View file

@ -1,5 +1,5 @@
# The URL the site will be built for
base_url = "https://nexveridian.com"
base_url = "https://blog.nexveridian.com/"
# The site title and description; used in feeds by default.
title = ""
@ -38,15 +38,15 @@ menu_items = [
# each of these is optional, name and url are required
# $BASE_URL is going to be substituted by base_url from configuration
{ name = "blog", url = "$BASE_URL" },
{ name = "home", url = "$BASE_URL" },
# tags should only be enabled if you have "tags" taxonomy
# see documentation below for more details
{ name = "blog", url = "$BASE_URL/archive" },
{ name = "tags", url = "$BASE_URL/tags" },
{ name = "archive", url = "$BASE_URL/archive" },
{ name = "about me", url = "$BASE_URL/about" },
{ name = "resume", url = "$BASE_URL/Elijah_McMorris_Resume.pdf" },
{ name = "resume", url = "$BASE_URL/Elijah_McMorris_Resume.pdf", newtab = true },
]
show_only_description = true

View file

@ -1,4 +1,4 @@
+++
paginate_by = 3
sort_by = "date"
title = "NexVeridian"
template = "index.html"
+++

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

@ -0,0 +1,6 @@
+++
title = "Blog"
sort_by = "date"
template = "section.html"
paginate_by = 3
+++

View file

@ -1,6 +1,7 @@
+++
title = "Welcome to Terminimal Theme for Zola"
date = 2019-02-04
# description = "A showcase post for the Terminimal theme."
[taxonomies]
tags = ["zola", "theme", "showcase"]
@ -16,7 +17,7 @@ Code block (using "boron" theme):
class HelloPrinter:
def __init__(self, thing):
self.thing = thing
def __call__(self):
print(f"Hello, {self.thing}!")

View file

@ -3,11 +3,11 @@ title = "About Me"
path = "about"
+++
I recently finished BAS in Software Development, Im looking for a Software Engineering positions, I live in Kirkland WA, I'm a US citizen. I've contributed multiple substantial code PRs to JupyterLab and Loco.rs, created an official extension for Loco.rs adding OpenAPI integration, and I have several open source projects on my resume. My strongest programming languages: Rust, TypeScript, Python, and I also use Nix for a lot of my projects.
I recently finished BAS in Software Development, Im looking for Software Engineering positions, I live in Kirkland WA, I'm a US citizen. I've contributed multiple substantial code PRs to JupyterLab and Loco.rs, created an official extension for Loco.rs adding OpenAPI integration, and I have several open source projects on my resume. My strongest programming languages: Rust, TypeScript, Python, and I also use Nix for a lot of my projects.
# Contact Me:
- [Email](mailto:nexveridian@gmail.com)
- [NexVeridian.com](https://nexveridian.com)
- [Calendly](https://calendly.com/nexveridian/main)
- [GitHub.com](https://github.com/NexVeridian)
- [LinkedIn](https://www.linkedin.com/in/nexveridian)
- [Calendly](https://calendly.com/nexveridian/main)
- [X](https://x.com/nexveridian)

View file

@ -1,5 +1,5 @@
+++
title = "Archive"
title = "Blog"
path = "archive"
template = "archive.html"
+++

View file

@ -29,7 +29,7 @@
# Create a Docker image with static-web-server to serve the site
my-docker = pkgs.dockerTools.buildImage {
name = "my-zola";
name = "nexveridian-web";
tag = "latest";
created = "now";

View file

@ -7,7 +7,7 @@ update:
docker:
nix build .#packages.x86_64-linux.my-docker
docker load < ./result
docker rm -f my-zola
docker run -d --rm -p 80:80 --name my-zola my-zola:latest
docker rm -f nexveridian-web
docker run -d --rm -p 80:80 --name nexveridian-web nexveridian-web:latest
rm -rf result
docker image prune -f

94
static/css/custom.css Normal file
View file

@ -0,0 +1,94 @@
/* Custom styles for NexVeridian website */
:root {
/* Main theme colors */
/* --background: #1F222A; */
--background-secondary: #191b22;
/* --color: white;
--color-secondary: #a9b7c6; */
/* --accent: rgb(120, 226, 160); */
/* --accent-alpha-70: rgba(120, 226, 160, 0.7); */
/* --accent-alpha-20: rgba(120, 226, 160, 0.2); */
/* --border-color: rgba(255, 255, 255, 0.1); */
}
.project-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 20px;
margin-bottom: 40px;
}
.project-box {
background-color: var(--background-secondary);
border-radius: 8px;
padding: 20px;
transition: transform 0.3s ease, box-shadow 0.3s ease;
display: flex;
flex-direction: column;
height: 100%;
color: inherit;
}
.project-box-link {
text-decoration: none;
color: inherit;
display: block;
}
.project-box-link:hover .project-box {
transform: translateY(-5px);
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.3);
}
.project-box p {
margin-bottom: 15px;
}
.view-project {
display: inline-block;
margin-top: auto;
font-weight: bold;
text-decoration: underline;
}
.project-tags {
color: var(--color-secondary);
font-size: 0.9em;
margin-top: 5px;
margin-bottom: 15px;
opacity: 0.8;
}
.project-tags::before {
/* content: ":: "; */
opacity: 0.7;
}
.recent-posts {
background-color: var(--background-secondary);
border-radius: 8px;
padding: 20px;
margin-bottom: 40px;
}
.section-title {
border-bottom: 2px solid var(--accent);
padding-bottom: 10px;
margin-bottom: 20px;
font-size: 24px;
font-weight: bold;
}
.view-all {
display: block;
text-align: left;
margin-top: 20px;
font-weight: bold;
}
/* Additional overrides to ensure theme consistency */
/* body {
background-color: var(--background);
color: var(--color);
} */

19
templates/archive.html Normal file
View file

@ -0,0 +1,19 @@
{% extends "index.html" %}
{%- block title -%}
{{ title_macros::title(page_title=page.title, main_title=config.title) }}
{%- endblock -%}
{% block extra_head %}
<link rel="stylesheet" href="{{ get_url(path="css/custom.css") }}">
{% endblock extra_head %}
{% block content %}
<div class="post">
<h1 class="post-title">{{ page.title }}</h1>
{% set blog_section = get_section(path="blog/_index.md") %}
{{ post_macros::list_posts(pages=blog_section.pages) }}
</div>
{% endblock content %}

194
templates/index.html Normal file
View file

@ -0,0 +1,194 @@
{% import "macros/date.html" as date_macros -%}
{% import "macros/head.html" as head_macros -%}
{% import "macros/menu.html" as menu_macros -%}
{% import "macros/post.html" as post_macros -%}
{% import "macros/title.html" as title_macros -%}
<!DOCTYPE html>
<html lang="{%- if config.default_language -%}{{ config.default_language }}{%- else -%}en{%- endif -%}">
<head>
<title>{%- block title %}{{ config.title }}{% endblock title -%}</title>
{{ head_macros::head(config=config) }}
{%- block open_graph %}{{ head_macros::open_graph(config=config) }}{% endblock open_graph -%}
{%- if config.generate_feeds %}
{%- for feed in config.feed_filenames %}
{%- if feed is containing('atom') %}
<link rel="alternate" type="application/atom+xml" title="{{ config.title }} Atom Feed" href="{{ get_url(path=feed, trailing_slash=false, lang=lang) | safe }}" />
{%- endif %}
{%- if feed is containing('rss') %}
<link rel="alternate" type="application/rss+xml" title="{{ config.title }} RSS Feed" href="{{ get_url(path=feed, trailing_slash=false, lang=lang) | safe }}" />
{%- endif %}
{%- endfor %}
{%- endif -%}
{%- if config.extra.favicon %}
<link rel="shortcut icon" type="{{ config.extra.favicon_mimetype | default(value="image/x-icon") | safe }}" href="{{ config.extra.favicon | safe }}">
{% endif -%}
{%- block extra_head %}
<link rel="stylesheet" href="{{ get_url(path="css/custom.css") }}">
{% endblock extra_head -%}
</head>
<body class="">
<div class="container">
{% block header %}
<header class="header">
<div class="header__inner">
<div class="header__logo">
{%- if config.extra.logo_home_link %}
{% set logo_link = config.extra.logo_home_link %}
{% else %}
{% set logo_link = config.base_url %}
{% endif -%}
<a href="{{ logo_link | safe }}" style="text-decoration: none;">
<div class="logo">
{% block logo_content %}
{%- if config.extra.logo_text %}
{{ config.extra.logo_text }}
{% else %}
Terminimal theme
{% endif -%}
{% endblock logo_content %}
</div>
</a>
</div>
</div>
{% block header_menu %}
{{ menu_macros::menu(config=config, current_path=current_path) }}
{% endblock header_menu %}
</header>
{% endblock header %}
<div class="content">
{% block content %}
<div class="posts">
<h2 class="section-title">Open Source Contributions and Projects</h2>
<div class="project-grid">
<a href="https://github.com/loco-rs/loco-openapi-Initializer" class="project-box-link">
<div class="project-box">
<h3 class="post-title">Loco OpenAPI</h3>
<p class="project-tags">Rust</p>
<p>Created an official extension for Loco.rs adding OpenAPI integration</p>
<p>Automatically generates the OpenAPI specification and documentation for the routes</p>
<p>Serves the OpenAPI documentation using either Swagger-ui, Redoc, or Scalar</p>
<span class="view-project">View Source Code →</span>
</div>
</a>
<a href="https://github.com/jupyterlab/jupyterlab/issues?q=state%3Aclosed%20is%3Apr%20author%3A@me%20is%3Amerged" class="project-box-link">
<div class="project-box">
<h3 class="post-title">JupyterLab Contributions</h3>
<p class="project-tags">TypeScript</p>
<p>[#16341] Added button to find/shut down kernels not attached to open notebooks</p>
<p>[#16265] Implemented checkbox to skip kernel restart dialog</p>
<p>[#16208] Fixed cell output area clearing in notebooks</p>
<span class="view-project">View PRs →</span>
</div>
</a>
<a href="https://github.com/loco-rs/loco/issues?q=state%3Aclosed%20is%3Apr%20author%3A@me%20is%3Amerged" class="project-box-link">
<div class="project-box">
<h3 class="post-title">Loco.rs Contributions</h3>
<p class="project-tags">Rust</p>
<p>[#1360] Added YAML response support for routes</p>
<p>[#1093] Enabled parallel test execution, reducing test time by 65-90%</p>
<p>[#1204] Made background worker tests parallel with different database names</p>
<P>+8 more PRs</P>
<span class="view-project">View PRs →</span>
</div>
</a>
<a href="https://nexveridian.com/ARK" class="project-box-link">
<div class="project-box">
<h3 class="post-title">ARK Invest ETF Tracker</h3>
<p class="project-tags">Next.js, TypeScript</p>
<p>Retrieves the data from an API and visualizes it in an interactive chart, showing the holding over time for the ETFs</p>
<span class="view-project">View Project →</span>
</div>
</a>
<a href="https://api.nexveridian.com/" class="project-box-link">
<div class="project-box">
<h3 class="post-title">Ark Invest API Rust</h3>
<p class="project-tags">Rust, Polars, Axum, Redoc</p>
<p>A REST API providing JSON data on the holdings of 25 ETFs, and automatically updates daily</p>
<span class="view-project">View Source Code →</span>
</div>
</a>
<a href="https://github.com/NexVeridian/wikidata-to-surrealdb" class="project-box-link">
<div class="project-box">
<h3 class="post-title">Wikidata To SurrealDB</h3>
<p class="project-tags">Rust</p>
<p>A tool for converting Wikidata BZ2 or JSON data dumps, to a SurrealDB database</p>
<span class="view-project">View Source Code →</span>
</div>
</a>
<a href="https://s.nexveridian.com" class="project-box-link">
<div class="project-box">
<h3 class="post-title">Next Url Shortener</h3>
<p class="project-tags">Next.js, TypeScript</p>
<p>A URL shortener using Next.js server actions, Postgres or SurrealDB, Shadcn/ui, and Tailwind</p>
<span class="view-project">View Project →</span>
</div>
</a>
</div>
<h2 class="section-title">Recent Blog Posts</h2>
<div class="recent-posts">
{% set blog_section = get_section(path="blog/_index.md") %}
{% for page in blog_section.pages | slice(end=2) %}
<div class="post on-list">
{{ post_macros::header(page=page) }}
{{ post_macros::content(page=page, summary=true, show_only_description=page.extra.show_only_description | default(value=true)) }}
</div>
{% endfor %}
<a href="{{ get_url(path="blog") }}" class="view-all">View All Posts →</a>
</div>
</div>
{% endblock content %}
</div>
{% block footer %}
<footer class="footer">
<div class="footer__inner">
{%- if config.extra.copyright_html %}
<div class="copyright copyright--user">{{ config.extra.copyright_html | safe }}</div>
{% else %}
<div class="copyright">
{%- if config.extra.author %}
<span>© {{ date_macros::now_year() }} {{ config.extra.author }}</span>
{% else %}
<span>© {{ date_macros::now_year() }} Powered by <a href="https://www.getzola.org/">Zola</a></span>
{% endif -%}
<span class="copyright-theme">
<span class="copyright-theme-sep">:: </span>
<a href="https://github.com/NexVeridian/NexVeridian-web">Source Code</a>&nbsp;
</span>
<span class="copyright-theme">
<span class="copyright-theme-sep">:: </span>
Theme: <a href="https://github.com/pawroman/zola-theme-terminimal/">Terminimal</a> by pawroman
</span>
</div>
{% endif -%}
</div>
</footer>
{% endblock footer %}
</div>
{%- block extra_body %}
{% endblock extra_body -%}
</body>
</html>

45
templates/section.html Normal file
View file

@ -0,0 +1,45 @@
{% extends "index.html" %}
{% block extra_head %}
<link rel="stylesheet" href="{{ get_url(path="css/custom.css") }}">
{% endblock extra_head %}
{% block content %}
<div class="posts">
<h1 class="post-title">{{ section.title }}</h1>
{%- if paginator %}
{%- set show_pages = paginator.pages -%}
{% else %}
{%- set show_pages = section.pages -%}
{% endif -%}
{%- for page in show_pages %}
<div class="post on-list">
{{ post_macros::header(page=page) }}
{{ post_macros::content(page=page, summary=true, show_only_description=page.extra.show_only_description | default(value=false)) }}
</div>
{% endfor -%}
<div class="pagination">
<div class="pagination__buttons">
{%- if paginator.previous %}
<span class="button previous">
<a href="{{ paginator.previous | safe }}">
<span class="button__icon"></span>&nbsp;
<span class="button__text">Newer posts</span>
</a>
</span>
{% endif -%}
{%- if paginator.next %}
<span class="button next">
<a href="{{ paginator.next | safe }}">
<span class="button__text">Older posts</span>&nbsp;
<span class="button__icon"></span>
</a>
</span>
{% endif -%}
</div>
</div>
</div>
{% endblock content %}

25
templates/tags/list.html Normal file
View file

@ -0,0 +1,25 @@
{% extends "index.html" %}
{%- block title -%}
{{ title_macros::title(page_title="Tags", main_title=config.title) }}
{%- endblock -%}
{% block extra_head %}
<link rel="stylesheet" href="{{ get_url(path="css/custom.css") }}">
{% endblock extra_head %}
{% block content %}
<div class="post">
<h1 class="post-title">all tags</h1>
<ul>
{% for term in terms %}
<li class="tag-list">
<a href="{{ term.permalink | safe }}">
{{ term.name }} ({{ term.pages | length }} post{{ term.pages | length | pluralize }})
</a>
</li>
{% endfor %}
</ul>
</div>
{% endblock content %}

View file

@ -0,0 +1,25 @@
{% extends "index.html" %}
{%- block title -%}
{% set title = "Tag: " ~ term.name %}
{{ title_macros::title(page_title=title, main_title=config.title) }}
{%- endblock -%}
{% block extra_head %}
<link rel="stylesheet" href="{{ get_url(path="css/custom.css") }}">
{% endblock extra_head %}
{% block content %}
<div class="post">
<h1 class="post-title">
tag: #{{ term.name }}
({{ term.pages | length }} post{{ term.pages | length | pluralize }})
</h1>
<a href="{{ config.base_url | safe }}/tags/">
Show all tags
</a>
{{ post_macros::list_posts(pages=term.pages) }}
</div>
{% endblock content %}