Skip to content
Dylan San GabrielDylan
API reference
Contact

GET /api/projects

Projects, written up properly.

Each one says what the problem was, what was non-obvious about the approach, and what came out of it, in the same places every time, so you can compare them.

Tools

A second brain where the agent does the filing

Live · 2026 · solo · personal tooling

A filing cabinet for my own notes, mail and messages that an AI assistant maintains for me. It proposes what needs doing next; I approve it. Everything stays on my Mac.A plain-markdown vault an AI librarian keeps for me — 738,000 messages indexed locally, nothing filed without my approval, no cloud.

Read the project

Split the check from a photo

In progress · 2026 · solo · side project

Photograph the dinner receipt, say who ate what, and it tells everyone what they owe. It checks its own answer against the receipt's printed total and won't show a split that doesn't match.Photograph a receipt, tap who had what, get the split. Runs on your phone with no server, and refuses to show a split that doesn't add up.

Read the project

The splitter after reading the example receipt. On the left, the receipt it was pointed at and, below it, what each person owes: You $28.86, Friend $40.40, summing to the printed $69.26. On the right, the green "Adds up" verdict and the five line items with a name tapped onto each.

This Portfolio

Live · 2026 · solo

This website. It has two voices, plain English and engineer, and a whole second mode where the portfolio becomes a help desk. Also it can run games.A content site that can also run games, built so the writing stays easy and the demos stay cheap.

Read the project

Games

Shotcall

Live · 2026 · solo

Like Wordle, but with a bouncing ball. One puzzle a day: work out which pocket it ends up in. Guess wrong and it shows you one more bounce.A daily puzzle. A ball bounces three times and drops into a pocket; you guess which one. Every miss shows you one more bounce.

Read the project

A solved Shotcall board. The ball's real path is chalked in white from the top rail, off the right rail, the bottom rail and the underside of a wooden block, into pocket L; the player's own amber line, drawn freehand, tracks it bank for bank and dies on the bottom rail beside K. Four pockets are crossed out, fourteen are lettered A to P on the green cloth.

Galaxy Defense

Archived · 2020 · solo

A game I built in high school using drag-and-drop coding blocks. It has a shop, upgrades, a boss, and a teleport ability, all made without the normal tools programmers use to keep code organised.A space shooter built in block code in high school. 790 lines, an economy, and a boss fight, with no arrays or classes available.

Read the project

Galaxy Defense running: the player's ship at the bottom, two green aliens descending, three green bunkers, and the lives, points, bombs and FTL readouts.

Course

Testing an ERP by hand, then automating a cloud app

Archived · 2024 · contributor · team of 10

Ten of us taught robots to re-test a business app every night, after testing it by hand first, which is how we found the bugs the robots would've missed.Two sprints on the CYDEO SDET program — fourteen user stories tested by hand against an ERP, then a Cucumber and Selenium suite against a cloud app.

Read the project

GET/api/projects

Parameters

Request

