~ajhalili2006's personal website, built with Zensical (successor of Material for Mkdocs) [old repo name got bugged while attempting to do manual knot migration via repo deletion] andreijiroh.dev
zensical mkdocs-material website

Compare changes

Choose any two refs to compare.

+97
.github/copilot-instructions.md
···
+
# GitHub Copilot / AI agent instructions
+
+
Purpose: help an AI coding agent be immediately productive in this repository.
+
+
- Big picture
+
- Static site built with MkDocs + Material theme. Sources live in `markdown/`; generated site is written to `public/` ([mkdocs.yml](mkdocs.yml)).
+
- Theme customizations and build hooks are in `overrides/` (Python hooks + theme assets).
+
- A parallel Gemini site lives in `gmi/` (different format, separate publishing flow).
+
- Cloudflare Pages / Workers integration: see `wrangler.jsonc` (publishes assets from `public/`).
+
+
- Key workflows (concrete commands)
+
- Install dependencies (preferred): `pipenv install` (or `pip install -r requirements.txt`). See [Pipfile](Pipfile) and [requirements.txt](requirements.txt).
+
- Local preview: `mkdocs serve --watch overrides --watch-theme --livereload` or `pipenv run dev` (see `Pipfile` scripts and [mkdocs.yml](mkdocs.yml)).
+
- Build site: `pipenv run build` or `pipenv run build -f mkdocs.readthedocs.yml` (build targets in `Pipfile` and `build.sh`). `build.sh` copies favicon into `public/` after build.
+
- Cloudflare deploy (manual): `npm run deploy` -> `wrangler deploy` (see `package.json` and [wrangler.jsonc](wrangler.jsonc)). CI deploy logic uses `npx wrangler pages publish` in `bin/deploy.sh` when running under CI.
+
- CI: deployments happen via GitLab CI; do not rely on a repository-local Docker CI image.
+
+
- Project-specific conventions & patterns
+
- Content separation: author-managed Markdown in `markdown/` is canonical. Do not edit `public/` โ€” it is generated.
+
- Theme overrides and custom assets live in `overrides/`; changes there affect build behavior and the site theme.
+
- The build copies `assets/images/favicon.png` to `public/favicon.ico` after building (see `build.sh` and `bin/build.sh`). Keep favicon at that path.
+
- Python environment targets Python 3.13 (see `Pipfile`). The repo commonly uses `pipenv` and a `.venv` pattern in local scripts (`bin/localdev.sh`).
+
- CI: deployments happen via GitLab CI and `bin/deploy.sh` (see `wrangler.jsonc` for Cloudflare Pages configuration).
+
+
- Integration points & external dependencies
+
- Cloudflare Pages / Workers via `wrangler`/`wrangler.jsonc` (assets directory: `./public`).
+
- CI builds run on GitLab. Avoid referencing the `docker/` folder โ€” it may be moved to a separate repo.
+
- `npm` is used only for `wrangler` dev/deploy and Docker convenience scripts (`package.json`).
+
+
- Helpful files to inspect
+
- Repository README: [README.md](README.md)
+
- MkDocs config: [mkdocs.yml](mkdocs.yml)
+
- Build scripts: [build.sh](build.sh) and [bin/build.sh](bin/build.sh)
+
- CI/deploy: [bin/deploy.sh](bin/deploy.sh) and [wrangler.jsonc](wrangler.jsonc)
+
- Python deps: [Pipfile](Pipfile) and [requirements.txt](requirements.txt)
+
-
+
+
- What NOT to do
+
- Do not edit generated files under `public/` directly โ€” change sources in `markdown/` or `overrides/`.
+
- Avoid changing `site_dir` or `assets` layout without verifying `wrangler.jsonc` and `bin/deploy.sh` updates.
+
+
- If you need clarification
+
- Ask the maintainer which mirror/CI (GitLab primary) you want to target before modifying CI configs.
+
+
- Next steps
+
- If you want, I can expand the CI section with example GitLab job snippets or add examples for contributing patches.
+
+
- Commit attribution
+
- Adopt the `Assisted-by` commit trailer for AI-assisted changes to comply with attribution policies.
+
- Required trailer format (commit footer):
+
+
```
+
Assisted-by: <Model Name> via <Tool Name>
+
```
+
+
- Example:
+
+
```
+
Assisted-by: GLM 4.6 via Claude Code
+
```
+
+
- Repository also requires Linux DCO sign-off for patches. Ensure commits include `Signed-off-by:` lines in the footer alongside `Assisted-by:` when applicable.
+
+
If any section is unclear or you want deeper examples (e.g., contributing workflow, CI job templates), tell me which area to expand.
+
+
- Example: GitLab CI snippet
+
- Minimal job that builds the site and publishes to Cloudflare Pages using `wrangler`.
+
+
```yaml
+
stages:
+
- build
+
- deploy
+
+
build_site:
+
stage: build
+
image: node:20-bullseye
+
script:
+
- pip install pipenv
+
- pipenv install --deploy --ignore-pipfile
+
- pipenv run build
+
artifacts:
+
paths:
+
- public/
+
+
publish_pages:
+
stage: deploy
+
image: node:20-bullseye
+
dependencies:
+
- build_site
+
script:
+
- npm install -g wrangler
+
- npx wrangler pages publish public --project-name "$CF_PAGES_PROJECT_NAME" --branch "$CI_COMMIT_BRANCH"
+
only:
+
- main
+
```
+
+
- Notes: set `CF_PAGES_PROJECT_NAME` in CI variables; the repo's `bin/deploy.sh` also contains an example `npx wrangler pages publish` invocation used by CI.
+34
.github/workflows/copilot-setup-steps.yml
···
+
name: "Copilot Setup Steps"
+
+
# Automatically run the setup steps when they are changed to allow for easy validation, and
+
# allow manual testing through the repository's "Actions" tab
+
on:
+
workflow_dispatch:
+
push:
+
paths:
+
- .github/workflows/copilot-setup-steps.yml
+
pull_request:
+
paths:
+
- .github/workflows/copilot-setup-steps.yml
+
+
jobs:
+
# The job MUST be called `copilot-setup-steps` or it will not be picked up by Copilot.
+
copilot-setup-steps:
+
runs-on: ubuntu-latest
+
+
# Set the permissions to the lowest permissions possible needed for your steps.
+
# Copilot will be given its own token for its operations.
+
permissions:
+
# If you want to clone the repository as part of your setup steps, for example to install dependencies, you'll need the `contents: read` permission. If you don't clone the repository in your setup steps, Copilot will do this for you automatically after the steps complete.
+
contents: read
+
+
# You can define any steps you want, and they will run before the agent starts.
+
# If you do not check out your code, Copilot will do this for you.
+
steps:
+
- name: Checkout code
+
uses: actions/checkout@v5
+
+
- name: Setup Deterinate Nix
+
uses: DeterminateSystems/nix-installer-action@main
+
with:
+
determinate: true
+8 -2
.gitlab-ci.yml
···
# The Docker image that will be used to build your app
image:
-
name: ghcr.io/cachix/devenv/devenv:latest
+
name: "$CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX/nixos/nix:latest"
+
entrypoint:
+
- /nix/store/smkzrg2vvp3lng3hq7v9svfni5mnqjh2-bash-interactive-5.2p37/bin/bash
stages:
- test
- build
default:
before_script:
-
- nix profile install nixpkgs#curl nixpkgs#gitFull nixpkgs#which nixpkgs#ncurses --experimental-features "nix-command flakes" -vv --show-trace
+
- echo "experimental-features = nix-command flakes" >> /etc/nix/nix.conf
+
- nix profile remove git-minimal
+
- nix profile install nixpkgs#curl nixpkgs#gitFull nixpkgs#which nixpkgs#ncurses nixpkgs#devenv -vv --show-trace
- devenv shell echo "trigger install"
- curl --silent "https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/download-secure-files/-/raw/main/installer" | bash
···
#FF_GIT_COMMITTERS_API: "true"
SECURE_FILES_DOWNLOAD_PATH: .secretskit
GIT_DEPTH: "0"
+
# ignore pipfile and rely on the lockfile for deterministic builds
+
PIPENV_IGNORE_PIPFILE: "true"
# dotenvx stuff
DOTENV_PRIVATE_KEY: $DOTENV_PRIVATE_KEY_CI
MKDOCS_GIT_COMMITTERS_PLUGIN_TOKEN: $CI_JOB_TOKEN
+56
.tangled/workflows/site-deploy.yml
···
+
# This is a minimal Tangled Spindle workflow file for deploying a static site
+
# to Cloudflare Pages/Workers Static Sites. Secret management is handled via
+
# Doppler (setting the DOPPLER_TOKEN secret on repo settings -> spindle is required).
+
when:
+
- event: ["push", "manual"]
+
branch: ["main"]
+
+
engine: nixery
+
+
clone:
+
depth: 500
+
submodules: true
+
+
# sync this with devenv.nix + devenv.yaml (if applicable for additional flakes
+
# alongside the default nixpkgs) for consistency
+
dependencies:
+
nixpkgs:
+
- python314
+
- pipenv
+
- nodejs_22
+
- doppler
+
- cairo
+
- pango
+
- gdk-pixbuf
+
- librsvg
+
- fontconfig
+
- freetype
+
- libffi
+
- libjpeg
+
- zlib
+
- pngquant
+
# needed to generate LD_LIBRARY_PATH for cairo and friends
+
- findutils
+
- coreutils
+
+
environment:
+
CI: "true" # https://tangled.org/tangled.org/core/issues/310 (resolved via merging https://tangled.org/tangled.org/core/pulls/843)
+
# GitLab CI compatibility for some of our scripts that check these variables (for branch names
+
# and commit hashes, we simply use `git rev-parse` directly)
+
CI_PIPELINE_SOURCE: "push"
+
# technically we have --ingore-pipfile in the install command below, but just to be safe
+
PIPENV_IGNORE_PIPFILE: "true"
+
+
steps:
+
- name: Install deps
+
command: |
+
pipenv install --deploy --ignore-pipfile
+
npm ci
+
# We configured our wrangler.toml to use our build script (at ../../bin/build.sh)
+
# for building the site and doing post-build prep (like copying well-known files
+
# and such). To minimize admin overhead on secrets management, we use `doppler run`
+
# to inject secrets from Doppler into the environment for the build and deploy steps.
+
- name: Deploy to Cloudflare Workers (as Static Site)
+
command: |
+
export LD_LIBRARY_PATH=$(find /nix/store -maxdepth 3 -type d -name lib | grep -E 'cairo|pango|gdk-pixbuf|librsvg|fontconfig|freetype|zlib' | tr '\n' ':')
+
doppler run -- npm run deploy:cf
+2 -2
.tool-versions
···
-
python 3.12.3
-
nodejs 22.8.0
+
python 3.14.0
+
nodejs 22.21.1
+8 -1
Pipfile
···
[dev-packages]
[requires]
-
python_version = "3.13"
+
python_version = "3.14"
[scripts]
dev = "mkdocs serve --watch overrides --watch-theme"
build = "mkdocs build -d public --verbose"
build-staging = "pipenv run build -f mkdocs.readthedocs.yml --verbose"
+
# next under zensical
+
next-dev = "zensical serve"
+
next-build = "zensical build"
+
# legacy builds under mkdocs
+
legacy-build = "mkdocs build -d public --verbose"
+
legacy-build-staging = "pipenv run build -f mkdocs.readthedocs.yml --verbose"
+
legacy-dev = "mkdocs serve --watch overrides --watch-theme"
+55 -55
Pipfile.lock
···
{
"_meta": {
"hash": {
-
"sha256": "21bc35e4a60508ada7a4d1d46af7744213b9370926f34e073458dd8fb13ee997"
+
"sha256": "a54f862fd105133810703030592c31182334be6733f29a2b959e3d75ef3993dc"
},
"pipfile-spec": 6,
"requires": {
-
"python_version": "3.13"
+
"python_version": "3.14"
},
"sources": [
{
···
},
"backrefs": {
"hashes": [
-
"sha256:6907635edebbe9b2dc3de3a2befff44d74f30a4562adbb8b36f21252ea19c5cf",
-
"sha256:7fdf9771f63e6028d7fee7e0c497c81abda597ea45d6b8f89e8ad76994f5befa",
-
"sha256:808548cb708d66b82ee231f962cb36faaf4f2baab032f2fbb783e9c2fdddaa59",
-
"sha256:cc37b19fa219e93ff825ed1fed8879e47b4d89aa7a1884860e2db64ccd7c676b",
-
"sha256:db8e8ba0e9de81fcd635f440deab5ae5f2591b54ac1ebe0550a2ca063488cd9f",
-
"sha256:df5e169836cc8acb5e440ebae9aad4bf9d15e226d3bad049cf3f6a5c20cc8dc9",
-
"sha256:f48ee18f6252b8f5777a22a00a09a85de0ca931658f1dd96d4406a34f3748c60"
+
"sha256:13eafbc9ccd5222e9c1f0bec563e6d2a6d21514962f11e7fc79872fd56cbc853",
+
"sha256:2a2ccb96302337ce61ee4717ceacfbf26ba4efb1d55af86564b8bbaeda39cac1",
+
"sha256:3bba1749aafe1db9b915f00e0dd166cba613b6f788ffd63060ac3485dc9be231",
+
"sha256:4c9d3dc1e2e558965202c012304f33d4e0e477e1c103663fd2c3cc9bb18b0d05",
+
"sha256:a9e99b8a4867852cad177a6430e31b0f6e495d65f8c6c134b68c14c3c95bf4b0",
+
"sha256:c64698c8d2269343d88947c0735cb4b78745bd3ba590e10313fbf3f78c34da5a",
+
"sha256:e82bba3875ee4430f4de4b6db19429a27275d95a5f3773c57e9e18abc23fd2b7"
],
"markers": "python_version >= '3.9'",
-
"version": "==5.9"
+
"version": "==6.1"
},
"cachecontrol": {
"extras": [
"filecache"
],
"hashes": [
-
"sha256:73e7efec4b06b20d9267b441c1f733664f989fb8688391b670ca812d70795d11",
-
"sha256:b35e44a3113f17d2a31c1e6b27b9de6d4405f84ae51baa8c1d3cc5b633010cae"
+
"sha256:b7ac014ff72ee199b5f8af1de29d60239954f223e948196fa3d84adaffc71d2b",
+
"sha256:e6220afafa4c22a47dd0badb319f84475d79108100d04e26e8542ef7d3ab05a1"
],
-
"markers": "python_version >= '3.9'",
-
"version": "==0.14.3"
+
"markers": "python_version >= '3.10'",
+
"version": "==0.14.4"
},
"cairocffi": {
"hashes": [
···
},
"certifi": {
"hashes": [
-
"sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de",
-
"sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43"
+
"sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b",
+
"sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316"
],
"markers": "python_version >= '3.7'",
-
"version": "==2025.10.5"
+
"version": "==2025.11.12"
},
"cffi": {
"hashes": [
···
},
"mkdocs-git-revision-date-localized-plugin": {
"hashes": [
-
"sha256:056c0a90242409148f1dc94d5c9d2c25b5b8ddd8de45489fa38f7fa7ccad2bc4",
-
"sha256:10a49eff1e1c3cb766e054b9d8360c904ce4fe8c33ac3f6cc083ac6459c91953"
+
"sha256:17345ccfdf69a1905dc96fb1070dce82d03a1eb6b0d48f958081a7589ce3c248",
+
"sha256:933f9e35a8c135b113f21bb57610d82e9b7bcc71dd34fb06a029053c97e99656"
],
"index": "pypi",
-
"markers": "python_version >= '3.8'",
-
"version": "==1.4.7"
+
"markers": "python_version >= '3.9'",
+
"version": "==1.5.0"
},
"mkdocs-material": {
"hashes": [
-
"sha256:14ac5f72d38898b2f98ac75a5531aaca9366eaa427b0f49fc2ecf04d99b7ad84",
-
"sha256:87c158b0642e1ada6da0cbd798a3389b0bc5516b90e5ece4a0fb939f00bacd1c"
+
"sha256:602b359844e906ee402b7ed9640340cf8a474420d02d8891451733b6b02314ec",
+
"sha256:da2866ea53601125ff5baa8aa06404c6e07af3c5ce3d5de95e3b52b80b442887"
],
"index": "pypi",
"markers": "python_version >= '3.8'",
-
"version": "==9.6.22"
+
"version": "==9.7.0"
},
"mkdocs-material-extensions": {
"hashes": [
···
},
"mkdocs-rss-plugin": {
"hashes": [
-
"sha256:c05fdb5a63fdf396f8d05169e45a08388abc3eb6f55ca4d23682039aad0cce50",
-
"sha256:cfd42d250cbf7a73b006cbe291eedb29d32d4d8bf803f7da0e7a98bedcda2ac3"
+
"sha256:17b7b78c2c0b6418b83644b701867d5b2c48ecf069609917250b829bd4c3a718",
+
"sha256:6903f85e75ee976ae5f21eb05a54fa4d848bc246a227523945eaf6be7580c930"
],
"index": "pypi",
-
"markers": "python_version >= '3.9' and python_version < '4'",
-
"version": "==1.17.4"
+
"markers": "python_version >= '3.10'",
+
"version": "==1.17.7"
},
"msgpack": {
"hashes": [
···
},
"platformdirs": {
"hashes": [
-
"sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312",
-
"sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3"
+
"sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda",
+
"sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31"
],
"markers": "python_version >= '3.10'",
-
"version": "==4.5.0"
+
"version": "==4.5.1"
},
"pycparser": {
"hashes": [
···
},
"pymdown-extensions": {
"hashes": [
-
"sha256:26bb3d7688e651606260c90fb46409fbda70bf9fdc3623c7868643a1aeee4713",
-
"sha256:bffae79a2e8b9e44aef0d813583a8fea63457b7a23643a43988055b7b79b4992"
+
"sha256:090bca72be43f7d3186374e23c782899dbef9dc153ef24c59dcd3c346f9ffcae",
+
"sha256:20252abe6367354b24191431617a072ee6be9f68c5afcc74ea5573508a61f9e5"
],
"markers": "python_version >= '3.9'",
-
"version": "==10.17.2"
+
"version": "==10.18"
},
"python-dateutil": {
"hashes": [
···
},
"tinycss2": {
"hashes": [
-
"sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7",
-
"sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289"
+
"sha256:3415ba0f5839c062696996998176c4a3751d18b7edaaeeb658c9ce21ec150661",
+
"sha256:d339d2b616ba90ccce58da8495a78f46e55d4d25f9fd71dfd526f07e7d53f957"
],
-
"markers": "python_version >= '3.8'",
-
"version": "==1.4.0"
+
"markers": "python_version >= '3.10'",
+
"version": "==1.5.1"
},
"urllib3": {
"hashes": [
-
"sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760",
-
"sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"
+
"sha256:5379eb6e1aba4088bae84f8242960017ec8d8e3decf30480b3a1abdaa9671a3f",
+
"sha256:e67d06fe947c36a7ca39f4994b08d73922d40e6cca949907be05efa6fd75110b"
],
"markers": "python_version >= '3.9'",
-
"version": "==2.5.0"
+
"version": "==2.6.1"
},
"watchdog": {
"hashes": [
···
},
"zensical": {
"hashes": [
-
"sha256:11e9acdfd6622dc43862c99e4669ebe56f4e7ab2cefe73a74005549a09ac679e",
-
"sha256:3fc7e47efbd90f476276492049ade0587f32f95216062ed4ecc02857f2cbca39",
-
"sha256:5bd06c9a1fb536e23cf6f5acb83af492a0aaf457708a81589731a33ab1695a1e",
-
"sha256:64f208a3168eb616985680e84a76ca2dbf0064508c4ce8655f7fd81db10636aa",
-
"sha256:679d32bceac749a79ef11c08e5c0eb7c3e8e73f4c35732a2f6bcaa3ffaa61a70",
-
"sha256:95a91f13920975fc9744f052c028800e0b0553f52c9417bef8a6e16864459bd8",
-
"sha256:9a9b60a3757fb0f4cf2ec33844bf29141f02223e99440698cfb6911bb1f49956",
-
"sha256:a22908517458428bd91adfbcf4813c7b63011cd1b6761956f81255993d903ae7",
-
"sha256:a482443e7aded812c3e72250f2ba8b4e77f09a626c1c9892766168dd2acf8dfd",
-
"sha256:bd6c4447aaa58e2545c3b7a5d39fa1f5a0e9062f1a2d380c3c21aac0a8979b5a",
-
"sha256:d371c9ff57cb2dc8d3b7ec630d4cf0ffa4cba3b414619c4975eb801a032105c0",
-
"sha256:db42271a085bf8efe2d6dc9f97325e866fcfa2fafe7e079c5bc0f0e8407275fa",
-
"sha256:feaab818c28170a8b542f729c2941c2a766d7026d24bcf13b403f843250fa15b"
+
"sha256:0ef33bf2efdb66e444bb59aff134729ba83b271c2ee034063289cdb5e76b7947",
+
"sha256:1744f743d69aa9745570499392ca81962885b90700569ea4564858d01200b1c7",
+
"sha256:32ea5a572473d0f3187d8abeeb6b1a55acd1b09bfecb153820b57a41232b3109",
+
"sha256:4c048779787ebcbdf01c15c69287ca5add5f8661c860ea6302c1ad45606e4b5f",
+
"sha256:8df38c0538eb763a3b3d42f1d179927c0e9b8deec365ff016c00ca71ae287bce",
+
"sha256:bab3897bb3bf4d3fd81234640590888e95bd7f49070f840e5817b67b25d9cf2f",
+
"sha256:bc672c3d986829add78e2c8bd0e50dd091ae93c9b7144a9ae02908aea63bb601",
+
"sha256:bdb776ba9257a0f2a991ce5bd82110a0ca44dfe4342abc545b1e8add12de1ba5",
+
"sha256:bfd215bd14724d63e37eff2f0984517b997616cf1fd68059d7c41edfeb695dd3",
+
"sha256:d7a206c22ac66bbe885a04a5efa27610c5cc4899c78df1f7e8e9a36d298ec14b",
+
"sha256:e4bfbc6cc80e3c927d4372bb005460fd731a71966dec3a5e4f61f5aeccb86cc5",
+
"sha256:e5c883eaabe82ce733e3a653a28afa901e529574c93a0a51ed2e52801ef064ed",
+
"sha256:fb61bd1d3d864bb36caa277b59c4bcf4431fbd6d8d2914a6b0bb1281f6259e5f"
],
"index": "pypi",
"markers": "python_version >= '3.10'",
-
"version": "==0.0.10"
+
"version": "==0.0.11"
},
"develop": {}
+11 -3
bin/build.sh
···
#!/usr/bin/env bash
set -ex
-
TARGET_DIR="${PWD}/public"
-
pipenv run build
+
GIT_ROOT=$(git rev-parse --show-toplevel)
+
SOURCE_DIR="${GIT_ROOT}/markdown"
+
TARGET_DIR="${GIT_ROOT}/public"
+
+
if [[ $SKIP_BUILD == "" ]]; then
+
pipenv run build
+
else
+
echo "Skipping build step"
+
fi
+
cp "$TARGET_DIR/assets/images/favicon.png" "$TARGET_DIR/favicon.ico" -v
-
#cp "$SOURCE_DIR/.well-known" "$TARGET_DIR/" -rv
+
cp "$SOURCE_DIR/.well-known" "$TARGET_DIR/" -rv
+2 -2
bin/deploy.sh
···
}
if [[ $CI == "true" ]]; then
-
info "Deploying to Cloudflare Pages"
+
info "Deploying to Cloudflare Workers"
if [[ $CI_PIPELINE_SOURCE == "push" || $CI_PIPELINE_SOURCE == "web" ]] && [[ $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH ]]; then
-
npx wrangler pages publish ${_root_directory_git}/public --project-name ${CF_PAGES_PROJECT_NAME:-"ajhalili2006"} --branch main
+
npx wrangler deploy
fi
fi
+23
bin/sign-sectxt.sh
···
+
#!/usr/bin/env bash
+
# SPDX-License-Identifier: MPL-2.0
+
# Helper script to cryptographically sign security.txt with GPG and SSH keys.
+
+
GPG_KEY_ID="0x67BFC91B3DA12BE8"
+
SSH_KEY_PATH="$HOME/.ssh/personal-2022"
+
GIT_ROOT=$(git rev-parse --show-toplevel)
+
+
if [ ! -f "$SSH_KEY_PATH" ]; then
+
echo "SSH key not found at $SSH_KEY_PATH"
+
exit 1
+
fi
+
+
# Use --clearsign for cleartext signature and --local-user for key specification
+
# Output to security.txt so it can be served and signed by SSH
+
gpg --local-user "$GPG_KEY_ID" --clearsign --yes \
+
--output "$GIT_ROOT/markdown/.well-known/security.txt.asc" \
+
"$GIT_ROOT/markdown/.well-known/security.txt"
+
+
# ssh-keygen prompts before overwriting, so remove the old signature first
+
rm -f "$GIT_ROOT/markdown/.well-known/security.txt.sig"
+
ssh-keygen -Y sign -n file -f "$SSH_KEY_PATH" \
+
"$GIT_ROOT/markdown/.well-known/security.txt"
-1
build.sh
···
-
bin/build.sh
+52 -17
devenv.lock
···
"devenv": {
"locked": {
"dir": "src/modules",
-
"lastModified": 1759936850,
+
"lastModified": 1764927628,
"owner": "cachix",
"repo": "devenv",
-
"rev": "ab228ad83419185654869e2e7ef3de84935be669",
+
"rev": "247d7027f91368054fb0eefbd755a73d42b66fee",
"type": "github"
},
"original": {
···
"flake-compat": {
"flake": false,
"locked": {
-
"lastModified": 1747046372,
+
"lastModified": 1765121682,
"owner": "edolstra",
"repo": "flake-compat",
-
"rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885",
+
"rev": "65f23138d8d09a92e30f1e5c87611b23ef451bf3",
"type": "github"
},
"original": {
···
"flake-compat_2": {
"flake": false,
"locked": {
-
"lastModified": 1747046372,
+
"lastModified": 1765121682,
"owner": "edolstra",
"repo": "flake-compat",
-
"rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885",
+
"rev": "65f23138d8d09a92e30f1e5c87611b23ef451bf3",
"type": "github"
},
"original": {
···
]
},
"locked": {
-
"lastModified": 1759523803,
+
"lastModified": 1765016596,
"owner": "cachix",
"repo": "git-hooks.nix",
-
"rev": "cfc9f7bb163ad8542029d303e599c0f7eee09835",
+
"rev": "548fc44fca28a5e81c5d6b846e555e6b9c2a5a3c",
"type": "github"
},
"original": {
···
]
},
"locked": {
-
"lastModified": 1709087332,
+
"lastModified": 1762808025,
"owner": "hercules-ci",
"repo": "gitignore.nix",
-
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
+
"rev": "cb5e3fdca1de58ccbc3ef53de65bd372b48f567c",
"type": "github"
},
"original": {
···
"type": "github"
}
},
+
"mk-shell-bin": {
+
"locked": {
+
"lastModified": 1677004959,
+
"owner": "rrbutani",
+
"repo": "nix-mk-shell-bin",
+
"rev": "ff5d8bd4d68a347be5042e2f16caee391cd75887",
+
"type": "github"
+
},
+
"original": {
+
"owner": "rrbutani",
+
"repo": "nix-mk-shell-bin",
+
"type": "github"
+
}
+
},
+
"nix2container": {
+
"inputs": {
+
"nixpkgs": [
+
"nixpkgs"
+
]
+
},
+
"locked": {
+
"lastModified": 1761716996,
+
"owner": "nlewo",
+
"repo": "nix2container",
+
"rev": "e5496ab66e9de9e3f67dc06f692dfbc471b6316e",
+
"type": "github"
+
},
+
"original": {
+
"owner": "nlewo",
+
"repo": "nix2container",
+
"type": "github"
+
}
+
},
"nixpkgs": {
"locked": {
-
"lastModified": 1759632233,
-
"narHash": "sha256-krgZxGAIIIKFJS+UB0l8do3sYUDWJc75M72tepmVMzE=",
-
"rev": "d7f52a7a640bc54c7bb414cca603835bf8dd4b10",
-
"revCount": 871443,
+
"lastModified": 1764611609,
+
"narHash": "sha256-yU9BNcP0oadUKupw0UKmO9BKDOVIg9NStdJosEbXf8U=",
+
"rev": "8c29968b3a942f2903f90797f9623737c215737c",
+
"revCount": 905078,
"type": "tarball",
-
"url": "https://api.flakehub.com/f/pinned/DeterminateSystems/nixpkgs-weekly/0.1.871443%2Brev-d7f52a7a640bc54c7bb414cca603835bf8dd4b10/0199bd2b-6c92-7223-94cf-69e43f5561ee/source.tar.gz"
+
"url": "https://api.flakehub.com/f/pinned/DeterminateSystems/nixpkgs-weekly/0.1.905078%2Brev-8c29968b3a942f2903f90797f9623737c215737c/019add91-3add-7a0d-8a25-9569cbe01efe/source.tar.gz"
},
"original": {
"type": "tarball",
···
]
},
"locked": {
-
"lastModified": 1759888105,
+
"lastModified": 1765052656,
"owner": "cachix",
"repo": "nixpkgs-python",
-
"rev": "4c568014f7408f7546461b25bb8a3511eab02bec",
+
"rev": "04b27dbad2e004cb237db202f21154eea3c4f89f",
"type": "github"
},
"original": {
···
"inputs": {
"devenv": "devenv",
"git-hooks": "git-hooks",
+
"mk-shell-bin": "mk-shell-bin",
+
"nix2container": "nix2container",
"nixpkgs": "nixpkgs",
"nixpkgs-python": "nixpkgs-python",
"pre-commit-hooks": [
+7 -5
devenv.nix
···
{ pkgs, lib, ... }: {
+
name = "site";
+
packages = with pkgs; [
gitFull
pipenv
···
};
python = {
enable = true;
-
version = "3.13.3";
+
version = "3.14.0";
};
};
-
enterShell = ''
-
pipenv install
-
npm install
-
'';
+
#enterShell = ''
+
# pipenv install
+
# npm install
+
#'';
tasks = {
"site:build".exec = "pipenv run build";
+9 -4
devenv.yaml
···
inputs:
+
mk-shell-bin:
+
url: github:rrbutani/nix-mk-shell-bin
+
nix2container:
+
url: github:nlewo/nix2container
+
inputs:
+
nixpkgs:
+
follows: nixpkgs
+
nixpkgs:
+
url: https://flakehub.com/f/DeterminateSystems/nixpkgs-weekly/*.tar.gz
nixpkgs-python:
url: github:cachix/nixpkgs-python
inputs:
nixpkgs:
follows: nixpkgs
-
nixpkgs:
-
url: https://flakehub.com/f/DeterminateSystems/nixpkgs-weekly/*.tar.gz
-
-
# If you're using non-OSS software, you can set allowUnfree to true.
allowUnfree: true
+16 -25
markdown/.well-known/security.txt
···
-
-----BEGIN PGP SIGNED MESSAGE-----
-
Hash: SHA512
+
# You are viewing the original unsigned security.txt file. For the
+
# cryptographically signed versions, append either one of the following
+
# to access the signatures and verify yourself via ssh-keygen or gpg.
+
#
+
# - .asc - cleartext PGP signed message
+
# - .sig - ssh-keygen signature (use "file" as namespace when
+
# verifying with my SSH pubkeys at /keys/ssh/main-2022.pub)
+
#
+
# Learn more: https://andreijiroh.dev/keys or https://wiki.andreijiroh.dev/go/encrypted-comms
# Canonical URI
-
Canonical: https://andreijiroh.eu.org/.well-known/security.txt
+
Canonical: https://andreijiroh.dev/.well-known/security.txt
# Contact details
-
Contact: mailto:ajhalili2006@andreijiroh.eu.org
-
Contact: https://andreijiroh.eu.org/contact/security
+
Contact: mailto:ajhalili2006@andreijiroh.dev
+
Contact: https://andreijiroh.dev/contact/security
Contact: https://keybase.io/ajhalili2006
Preferred-Languages: en
# Use my PGP keys on the website or at Keybase
Encryption: https://keybase.io/ajhalili2006/pgp_keys.asc
-
Encryption: https://andreijiroh.eu.org/keys/pgp.asc
+
Encryption: https://andreijiroh.dev/keys/pgp.asc
# Security Policy and acknowledgments
-
Policy: https://andreijiroh.eu.org/security
-
Acknowledgments: https://andreijiroh.eu.org/security/#thanks
+
Policy: https://andreijiroh.dev/security
+
Acknowledgments: https://andreijiroh.dev/security/#thanks
-
Expires: 2024-09-26T15:59:00.000Z
-
-----BEGIN PGP SIGNATURE-----
-
-
iQIzBAEBCgAdFiEETV5jF1jLnMRZQbHOZ7/JGz2hK+gFAmUYYfQACgkQZ7/JGz2h
-
K+iMzxAA61jw4SFVKroBHkO/uGThq1wWLPNRDchc1Fx6vQh6Z9TKCYNMgZ3T/Btn
-
ILZLg/R1lsgylOJdJihesYKFrVTMO3nxdptTSwh9I5avxCEHf8zn3LEHOSMdhO8O
-
u3cPHIvFw/EVTgdkYAj6UvzI9K9I+L7DaqEb5fOUuBXeQS/DQuvEs9nceCFEkQcq
-
pjAWjlLHO/ZrKgNRMgVZ+t8a/nxWXRBa7Y17hii9WxkgrMcnmFpius/U0yjn2ax0
-
gbYic/VesjVq67i4DaxmQNgGmZvvuIXyjyVJvVyUlSmBNj68gRd5vOx0XiEwtaIt
-
R/6YWSmVRGo3HuXwqX6LIjdyOEc9gv0TxozKIO3KzRYg44drhtt8PDK24+/KBXMn
-
xmE0InhF9Y5DCZDEfZ3g1IIlHxcfXnNKpbD7QAVv+J89rgn79jcsVPyVvGigkijH
-
LogCG6a9yvvOp6aK+EwioCh0F/f5ABTqZOzA6ZmVjO4xdrKmiQPbw/gSSzoT6SVL
-
fbGj7+n9KI+Fv+9nfeRTnL+lbwAh4cwSuIt8rdHMvQhFCvGCSUwqRRIEiKUD+X21
-
dKGt1Z52ySC8nuNfstg+MtspTv6X+Rz1XI1a26UMjYzBZIty+ZblM8YJkv7Cm34N
-
C/2qcB4pxMJsaEcrvpkUnhQZe30cLw0yjRQj6C0uggfLQMru1PI=
-
=xIeM
-
-----END PGP SIGNATURE-----
+
Expires: 2026-12-31T23:59:59.999Z
+49
markdown/.well-known/security.txt.asc
···
+
-----BEGIN PGP SIGNED MESSAGE-----
+
Hash: SHA512
+
+
# You are viewing the original unsigned security.txt file. For the
+
# cryptographically signed versions, append either one of the following
+
# to access the signatures and verify yourself via ssh-keygen or gpg.
+
#
+
# - .asc - cleartext PGP signed message
+
# - .sig - ssh-keygen signature (use "file" as namespace when
+
# verifying with my SSH pubkeys at /keys/ssh/main-2022.pub)
+
#
+
# Learn more: https://andreijiroh.dev/keys or https://wiki.andreijiroh.dev/go/encrypted-comms
+
+
# Canonical URI
+
Canonical: https://andreijiroh.dev/.well-known/security.txt
+
+
# Contact details
+
Contact: mailto:ajhalili2006@andreijiroh.dev
+
Contact: https://andreijiroh.dev/contact/security
+
Contact: https://keybase.io/ajhalili2006
+
+
Preferred-Languages: en
+
+
# Use my PGP keys on the website or at Keybase
+
Encryption: https://keybase.io/ajhalili2006/pgp_keys.asc
+
Encryption: https://andreijiroh.dev/keys/pgp.asc
+
+
# Security Policy and acknowledgments
+
Policy: https://andreijiroh.dev/security
+
Acknowledgments: https://andreijiroh.dev/security/#thanks
+
+
Expires: 2026-12-31T23:59:59.999Z
+
+
-----BEGIN PGP SIGNATURE-----
+
+
iQIzBAEBCgAdFiEETV5jF1jLnMRZQbHOZ7/JGz2hK+gFAmk2kg4ACgkQZ7/JGz2h
+
K+iiKxAAz1lae2bTPE6bkTcg4LfHINkenopH2ji/2nwickjXaaC4OZe48CcrKmK/
+
TAV74/yNncAUYkifji58YXXZvyDeLoDdCTM5TudkTYtxc3iL3k8QaOgZ+3il5NAE
+
NtnRwC86RaUuLsDWGcEOqNiJvcMMEWuqJrDgNyFrF+XsDZemJGmMIwjtosYwmGmf
+
nzFfsI5LIpveWBcA6+4kUflD6lsnm431MoJlIv+LRm6G6uarZ6iiyv4FjBlzaJb0
+
h0PiKXopFHW2OuunxacK69UK3Ib21qRKvGm640s0AgrxBqSUqmKM+fgvyvlcZEwq
+
uVUJZe7VKTXnEGRMms5OfPyEjE5LEyyDk3RfUfdxev8Dz7nx0Y1mrfS+rnc63Oc0
+
X6k6bkMg8MREazt2DoM8oCRHxA7O+MUSwLM05qGFI9MSZnvN99YLODbGn5FJWy14
+
U/z+ywVHUF1sA5tkfWvYlQA5PLUdpJlfivgVwiKykcWllEB8Sj7GFlPSV7hLZevW
+
n2LVEw+7y8mcJEy4v0wcT3xfAuJY0+YhlsDR1jO5m+8bVScmDxaaRFUWIDKH8r5S
+
u9QGqmnot4Ycpk8x9UVE38dqeDoNJ/UmJbxk3lkRESstxodsHfuJlEmxR0jHmRgt
+
rNd+d7/PcrCBIZf1kwG1u/O+7188OmyovOGbRWscGAS+p05TZTA=
+
=BEFc
+
-----END PGP SIGNATURE-----
+6
markdown/.well-known/security.txt.sig
···
+
-----BEGIN SSH SIGNATURE-----
+
U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgRe4PeEnAieVwezfCRdYBY2jx6z
+
ds8B3Z7yKmPKqAanYAAAAEZmlsZQAAAAAAAAAGc2hhNTEyAAAAUwAAAAtzc2gtZWQyNTUx
+
OQAAAEA6eFolLk853O1572TLAkDfNcLFZJfmW2J8thiSmosHBtcVoyfoqpduEFnIiv9BCj
+
hnXrv8ejkwWxd7dBfwVDMB
+
-----END SSH SIGNATURE-----
-19
markdown/.well-known/security.txt.unsigned
···
-
# Canonical URI
-
Canonical: https://andreijiroh.eu.org/.well-known/security.txt
-
-
# Contact details
-
Contact: mailto:ajhalili2006@andreijiroh.eu.org
-
Contact: https://andreijiroh.eu.org/contact/security
-
Contact: https://keybase.io/ajhalili2006
-
-
Preferred-Languages: en
-
-
# Use my PGP keys on the website or at Keybase
-
Encryption: https://keybase.io/ajhalili2006/pgp_keys.asc
-
Encryption: https://andreijiroh.eu.org/keys/pgp.asc
-
-
# Security Policy and acknowledgments
-
Policy: https://andreijiroh.eu.org/security
-
Acknowledgments: https://andreijiroh.eu.org/security/#thanks
-
-
Expires: 2024-09-26T15:59:00.000Z
+12
markdown/_headers
···
+
# enable CORS on well-known routes
+
/.well-known/*
+
Access-Control-Allow-Origin: *
+
X-Robots-Tag: nosnippet
+
+
# disable indexing on pages.dev/workers.dev
+
https://:project.pages.dev/*
+
X-Robots-Tag: noindex
+
https://:version.:project.pages.dev/*
+
X-Robots-Tag: noindex
+
https://:project.:org.workers.dev
+
X-Robots-Tag: noindex
+12 -6
markdown/_redirects
···
-
# internal redirects
-
/resume /user-manual/resume
-
/dni /user-manual/dni
+
# contact links
/contact/sponsors /contact/donations
+
/contact/hire-me /contact/work
+
/contact/open-source /contact/code-reviews
# external redirects
/blog https://blog.andreijiroh.dev
+
/blog/* https://blog.andreijiroh.dev/:splat
/pkgs https://pkgs.andreijiroh.dev
-
/socials /links
+
/pkgs/* https://pkgs.andreijiroh.dev/:splat
# user manual
/manual /user-manual
+
/resume /user-manual/resume
+
/dni /user-manual/dni
+
/manual/* https://wiki.andreijiroh.dev/garden/user-manual/:splat
+
/user-manual/* https://wiki.andreijiroh.dev/garden/user-manual/:splat
# legal
/privacy /legal/privacy
···
/security.txt /.well-known/security.txt
/ads.txt /.well-known/ads.txt
/keybase.txt /.well-known/keybase.txt
+
/keys/ssh-trustfile.txt /keys/ssh/trustfile.txt
-
# dynamic routing
-
/manual/* /user-manual/:path
+
# anything else
+
/socials /links
+62
markdown/keys/index.md
···
+
---
+
title: Cryptographic keys
+
---
+
This page contains all the cryptographic public keys I use for different purposes,
+
ranging from encryption and decryption to signing Git commits and even identity
+
verification without requiring an government-issued ID.
+
+
## Keysigning ceremories
+
+
_This is moved to [Encrypted communications](https://wiki.andreijiroh.dev/garden/user-manual/encrypted-communications#key-signing-ceremories) section of the personal user manual._
+
+
## GPG Keys
+
+
You can get all the GPG keys I use publicly, including the old 2021 key (as shown on
+
Keybase) and ProtonMail-specific encryption key in one file [here](./pgp.asc). Make
+
sure to check the fingerpints and/or key IDs against [this list](#keys-i-use) to
+
ensure its the right key.
+
+
```bash
+
# one-liner import from my website (or via ajhalili2006.vern.cc and ctrl-c.club/~ajhalili2006)
+
gpg --fetch-keys "https://andreijiroh.dev/keys/pgp.asc"
+
# sourcehut/gitlab, but it is advised to import latest keys and signatures from keyservers, listed below
+
gpg --fetch-keys "https://meta.sr.ht/~ajhalili2006.pgp"
+
gpg --fetch-keys "https://gitlab.com/ajhalili2006.gpg"
+
gpg --fetch-keys "https://mau.dev/ajhalili2006.gpg"
+
```
+
+
If you prefer to load it from a keyserver (let say you're an Ubuntu/Debian developer
+
snooping around my [Launchpad.net profile](https://launchpad.net/~ajhalili2006)),
+
you can do so with these command below:
+
+
```bash
+
# Other keyservers: pgp.mit.edu, keys.openpgp.org, keys.mailvelope.com
+
gpg --keyserver hkps://keyserver.ubuntu.com --recv-keys \
+
4D5E631758CB9CC45941B1CE67BFC91B3DA12BE8 \
+
0527234A430387EA5695D824A30EBE40AD856D88 \
+
EA957E7086E934F8DB9CAD21940047813E9D641C \
+
5D69E717C5BC95731C2AD8BD120C218ED2291996
+
```
+
+
### Keys I use
+
+
* `4D5E631758CB9CC45941B1CE67BFC91B3DA12BE8` - the December 2022 PGP key used for
+
commits and encryption (primary email: `ajhalili2006@andreijiroh.dev`)
+
* `0527234A430387EA5695D824A30EBE40AD856D88` - the Feburary 2021 PGP key, as shown on
+
my old Keybase profile (primary email: `andreijiroheugeniohalili24680@gmail.com`)
+
* `A715100E58CF60500EE159652F384539C700B263` - Recap Time Squad specific key
+
* `EA957E7086E934F8DB9CAD21940047813E9D641C` - spare signing key for software
+
release, especially on my own Debian package repos/Launchpad PPAs.
+
* `5D69E717C5BC95731C2AD8BD120C218ED2291996` - ProtonMail specific encryption key (`ajhalili2006@proton.me`)
+
+
## SSH Keys
+
+
You can also get all the keys in one file (and its signers file) at the following URLs:
+
+
* Website as its deployed via CI: <https://andreijiroh.dev/keys/ssh/trustfile.txt>
+
* As pushed via Git: <https://gitlab.com/andreijiroh-dev/website/-/blob/main/markdown/keys/ssh/trustfile.txt>
+
+
These SSH keys are used for signing Git commits and tags occasionally, as well
+
for signing checksums file on release tarballs, encrypting and decrypting
+
secrets via `agenix` and friends and identity verification on account recovery
+
for sr.ht and Miraheze.
+25
markdown/keys/ssh/trustfile.txt
···
+
# Import these public SSH keys into your trustfile (https://man.openbsd.org/ssh-keygen#ALLOWED_SIGNERS)
+
# to make your life even easier on verifying SSH signatures. This file contains every public key I actively
+
# use with every possible email address I actively use for sending and receiving emails. When in doubt, chat
+
# over Matrix (@ajhalili2006:envs.net or @ajhalili2006:vern.cc), XMPP (ajhalili2006@vern.cc), Keybase (AJHaliliDev06)
+
# OR Session (052b5390ba98e49d4b7d0b5ecaecb68e467c6a7d57ec6980ba2bd451aa86c1cf4b) over EE2E.
+
#
+
# Tutorial: https://www.agwa.name/blog/post/ssh_signatures
+
# PUBKEYS LAST UPDATED: 2025-12-08
+
# DOCS LAST UPDATED: 2023-02-18
+
+
# personal addresses
+
ajhalili2006@andreijiroh.dev ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEXuD3hJwInlcHs3wkXWAWNo8es3bPAd2e8ipjyqgGp2 SSH Key - main personal key, circa 2022
+
ajhalili2006@andreijiroh.dev ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzMlrUe7qMA1P0lP56lq2dKTrwFU6CrVltQ9um+PhOMLkoi31kAlujHtWF6mqGRLXcK0Ao/0Wqug++r82Zu0u7dpAv8LCExtaRRMzagwPkEe4OOqUBOpS6mggfsik8mNA+1UtpkXJ+ZiB4cXtNKEZC0jtxWOTXSV67qgkSxuO+YBWB+7pnESkB0KorqwOoWGGUVfYQtbKUAt6VqM4s6dn7saXqwmN0tCPO6a+4L4mazkYjFD11HhktYsjP9dvnxYSOtMrSFb9JOXRST2LdiIJgwg+HTqBSWGO7aBRHMJaTF3ajlbMtKDQI/EcNQLyGgX6yFdjjzz9DRY+2oU0vPTytdqM2BKsfLlR0GVg7BVL7TZPaLJ1lgpCl4Z1oClW9FOzhnYJVT0W+IKPsnYsFPfv/BVgjWF7YtLdc5zqFJ31PULtikCyd0I6Kt95YD0HdrlR2faWcBHI8KKEAwCCanodGnK/xTOxisTX2dXOxx3mvR/L3Wil2ca5hnD+vt500/o8= SSH Key - ajhalili2006@launchpad.net
+
ajhalili2006@gmail.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEXuD3hJwInlcHs3wkXWAWNo8es3bPAd2e8ipjyqgGp2 SSH Key - main personal key, circa 2022
+
ajhalili2006@gmail.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzMlrUe7qMA1P0lP56lq2dKTrwFU6CrVltQ9um+PhOMLkoi31kAlujHtWF6mqGRLXcK0Ao/0Wqug++r82Zu0u7dpAv8LCExtaRRMzagwPkEe4OOqUBOpS6mggfsik8mNA+1UtpkXJ+ZiB4cXtNKEZC0jtxWOTXSV67qgkSxuO+YBWB+7pnESkB0KorqwOoWGGUVfYQtbKUAt6VqM4s6dn7saXqwmN0tCPO6a+4L4mazkYjFD11HhktYsjP9dvnxYSOtMrSFb9JOXRST2LdiIJgwg+HTqBSWGO7aBRHMJaTF3ajlbMtKDQI/EcNQLyGgX6yFdjjzz9DRY+2oU0vPTytdqM2BKsfLlR0GVg7BVL7TZPaLJ1lgpCl4Z1oClW9FOzhnYJVT0W+IKPsnYsFPfv/BVgjWF7YtLdc5zqFJ31PULtikCyd0I6Kt95YD0HdrlR2faWcBHI8KKEAwCCanodGnK/xTOxisTX2dXOxx3mvR/L3Wil2ca5hnD+vt500/o8= SSH Key - ajhalili2006@launchpad.net
+
+
# release signing keys
+
releases@andreijiroh.dev ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHzLVfKtq8vBYeSrrVhwFwkpfu6TDLFgyjb3UmB+Jdhl
+
releases@recaptime.dev ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO0+1KY7/oVd+umDYBKfxmeQ6689365dlfk28MNiAl4e
+
+
# crew.recaptime.dev specific
+
ajhalili2006@crew.recaptime.dev ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDEYDna7HlVN6FL+Mxaof+WH5EoVmaUrM7GFAdQSveTJ RecapTIme.dev Crew SSH Key - @ajhalili2006
+
+
# school specifics
+
halili.459491@meycauayan.sti.edu.ph ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFI1Mj7gTG1IwnxPyr2AsXDq2kBq98hnijhgkGklkhWH
-21
markdown/keys/ssh-trustfile.txt
···
-
# Import these public SSH keys into your trustfile (https://man.openbsd.org/ssh-keygen#ALLOWED_SIGNERS)
-
# to make your life even easier on verifying SSH signatures. This file contains every public key I actively
-
# use with every possible email address I actively use for sending and receiving emails. When in doubt, chat
-
# over Matrix (@ajhalili2006:envs.net or @ajhalili2006:vern.cc), XMPP (ajhalili2006@vern.cc), Keybase (AJHaliliDev06)
-
# OR Session (052b5390ba98e49d4b7d0b5ecaecb68e467c6a7d57ec6980ba2bd451aa86c1cf4b) over EE2E.
-
#
-
# Tutorial: https://www.agwa.name/blog/post/ssh_signatures
-
# PUBKEYS LAST UPDATED: 2022-12-11
-
# DOCS LAST UPDATED: 2023-02-18
-
-
# ~ajhalili2006 - launchpad.net key
-
ajhalili2006@vern.cc ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzMlrUe7qMA1P0lP56lq2dKTrwFU6CrVltQ9um+PhOMLkoi31kAlujHtWF6mqGRLXcK0Ao/0Wqug++r82Zu0u7dpAv8LCExtaRRMzagwPkEe4OOqUBOpS6mggfsik8mNA+1UtpkXJ+ZiB4cXtNKEZC0jtxWOTXSV67qgkSxuO+YBWB+7pnESkB0KorqwOoWGGUVfYQtbKUAt6VqM4s6dn7saXqwmN0tCPO6a+4L4mazkYjFD11HhktYsjP9dvnxYSOtMrSFb9JOXRST2LdiIJgwg+HTqBSWGO7aBRHMJaTF3ajlbMtKDQI/EcNQLyGgX6yFdjjzz9DRY+2oU0vPTytdqM2BKsfLlR0GVg7BVL7TZPaLJ1lgpCl4Z1oClW9FOzhnYJVT0W+IKPsnYsFPfv/BVgjWF7YtLdc5zqFJ31PULtikCyd0I6Kt95YD0HdrlR2faWcBHI8KKEAwCCanodGnK/xTOxisTX2dXOxx3mvR/L3Wil2ca5hnD+vt500/o8= gildedguy@andreijiroh
-
ajhalili2006@gmail.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzMlrUe7qMA1P0lP56lq2dKTrwFU6CrVltQ9um+PhOMLkoi31kAlujHtWF6mqGRLXcK0Ao/0Wqug++r82Zu0u7dpAv8LCExtaRRMzagwPkEe4OOqUBOpS6mggfsik8mNA+1UtpkXJ+ZiB4cXtNKEZC0jtxWOTXSV67qgkSxuO+YBWB+7pnESkB0KorqwOoWGGUVfYQtbKUAt6VqM4s6dn7saXqwmN0tCPO6a+4L4mazkYjFD11HhktYsjP9dvnxYSOtMrSFb9JOXRST2LdiIJgwg+HTqBSWGO7aBRHMJaTF3ajlbMtKDQI/EcNQLyGgX6yFdjjzz9DRY+2oU0vPTytdqM2BKsfLlR0GVg7BVL7TZPaLJ1lgpCl4Z1oClW9FOzhnYJVT0W+IKPsnYsFPfv/BVgjWF7YtLdc5zqFJ31PULtikCyd0I6Kt95YD0HdrlR2faWcBHI8KKEAwCCanodGnK/xTOxisTX2dXOxx3mvR/L3Wil2ca5hnD+vt500/o8= gildedguy@andreijiroh
-
# ~ajhalili2006 - automated/ssh git access for tildes
-
ajhalili2006@vern.cc ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMhhCySAH8061Vnu7gfGVdAu++rvaMcM8sxelW5l9QvN ajhalili2006@vern.cc [git access ssh]
-
ajhalili2006@gmail.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMhhCySAH8061Vnu7gfGVdAu++rvaMcM8sxelW5l9QvN ajhalili2006@vern.cc [git access ssh]
-
ajhalili2006@recaptime.eu.org ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMhhCySAH8061Vnu7gfGVdAu++rvaMcM8sxelW5l9QvN ajhalili2006@vern.cc [git access ssh]
-
# ajhalili2006@recaptime.dev
-
ajhalili2006@recaptime.eu.org ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBvrT/nApjo8SQApta7WQXe4POo9EJTXUrPhAysP59os ajhalili2006@crew.recaptime.eu.org
-
ajhalili2006@recaptime.tk ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBvrT/nApjo8SQApta7WQXe4POo9EJTXUrPhAysP59os ajhalili2006@crew.recaptime.eu.org
-
+7
markdown/keys/ssh.pub
···
+
# This is @ajhalili2006's SSH keys in one place. It may
+
# be differs from those at his authorized_keys in the dotfiles
+
# repo.
+
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEXuD3hJwInlcHs3wkXWAWNo8es3bPAd2e8ipjyqgGp2 SSH Key - main personal key, circa 2022
+
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzMlrUe7qMA1P0lP56lq2dKTrwFU6CrVltQ9um+PhOMLkoi31kAlujHtWF6mqGRLXcK0Ao/0Wqug++r82Zu0u7dpAv8LCExtaRRMzagwPkEe4OOqUBOpS6mggfsik8mNA+1UtpkXJ+ZiB4cXtNKEZC0jtxWOTXSV67qgkSxuO+YBWB+7pnESkB0KorqwOoWGGUVfYQtbKUAt6VqM4s6dn7saXqwmN0tCPO6a+4L4mazkYjFD11HhktYsjP9dvnxYSOtMrSFb9JOXRST2LdiIJgwg+HTqBSWGO7aBRHMJaTF3ajlbMtKDQI/EcNQLyGgX6yFdjjzz9DRY+2oU0vPTytdqM2BKsfLlR0GVg7BVL7TZPaLJ1lgpCl4Z1oClW9FOzhnYJVT0W+IKPsnYsFPfv/BVgjWF7YtLdc5zqFJ31PULtikCyd0I6Kt95YD0HdrlR2faWcBHI8KKEAwCCanodGnK/xTOxisTX2dXOxx3mvR/L3Wil2ca5hnD+vt500/o8= SSH Key - ajhalili2006@launchpad.net
+
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDEYDna7HlVN6FL+Mxaof+WH5EoVmaUrM7GFAdQSveTJ RecapTIme.dev Crew SSH Key - @ajhalili2006
+
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFI1Mj7gTG1IwnxPyr2AsXDq2kBq98hnijhgkGklkhWH
-60
markdown/keys.md
···
-
---
-
title: Cryptographic keys
-
---
-
This page contains all the cryptographic public keys I use for different purposes,
-
ranging from encryption and decryption to signing Git commits and even identity
-
verification without requiring an government-issued ID.
-
-
## Keysigning ceremories
-
-
_This is moved to [Encrypted communications](../user-manual/encrypted-communications.md#key-signing-ceremories) section of the personal user manual._
-
-
## GPG Keys
-
-
You can get all the GPG keys I use publicly, including the old 2021 key (as shown on
-
Keybase) and ProtonMail-specific encryption key in one file [here](./pgp.asc). Make
-
sure to check the fingerpints and/or key IDs against [this list](#keys-i-use) to
-
ensure its the right key.
-
-
```bash
-
# one-liner import from my website (or via ajhalili2006.vern.cc and ctrl-c.club/~ajhalili2006)
-
gpg --fetch-keys "https://andreijiroh.dev/keys/pgp.asc"
-
# sourcehut/gitlab, but it is advised to import latest keys and signatures from keyservers, listed below
-
gpg --fetch-keys "https://meta.sr.ht/~ajhalili2006.pgp"
-
gpg --fetch-keys "https://gitlab.com/ajhalili2006.gpg"
-
gpg --fetch-keys "https://mau.dev/ajhalili2006.gpg"
-
```
-
-
If you prefer to load it from a keyserver (let say you're an Ubuntu/Debian developer
-
snooping around my [Launchpad.net profile](https://launchpad.net/~ajhalili2006)),
-
you can do so with these command below:
-
-
```bash
-
# Other keyservers: pgp.mit.edu, keys.openpgp.org, keys.mailvelope.com
-
gpg --keyserver hkps://keyserver.ubuntu.com --recv-keys \
-
4D5E631758CB9CC45941B1CE67BFC91B3DA12BE8 \
-
0527234A430387EA5695D824A30EBE40AD856D88 \
-
EA957E7086E934F8DB9CAD21940047813E9D641C \
-
5D69E717C5BC95731C2AD8BD120C218ED2291996
-
```
-
-
### Keys I use
-
-
* `4D5E631758CB9CC45941B1CE67BFC91B3DA12BE8` - the December 2022 PGP key used for
-
commits and encryption (primary email: `ajhalili2006@andreijiroh.dev`)
-
* `0527234A430387EA5695D824A30EBE40AD856D88` - the Feburary 2021 PGP key, as shown on
-
my old Keybase profile (primary email: `andreijiroheugeniohalili24680@gmail.com`)
-
* `A715100E58CF60500EE159652F384539C700B263` - Recap Time Squad specific key
-
* `EA957E7086E934F8DB9CAD21940047813E9D641C` - spare signing key for software
-
release, especially on my own Debian package repos/Launchpad PPAs.
-
* `5D69E717C5BC95731C2AD8BD120C218ED2291996` - ProtonMail specific encryption key (`ajhalili2006@proton.me`)
-
-
## SSH Keys
-
-
You can also get all the keys in one file (and its signers file) at the following URLs:
-
-
* Website as its deployed via CI: <https://andreijiroh.dev/keys/ssh-trustfile.txt>
-
* As pushed via Git: <https://mau.dev/andreijiroh-dev/website/-/blob/main/markdown/keys/ssh-trustfile.txt>
-
-
These SSH keys are used for signing Git commits and tags occassionally, as well for signing checksums file and identity verification on
-
account recovery for sr.ht and Miraheze.
+27 -1
markdown/now.md
···
[nowpage-info]: https://nownownow.com/about
[nownownow]: https://nownownow.com/p/Dxh0
-
_**Last updated (PHT)**: 2025-05-14 from Marilao, Bulacan, PH_
+
_**Last updated (PHT)**: 2025-10-27 from Marilao, Bulacan, PH_
+
+
## December 2025
+
+
It's Wrapped season! Check back here for the long-form blog post soon.
+
+
## October-November 2025
+
+
### Listening on loop
+
+
There's a always-updating playlist of what's on the daily rotation on both [Spotify][drs]
+
and [YouTube][dryt] with weekly updates. Here's a rundown of what's on the loop in the last
+
October and November.
+
+
- TBD
+
+
### School
+
+
### Hack Club Community / Alumni Society
+
+
- Launched a community Tangled Knot server, running on Nest
+
- Set up GitLab.com namespace for the Hack Club Community + Alumni Society projects
+
under GitLab for Open-source Program
+
- First subdomain user under the `hackclub.community` domain
## May 2025
### Listening on Loop
+
+
!!! info "Note from @ajhalili2006 as of 2025-11-03"
+
Forgot to list what's on the loop at that period and might be busy lately, gonna check the stats later
### PH Politics
-28
markdown/user-manual/boundaries.md
···
-
# Personal and Professional Boundaries
-
-
-
-
## General
-
-
* Donโ€™t leak nor spill beans on what shouldnโ€™t be discussed, especially confidential and personal stuff.
-
This also includes anything discussed off-the-record.
-
* Read my personal user manual in full before you contact me.
-
* For fandom-related stuff and other things, consider [reading my DNI](./dni.md)
-
-
## Personal
-
-
!!! note
-
Looking for mental health parts, especially on neurodivergence/disability? You might be looking at [:material-wheelchair-accessibility::fontawesome-solid-brain: Neurodivergence and Disability](./neurodivergence-and-disability.md).
-
-
## Professional
-
-
## What happened when boundaries are disrespected?
-
-
Hopefully tantrums, meltdowns and shutdowns donโ€™t happen in front of your own eyes in levels I canโ€™t handle, especially the silent ones.
-
-
In most cases, I might be frustated
-
-
## What about your DNI (Do Not Interact) list?
-
-
The [DNI list](./dni.md) is mostly apply to online communications, especially among different (multi)fandom (sometimes RP) accounts.
-
You can also treat them as extension (or addendum) to this.
-67
markdown/user-manual/communications.md
···
-
# Communicating with Andrei Jiroh
-
-
This page contains documentation on how to communicate with people in the neurodiversity and the wider disability communities in mind and also on gender neutral communication.
-
-
Suggestions and feedback to improve this content are welcome and encouraged.
-
Note that these docs might be not applicable to your case if youโ€™re considering writing your own
-
personal user manual and I donโ€™t speak for anyone else.
-
-
## TL;DR
-
-
> Some of them were copied from <https://t.me/ajhalili2006_bio/4> in part for when sliding into DMs.
-
-
1. [Donโ€™t be a dick](https://www.psychologytoday.com/us/blog/the-author-speaks/201909/don-t-be-dick) (aka violent, discriminatory, disrespectful or even disturbing in any way).[^1]
-
2. Respect my preferred pronouns and avoid PFL (person-first language) in most cases.
-
3. Donโ€™t ping me during downtime, sleep and day-offs. In case of emergencies, call me over my personal phone number that I provided or through provided contact methods.
-
For sensitive manners (like reporting security related issues), use Keybase, Session or Matrix (make sure to enable EE2E when initiating an one-to-one chat with me). If you want to connect through Session, Iโ€™ll provide my public ID when needed.
-
4. No crypto nonsense (even I use mirror.xyz and some other dapps), NSFW or CSAM, self promo hellscape, doxxing, death/swatting threats or calls to violence towards me or anybody.
-
5. Future employers and recruiters: Please contact via email or LinkedIn only.
-
6. I only respond over Facebook Messenger on my main profile if:
-
* you know me IRL, including within the immediate family;
-
* or, you are either my class adviser/subject teacher/boss or workspace/academic/school colleague, either in the past or current.
-
-
[^1]: Explainer from admins and mods at `hachyderm.io`: <https://community.hachyderm.io/docs/rule-explainer/#dont-be-a-dick>
-
-
## Pronouns and Language
-
-
My pronouns is `he/they` (technically `he/him/they/them` for long version), although `they/them` is much preferred even if I chose to be identified to my gender at birth.
-
-
In terms of discussing about things relating to neurodiversity and disability, I prefer identity first, especially when discussing about my disability and things like neurodiversity,
-
since I mostly frame ableism and other issues related to these under both social and human rights models of disability.
-
You might check the [note on disabled and disability](https://www.thesaurus.com/e/writing/person-first-vs-identity-first-language/#note-on-disabled-and-disability) at thesaurus.com,
-
especially when discussing accessibility across the community. I donโ€™t usually gatekeep language relating to disability, although I might do when discrimination and bullying happens or when clarification is needed.
-
-
## Availability
-
-
When considering doing a synchronous meeting (or even doing a personal call with me),
-
consider both my schedule, workload and the timezone (currently in Philippine Standard Time/`UTC+8`).
-
In most days, Iโ€™ll be unavailable for contact from 21:00 to 09:30 the next day, although [this could change](#office-hours).
-
Iโ€™m also unavailable on weekends and official holidays (both local within the city of Marilao and the
-
province of Bulacan and national), so expect additional delays on replies if itโ€™s a long weekend.
-
-
## Communicating at work
-
-
Generally, Iโ€™m not a fan of sync meetings, especially if iot is scheduled outside of my office hours in PH Standard Time.
-
-
### Office Hours
-
-
!!! warning "Currently left TBD due to school"
-
-
| Day | Regular Hours in PHT | Holidays / Rest Days [^1] |
-
| --- | --- | --- |
-
| Weekdays | TBD | TBD |
-
| Weekends | TBD | TBD |
-
-
### Recap Time Squad specifics
-
-
* Work-related stuff should be discussed in Recap Time Squadโ€™s chatrooms (either public or staff-only, although anything confidential/internal should be stay in staff-only chat).
-
* Ping me when only needed. Also, DO NOT ping @everyone.
-
* I don't usually read email, but if you sent me some important emails
-
(via my `@crew.recaptime.eu.org` or personal addresses),
-
please proactively reach me out via other contact methods.
-
-
## Additional resources
-
-
TBD
-
-
[^1]: My regular rest days usually happen on Saturdays, although they might be adjusted because of holidays and other reasons.
-31
markdown/user-manual/dni.md
···
-
# Do Not Interact List
-
-
_**Last updated**: TBD, still a working draft_
-
-
!!! info "This content is also available on my multifandom Tumblr"
-
I'm mirroring this to <https://multifandom.andreijiroh.eu.org/dni> after some delay.
-
-
This page contains the list of people where ~ajhalili2006 specifically does not want to interact with them. It is expected for those who are affected by this DNI list to avoid following him, although blocking him is too much unless otherwise needed.
-
-
~~If spotted (even when following the Community Code of Conduct) in my his personal spaces (not in professional settings including Recap Time Squad, although his boundaries still apply), expect moderation actions up to and including wielding banhammers against your Tumblr blogs (plus other accounts across the internet).~~
-
-
If you're part of these in this DNI list, please interact at your own risk. I know the strikedthough text
-
above seems to be 1984-styled of witch-hunting, apologies for that.
-
-
## Table of contents
-
-
* [General Shitfuckeries](#general-shitfuckeries)
-
* [Shippers](#shippers)
-
* [Dream Stans/Supporters](#toxic-dream-stanssupporters)
-
-
## General Shitfuckeries
-
-
As always, you must follow my [boundaries](./boundaries.md), both personal and professional.
-
-
## Shippers
-
-
Iโ€™m not a pro-shipper, although sometimes things go horribly wrong when I ship people that shouldnโ€™t be shipped. Iโ€™m more of a silent โ€œship responsiblyโ€ advocate like anyone else.
-
-
## (Toxic) Dream Stans/Supporters
-
-
I do not generally banhammer any people who support/stan Dream and the crew (aka Dream Team for the uninitiated), unless they do things toxic do fans in the interwebs.
-22
markdown/user-manual/encrypted-communications.md
···
-
# Encrypted communications
-
-
## GPG
-
-
### Active keys
-
-
| Key ID | Primary address | Description | Expiration date |
-
| --- | --- | --- | --- |
-
| `4d5e631758cb9cc45941b1ce67bfc91b3da12be8` | `ajhalili2006@andreijiroh.dev` | My main GPG key for signing git commits, as well as for encrypted mails | N/A |
-
| `a715100e58cf60500ee159652f384539c700b263` | `ajhalili2006@crew.recaptime.dev` | My GPG key for Recap Time Squad | N/A |
-
-
## Key-signing ceremories / Web of Trust
-
-
If you would like to build your web of trust with me (and probably with your friends), let me know
-
(via [my meeting booking form](https://calendar.app.google/P8dvgAsvrtqi8mPR9) ([alternative link](https://coda.io/form/Schedule-a-meeting-with-ajhalili2006_deaLq2my-OX)),
-
or via regular chat venues).
-
Due to my current schedule as a high school student, I'm only accept asynchorous key-signing ceremories
-
for the moment.
-
-
For asynchorous ceremories, I recommend doing it publicly through [this repo](https://go.recaptime.eu.org/keysigning-ceremory)
-
and [`#keysigning-ceremories.recaptime.dev:envs.net`](https://matrix.to/#/#keysigning-ceremories.recaptime.dev:envs.net). In case
-
of in-person ceremories, taking a picture with yours truly (with your own list of PGP fingerprints on a piece of paper) is enough.
-5
markdown/user-manual/flaws-and-quirks.md
···
-
# Flaws and quirks
-
-
!!! info "Visit the Coda version of this page for up-to-date content"
-
[:octicons-link-external-16: Open in Coda](https://coda.io/@ajhalili2006/readme/personal-and-professional-boundaries-9){ .md-button }
-
[:octicons-report-16: Report inconsistencies between versions](https://go.andreijiroh.eu.org/website-feedback/coda){ .md-button }
-36
markdown/user-manual/index.md
···
-
---
-
description: Get to know Andrei Jiroh better by reading his personal user manual.
-
---
-
# Personal User Manual
-
-
!!! info "This website is currently the official mirror of my personal README over at Coda"
-
<id="canonical-link">
-
In the future, I'll port things into this website to allow for community contributions without
-
messing around doc permissions. If you found any inconsistencies between versions, please do let me know in the Issue tracker so that I fix it.
-
-
[:octicons-link-external-16: Open in Coda](https://coda.io/@ajhalili2006/readme/personal-user-manual-8){ .md-button }
-
[:octicons-report-16: Report inconsistencies between versions](https://go.andreijiroh.eu.org/website-feedback/coda){ .md-button }
-
-
Hello there, and welcome to my personal user manual. This is where I document about myself for others in terms
-
of communications and teamwork. While the contents of this mini wiki will be always a work in progress, Iโ€™ll expand
-
them as I add missing information and update outdated details behind the scenes.
-
-
## About me
-
-
[_Go back to the homepage for the introduction_](../index.md)
-
-
## Contents
-
-
Although they originally editied in Coda, I slowly moving some of them here.
-
-
* [:material-chat: Communications](./communications.md)
-
* [:material-fence: Personal and professional boundaries](./boundaries.md)
-
* [:material-wheelchair-accessibility::fontawesome-solid-brain: Neurodivergence and Disability](./neurodivergence-and-disability.md)
-
* [:fontawesome-solid-cloud-bolt: Flaws and quirks](./flaws-and-quirks.md)
-
* [:material-briefcase: Job Employment Availability](./job-employment-availability.md)
-
* [:material-guy-fawkes-mask: Roleplaying Hellscape](./roleplaying-hellscape.md)
-
-
## Other links
-
-
* [Resume](./resume.md)
-
* [Legalese and policies](https://coda.io/@ajhalili2006/readme/legalese-and-policies-5)
-6
markdown/user-manual/job-employment-availability.md
···
-
# Job Employment Availability
-
-
!!! danger "Content only available in Coda version of this page"
-
To ensure links don't break in the foreseekable future, we kept this page as a soft redirect.
-
-
[:octicons-link-external-16: Open in Coda](https://coda.io/@ajhalili2006/readme/job-employment-availability-12){ .md-button }
-9
markdown/user-manual/neurodivergence-and-disability.md
···
-
# Neurodivergence and Disability
-
-
!!! info "Visit the Coda version of this page for up-to-date content"
-
[:octicons-link-external-16: Open in Coda](https://coda.io/@ajhalili2006/readme/neurodivergence-and-disability-14){ .md-button }
-
[:octicons-report-16: Report inconsistencies between versions](https://go.andreijiroh.eu.org/website-feedback/coda){ .md-button }
-
-
## Language
-
-
> See also [Communications](./communications.md)
-4
markdown/user-manual/resume.md
···
-
# My resume
-
-
!!! info "Moved to Notion"
-
Technically I use Coda for this, but we're so back to Notion, so here's a interactive
-5
markdown/user-manual/roleplaying-hellscape.md
···
-
# Roleplaying Hellscape
-
-
!!! info "Visit the Coda version of this page for up-to-date content"
-
[:octicons-link-external-16: Open in Coda](https://coda.io/@ajhalili2006/readme/roleplaying-hellscape-13){ .md-button }
-
[:octicons-report-16: Report inconsistencies between versions](https://go.andreijiroh.eu.org/website-feedback/coda){ .md-button }
+2 -2
mkdocs.yml
···
- "Anything else":
- contact/else.md
- "Show all contact details": contact/details.md
-
- "PGP and SSH keys": keys.md
+
- "PGP and SSH keys": keys/index.md
- Legal:
- Security policy: security.md
- Code of Conduct: https://policies.recaptime.dev/code-of-conduct
···
accent: yellow
toggle:
icon: material/brightness-7
-
name: Switch to dark mode
+
name: Switch to system preference
# Palette toggle for dark mode
- media: "(prefers-color-scheme: dark)"
+2 -1
wrangler.jsonc
···
"run_worker_first": false
},
"build": {
-
"command": "pipenv run build"
+
"command": "bash ./bin/build.sh",
+
},
"workers_dev": true,
"preview_urls": true,
+58
zensical.toml
···
+
[project]
+
# basic metadata
+
site_name = "~ajhalili2006"
+
site_url = "https://andreijiroh.dev"
+
docs_dir = "markdown"
+
site_dir = "public"
+
site_author = "Andrei Jiroh Halili"
+
copyright = "Copyright &copy; 2022-present - Andrei Jiroh Halili and contributors, licensed under the <a href=\"https://creativecommons.org/licenses/by-sa/4.0\">CC BY-SA 4.0</a> license."
+
use_directory_urls = true
+
+
[project.extra]
+
fediverse_handle = "@ajhalili2006:tilde.zone"
+
+
[project.theme]
+
custom_dir = "overrides"
+
# project features
+
features = [
+
"announce.dismiss",
+
"content.action.edit",
+
"content.action.view",
+
"content.code.annotate",
+
"content.code.copy",
+
"navigation.footer",
+
"avigation.indexes",
+
"navigation.sections",
+
"navigation.tabs",
+
"navigation.top",
+
"navigation.tracking",
+
"search.highlight",
+
"search.share",
+
"search.suggest",
+
"toc.follow",
+
]
+
+
# Palette
+
## Palette toggle for automatic mode
+
[[project.theme.palette]]
+
media = "(prefers-color-scheme)"
+
palette.primary = "green"
+
palette.accent = "yellow"
+
toggle.icon = "material/brightness-auto"
+
toggle.name = "Switch to light mode"
+
## Palette toggle for light mode
+
[[project.theme.palette]]
+
media = "(prefers-color-scheme: light)"
+
scheme = "default"
+
palette.primary = "green"
+
palette.accent = "yellow"
+
toggle.icon = "material/brightness-7"
+
toggle.name = "Switch to dark mode"
+
## Palette toggle for dark mode
+
[[project.theme.palette]]
+
media = "(prefers-color-scheme: dark)"
+
scheme = "slate"
+
palette.primary = "green"
+
palette.accent = "yellow"
+
toggle.icon = "material/brightness-4"
+
toggle.name = "Switch to system preference"