diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 0000000..6b573b9 --- /dev/null +++ b/.github/workflows/docker.yml @@ -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 / + 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 diff --git a/.gitignore b/.gitignore index a48cf0d..228c8cc 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ public +result diff --git a/README.md b/README.md new file mode 100644 index 0000000..a587850 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +Source code for NexVeridian.com built using [Zola](https://github.com/getzola/zola) diff --git a/config.toml b/config.toml index dc4c424..b928d65 100644 --- a/config.toml +++ b/config.toml @@ -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 diff --git a/content/_index.md b/content/_index.md index 3511f76..89607c8 100644 --- a/content/_index.md +++ b/content/_index.md @@ -1,4 +1,4 @@ +++ -paginate_by = 3 -sort_by = "date" +title = "NexVeridian" +template = "index.html" +++ diff --git a/content/blog/_index.md b/content/blog/_index.md new file mode 100644 index 0000000..24f9149 --- /dev/null +++ b/content/blog/_index.md @@ -0,0 +1,6 @@ ++++ +title = "Blog" +sort_by = "date" +template = "section.html" +paginate_by = 3 ++++ \ No newline at end of file diff --git a/themes/terminimal/content/welcome-terminimal-theme.md b/content/blog/welcome-terminimal-theme.md similarity index 96% rename from themes/terminimal/content/welcome-terminimal-theme.md rename to content/blog/welcome-terminimal-theme.md index d7bda16..2437fd2 100644 --- a/themes/terminimal/content/welcome-terminimal-theme.md +++ b/content/blog/welcome-terminimal-theme.md @@ -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}!") diff --git a/content/pages/about.md b/content/pages/about.md index ac935cb..6e51fba 100644 --- a/content/pages/about.md +++ b/content/pages/about.md @@ -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) diff --git a/content/pages/archive.md b/content/pages/archive.md index 2c032c0..313c07e 100644 --- a/content/pages/archive.md +++ b/content/pages/archive.md @@ -1,5 +1,5 @@ +++ -title = "Archive" +title = "Blog" path = "archive" template = "archive.html" +++ diff --git a/flake.nix b/flake.nix index fd70a02..2bd8f9f 100644 --- a/flake.nix +++ b/flake.nix @@ -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"; diff --git a/justfile b/justfile index ba3febb..ed849ec 100644 --- a/justfile +++ b/justfile @@ -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 diff --git a/static/css/custom.css b/static/css/custom.css new file mode 100644 index 0000000..01df498 --- /dev/null +++ b/static/css/custom.css @@ -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); +} */ diff --git a/templates/archive.html b/templates/archive.html new file mode 100644 index 0000000..46cf173 --- /dev/null +++ b/templates/archive.html @@ -0,0 +1,19 @@ +{% extends "index.html" %} + +{%- block title -%} +{{ title_macros::title(page_title=page.title, main_title=config.title) }} +{%- endblock -%} + +{% block extra_head %} + +{% endblock extra_head %} + +{% block content %} +
+

{{ page.title }}

+ + {% set blog_section = get_section(path="blog/_index.md") %} + + {{ post_macros::list_posts(pages=blog_section.pages) }} +
+{% endblock content %} \ No newline at end of file diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..2633d78 --- /dev/null +++ b/templates/index.html @@ -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 -%} + + + + + + {%- block title %}{{ config.title }}{% endblock 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') %} + + {%- endif %} + + {%- if feed is containing('rss') %} + + {%- endif %} + + {%- endfor %} + {%- endif -%} + + {%- if config.extra.favicon %} + + {% endif -%} + + {%- block extra_head %} + + {% endblock extra_head -%} + + + +
+ {% block header %} +
+
+ +
+ + {% block header_menu %} + {{ menu_macros::menu(config=config, current_path=current_path) }} + {% endblock header_menu %} +
+ {% endblock header %} + +
+ {% block content %} +
+

Open Source Contributions and Projects

+ +
+ +
+

Loco OpenAPI

+

Rust

+

Created an official extension for Loco.rs adding OpenAPI integration

+

Automatically generates the OpenAPI specification and documentation for the routes

+

Serves the OpenAPI documentation using either Swagger-ui, Redoc, or Scalar

+ View Source Code → +
+
+ + +
+

JupyterLab Contributions

+

TypeScript

+

[#16341] Added button to find/shut down kernels not attached to open notebooks

+

[#16265] Implemented checkbox to skip kernel restart dialog

+

[#16208] Fixed cell output area clearing in notebooks

+ View PRs → +
+
+ + +
+

Loco.rs Contributions

+

Rust

+

[#1360] Added YAML response support for routes

+

[#1093] Enabled parallel test execution, reducing test time by 65-90%

+

[#1204] Made background worker tests parallel with different database names

+

+8 more PRs

+ View PRs → +
+
+ + +
+

ARK Invest ETF Tracker

+

Next.js, TypeScript

+

Retrieves the data from an API and visualizes it in an interactive chart, showing the holding over time for the ETFs

+ View Project → +
+
+ + +
+

Ark Invest API Rust

+

Rust, Polars, Axum, Redoc

+

A REST API providing JSON data on the holdings of 25 ETFs, and automatically updates daily

+ View Source Code → +
+
+ + +
+

Wikidata To SurrealDB

+

Rust

+

A tool for converting Wikidata BZ2 or JSON data dumps, to a SurrealDB database

+ View Source Code → +
+
+ + +
+

Next Url Shortener

+

Next.js, TypeScript

+

A URL shortener using Next.js server actions, Postgres or SurrealDB, Shadcn/ui, and Tailwind

+ View Project → +
+
+
+ +

Recent Blog Posts

+
+ {% set blog_section = get_section(path="blog/_index.md") %} + {% for page in blog_section.pages | slice(end=2) %} +
+ {{ post_macros::header(page=page) }} + {{ post_macros::content(page=page, summary=true, show_only_description=page.extra.show_only_description | default(value=true)) }} +
+ {% endfor %} + View All Posts → +
+
+ {% endblock content %} +
+ + {% block footer %} +
+ +
+ {% endblock footer %} + +
+{%- block extra_body %} +{% endblock extra_body -%} + + + diff --git a/templates/section.html b/templates/section.html new file mode 100644 index 0000000..57c9f4b --- /dev/null +++ b/templates/section.html @@ -0,0 +1,45 @@ +{% extends "index.html" %} + +{% block extra_head %} + +{% endblock extra_head %} + +{% block content %} +
+

{{ section.title }}

+ + {%- if paginator %} + {%- set show_pages = paginator.pages -%} + {% else %} + {%- set show_pages = section.pages -%} + {% endif -%} + + {%- for page in show_pages %} +
+ {{ post_macros::header(page=page) }} + {{ post_macros::content(page=page, summary=true, show_only_description=page.extra.show_only_description | default(value=false)) }} +
+ {% endfor -%} + + +
+{% endblock content %} \ No newline at end of file diff --git a/templates/tags/list.html b/templates/tags/list.html new file mode 100644 index 0000000..d4a7fdc --- /dev/null +++ b/templates/tags/list.html @@ -0,0 +1,25 @@ +{% extends "index.html" %} + +{%- block title -%} +{{ title_macros::title(page_title="Tags", main_title=config.title) }} +{%- endblock -%} + +{% block extra_head %} + +{% endblock extra_head %} + +{% block content %} +
+

all tags

+ + +
+{% endblock content %} \ No newline at end of file diff --git a/templates/tags/single.html b/templates/tags/single.html new file mode 100644 index 0000000..1298741 --- /dev/null +++ b/templates/tags/single.html @@ -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 %} + +{% endblock extra_head %} + +{% block content %} +
+

+ tag: #{{ term.name }} + ({{ term.pages | length }} post{{ term.pages | length | pluralize }}) +

+ + + Show all tags + + + {{ post_macros::list_posts(pages=term.pages) }} +
+{% endblock content %} \ No newline at end of file