curl "https://dylansg.com/api/projects"
source: src/content/projects/*

Response200 OK · 5.6 KB

{
  "category": "all",
  "count": 6,
  "items": [
    {
      "id": "second-brain",
      "title": "A second brain where the agent does the filing",
      "status": "live",
      "year": 2026,
      "category": "tool",
      "role": "solo · personal tooling",
      "summary": "A plain-markdown vault an AI librarian keeps for me — 738,000 messages indexed locally, nothing filed without my approval, no cloud.",
      "summary_plain": "A filing cabinet for my own notes, mail and messages that an AI assistant maintains for me. It proposes what needs doing next; I approve it. Everything stays on my Mac.",
      "stack": [
        "Claude Code",
        "Node.js",
        "SQLite",
        "FTS5",
        "Astro",
        "Markdown",
        "Obsidian"
      ],
      "metrics": {
        "messages_indexed_locally": "738K",
        "text_hidden_in_a_binary_blob": "88%",
        "notes_filed_without_approval": "0",
        "leaks_a_careful_scrub_missed": "3"
      },
      "page": "https://dylansg.com/projects/second-brain"
    },
    {
      "id": "receipt-splitter",
      "title": "Split the check from a photo",
      "status": "wip",
      "year": 2026,
      "category": "tool",
      "role": "solo · side project",
      "summary": "Photograph a receipt, tap who had what, get the split. Runs on your phone with no server, and refuses to show a split that doesn't add up.",
      "summary_plain": "Photograph the dinner receipt, say who ate what, and it tells everyone what they owe. It checks its own answer against the receipt's printed total and won't show a split that doesn't match.",
      "stack": [
        "TypeScript",
        "Preact",
        "Tesseract.js",
        "Vite"
      ],
      "metrics": {
        "network_calls_after_load": "0",
        "wrong_splits_on_real_receipts": "0",
        "money_arithmetic": "integer cents"
      },
      "links": {
        "source": "https://github.com/Dylansg318/SplitApp",
        "play": "https://dylansg.com/play/receipt-splitter"
      },
      "page": "https://dylansg.com/projects/receipt-splitter"
    },
    {
      "id": "portfolio-site",
      "title": "This Portfolio",
      "status": "live",
      "year": 2026,
      "category": "tool",
      "role": "solo",
      "summary": "A content site that can also run games, built so the writing stays easy and the demos stay cheap.",
      "summary_plain": "This website. It has two voices, plain English and engineer, and a whole second mode where the portfolio becomes a help desk. Also it can run games.",
      "stack": [
        "Astro",
        "TypeScript",
        "Tailwind",
        "Cloudflare Workers",
        "MDX"
      ],
      "metrics": {
        "js_on_a_write_up": "0 KB",
        "hosting": "$0/mo",
        "demo_lanes": "2"
      },
      "links": {
        "source": "https://github.com/Dylansg318/Portfolio"
      },
      "page": "https://dylansg.com/projects/portfolio-site"
    },
    {
      "id": "shotcall",
      "title": "Shotcall",
      "status": "live",
      "year": 2026,
      "category": "game",
      "role": "solo",
      "summary": "A daily puzzle. A ball bounces three times and drops into a pocket; you guess which one. Every miss shows you one more bounce.",
      "summary_plain": "Like Wordle, but with a bouncing ball. One puzzle a day: work out which pocket it ends up in. Guess wrong and it shows you one more bounce.",
      "stack": [
        "TypeScript",
        "Astro",
        "SVG",
        "Node"
      ],
      "metrics": {
        "board_shapes_searched": "170,356",
        "boards_that_survive": "1,037",
        "ball_positions_verified": "1.55M"
      },
      "links": {
        "play": "https://dylansg.com/play/shotcall"
      },
      "page": "https://dylansg.com/projects/shotcall"
    },
    {
      "id": "galaxy-defense",
      "title": "Galaxy Defense",
      "status": "archived",
      "year": 2020,
      "category": "game",
      "role": "solo",
      "summary": "A space shooter built in block code in high school. 790 lines, an economy, and a boss fight, with no arrays or classes available.",
      "summary_plain": "A game I built in high school using drag-and-drop coding blocks. It has a shop, upgrades, a boss, and a teleport ability, all made without the normal tools programmers use to keep code organised.",
      "stack": [
        "JavaScript",
        "Code.org Game Lab",
        "Blockly",
        "Canvas"
      ],
      "metrics": {
        "lines_of_generated_js": "790",
        "sprites_placed_by_hand": "17",
        "arrays_available": "0"
      },
      "links": {
        "play": "https://dylansg.com/play/galaxy-defense"
      },
      "page": "https://dylansg.com/projects/galaxy-defense"
    },
    {
      "id": "erp-test-automation",
      "title": "Testing an ERP by hand, then automating a cloud app",
      "status": "archived",
      "year": 2024,
      "category": "course",
      "role": "contributor · team of 10",
      "summary": "Two sprints on the CYDEO SDET program — fourteen user stories tested by hand against an ERP, then a Cucumber and Selenium suite against a cloud app.",
      "summary_plain": "Ten of us taught robots to re-test a business app every night, after testing it by hand first, which is how we found the bugs the robots would've missed.",
      "stack": [
        "Java",
        "Selenium",
        "Cucumber",
        "Gherkin",
        "REST Assured",
        "JUnit",
        "Maven",
        "Jenkins",
        "Jira"
      ],
      "links": {
        "source": "https://github.com/drwekilowa/B34_G11_Sprint_2CloudAuto"
      },
      "page": "https://dylansg.com/projects/erp-test-automation"
    }
  ],
  "page": "https://dylansg.com/projects"
}

Live: this is the answer from this site’s API, not a mock. Send re-runs the request with your parameters; if the answer names a page, it opens.