From a62e07b714bc2601e1db2184a4392caed132c367 Mon Sep 17 00:00:00 2001 From: Seungpyo1007 Date: Fri, 13 Nov 2026 23:45:39 +0900 Subject: [PATCH 1/7] docs(site): correct the landing page to match how the repos work Link the dataset at GetTechAPI/TechAPI, list the workflows that exist, and drop the Monday schedules and automated PRs: nothing runs on a schedule and collectors only produce a patch for a maintainer. --- site/src/pages/index.astro | 48 ++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/site/src/pages/index.astro b/site/src/pages/index.astro index 163fcd1..182fd1b 100644 --- a/site/src/pages/index.astro +++ b/site/src/pages/index.astro @@ -3,36 +3,38 @@ const raw = import.meta.env.BASE_URL; const base = raw.endsWith("/") ? raw : raw + "/"; const ghEngine = "https://github.com/GetTechAPI/TechEngine"; -const ghData = "https://github.com/Seungpyo1007/TechAPI"; +const ghData = "https://github.com/GetTechAPI/TechAPI"; const pillars = [ { title: "Validate", - blurb: "Schema, slug, range, and uniqueness checks gate every PR to the dataset.", + blurb: "Schema, slug, range, and uniqueness checks run on every PR to the dataset.", cmd: "python -m app.validate", link: `${ghEngine}/blob/main/app/validate.py`, }, { title: "Cover", - blurb: "Diff the curated dataset against upstream catalogs (Wikipedia today; ARK / vendor pages next) and surface missing SKUs as weekly reports.", + blurb: "Diff the curated dataset against upstream catalogs (Wikipedia today) and list missing SKUs in an on-demand report.", cmd: "python -m app.coverage", link: `${ghEngine}/blob/main/app/coverage`, }, { title: "Ingest", - blurb: "Drafts new records from canonical sources and opens PRs against TechAPI for human review.", + blurb: "Drafts new records from canonical sources as a patch; a maintainer reviews it and opens the PR against TechAPI.", cmd: "python -m app.ingest --category cpu", link: `${ghEngine}/blob/main/app/ingest`, }, ]; const workflows = [ - { name: "validate-data", file: "validate-data.yml", desc: "Reusable: called by TechAPI on every PR + push." }, - { name: "refresh-data", file: "refresh-data.yml", desc: "Cron Mondays 06:17 UTC — regenerates the static dump." }, - { name: "coverage-report", file: "coverage-report.yml", desc: "Cron Mondays 06:23 UTC — diffs upstream vs curated, syncs sticky issue." }, - { name: "weekly-ingest", file: "weekly-ingest.yml", desc: "Cron Mondays 06:29 UTC — drafts missing SKUs, opens PR against TechAPI." }, - { name: "test", file: "test.yml", desc: "Lint + type-check + pytest on every push." }, - { name: "deploy-pages", file: "deploy-pages.yml", desc: "Builds this site + dump and publishes to Pages." }, + { name: "test", file: "test.yml", desc: "Lint + type-check + pytest on PRs and pushes to main." }, + { name: "validate-data", file: "validate-data.yml", desc: "Reusable or manual: read-only validation of a TechAPI ref." }, + { name: "deploy-pages", file: "deploy-pages.yml", desc: "On push to main: builds this site + dump and publishes to Pages." }, + { name: "coverage-report", file: "coverage-report.yml", desc: "Manual: diffs upstream vs curated into the job summary." }, + { name: "ingest", file: "ingest.yml", desc: "Called by TechAPI's collect.yml: drafts missing SKUs as a patch." }, + { name: "refresh", file: "refresh.yml", desc: "Called by TechAPI's collect.yml: re-scrapes benchmarks as a patch." }, + { name: "verify-promote", file: "verify-promote.yml", desc: "Called by TechAPI's collect.yml: Tier 1-3 checks, verified promotion." }, + { name: "final-check", file: "final-check.yml", desc: "On the final-check label: full checks + one bot comment." }, ]; --- @@ -41,7 +43,7 @@ const workflows = [ TechEngine — validation & ingestion for the TechAPI dataset - + @@ -68,8 +70,8 @@ const workflows = [

The engine behind TechAPI

TechEngine validates every change to the dataset, diffs it against upstream - catalogs to surface what is missing, and (next) drafts new records - automatically so curators only review. + catalogs to surface what is missing, and drafts new records for + maintainers to review. Nothing runs on a schedule.

Read API docs → @@ -86,7 +88,7 @@ const workflows = [

Three pillars

-

Each pillar is a Python module under app/; CI orchestrates them.

+

Each pillar is a Python module under app/; CI and manually dispatched workflows run them.

{pillars.map((p) => ( @@ -109,7 +111,7 @@ const workflows = [

Status

-

Pulled from the static dump's manifest. Populates once refresh-data has run.

+

Pulled from the static dump's manifest, which deploy-pages regenerates with this site.

@@ -128,7 +130,7 @@ const workflows = [

How the two repos connect

The dataset lives in TechAPI. - TechEngine reads it via a sibling checkout, validates, and emits artifacts. + TechAPI pins TechEngine as a submodule; the engine reads the data from a TechAPI checkout, validates it, and emits artifacts.

@@ -142,14 +144,14 @@ const workflows = [
workflow_call
⟶
-
checkout sibling
+
submodule pin
TechEngine
app/validate.py (heavy)
app/seed.py · dump.py
- app/coverage · app/ingest (planned) + app/coverage · app/ingest · app/verify
@@ -178,21 +180,21 @@ const workflows = [

Roadmap

-

Each line is a tracked GitHub issue.

+

Each line is a tracked GitHub issue; both have shipped.

@@ -257,12 +259,12 @@ const workflows = [ document.getElementById("status-out").innerHTML = highlightJSON(m); }).catch((e) => { document.getElementById("stats").innerHTML = - '
—
run refresh-data
'; + '
—
no dump
'; const pill = document.getElementById("status-pill"); pill.textContent = "no dump yet"; pill.className = "status err"; document.getElementById("status-out").innerHTML = - 'No dump artifact deployed yet. Trigger the refresh-data workflow to populate this panel.'; + 'No dump artifact deployed yet. The deploy-pages workflow publishes it with this site.'; }); From e6f6cc09cd722ec2817e3c628b9e0451af3cd025 Mon Sep 17 00:00:00 2001 From: Seungpyo1007 Date: Fri, 13 Nov 2026 23:46:21 +0900 Subject: [PATCH 2/7] docs(development): bring the guide in line with the code The guide still described the pre-split product: record counts, no collectors in this repo, Codespace notes and a file that is gone. --- docs/DEVELOPMENT.md | 67 ++++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index 7c11e4b..6abbc7b 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -1,41 +1,43 @@ -# TechAPI — development guide & handoff +# TechEngine development guide > Read this first. Full spec: [SPEC.md](SPEC.md). Static-dump design: > [DATA_PIPELINE.md](DATA_PIPELINE.md). ## What this is -TechAPI — a free, open REST API for consumer-electronics specs (smartphones, -SoCs, GPUs, CPUs, brands). FastAPI + SQLModel. **This repo is -the public product: the API + a curated dataset + a static JSON dump.** It does -**not** contain data-collection/scraping tooling (that is maintained separately; -see "Data scope" below). +TechEngine is the engine for the TechAPI dataset of consumer-electronics specs: +the validator, the FastAPI read API, the static JSON dump generator, the +coverage report, the collectors (`app/ingest`) and the verification tiers +(`app/verify`). **It holds no data.** The dataset lives in +[GetTechAPI/TechAPI](https://github.com/GetTechAPI/TechAPI) and is read from a +TechAPI checkout (see the note under "Repo layout"). ## Current status - **Stack**: FastAPI, SQLModel, Pydantic v2, Python 3.12. DB defaults to SQLite (`DATABASE_URL`); Postgres 16 via `docker-compose.yml`. -- **Endpoints** (under `/v1`): `health`, `version`, `brands`(+`/{slug}` +`/{slug}/smartphones`), - `socs`(+`/{slug}` +`/{slug}/smartphones`), `smartphones`(+`/{slug}` +`/{slug}/score`), - `gpus`(+`/{slug}`), `cpus`(+`/{slug}`, `?segment=`). Docs at `/scalar` and `/docs`. +- **Endpoints** (under `/v1`): `health`, `version`, and one list + `/{slug}` + detail per collection: `brands` (+`/{slug}/smartphones`), `socs` + (+`/{slug}/smartphones`), `smartphones`, `tablets`, `watches`, `pdas`, `gpus`, + `cpus` (`?segment=`), `laptops`, `monitors`, `software`, `websites`, + `device-catalog`. `socs`, `smartphones`, `gpus` and `cpus` also have + `/{slug}/score`. Docs at `/scalar` and `/docs`. - **Formats**: list `{count,next,previous,results}` (§7.4); error `{error:{code,message,request_id,documentation_url}}` (§7.5); smartphone detail per SPEC appendix C (embeds brand+soc+manufacturer + computed `score`). - **Tests**: `pytest` is the canonical test runner. `ruff check app tests` + `mypy app` are the static gates in CI. -- **NOT done**: cloud deploy (Railway/Fly need accounts) and public static hosting. - Dockerfile + workflows written but not executed in the cloud. +- **Hosting**: there is no hosted API server. `deploy-pages.yml` publishes the + landing site with a static dump to GitHub Pages on every push to `main`; + TechAPI builds its own copy of the dump with the engine commit it pins. -### Curated dataset (validated, what the API serves) -brand 129 · soc 123 · smartphone 367 · gpu 330 · cpu 976. **This is a curated subset, -NOT an exhaustive catalog of every device.** It is intentionally hand-verified; -breadth is expanded out-of-band (see "Data scope"). +### Data scope -### Data scope (important) -This repo holds only **curated, validated** data and serves/dumps it. Bulk -collection/scraping and the pre-review candidate pool are **not part of this -repo** and are maintained through a separate pipeline. Local contributors working -in this Codespace: see `NOTES.local.md` (gitignored, not committed). +The dataset is large and changes often, so no record counts are kept here; see +TechAPI's README. Collectors live in `app/ingest` and `app/verify`. Nothing runs +on a schedule: they run when a maintainer dispatches TechAPI's `collect.yml`, +and each run uploads a patch that a maintainer turns into a TechAPI PR. Do not +run them against a TechAPI checkout you are not prepared to diff and review. ## Repo layout @@ -78,11 +80,12 @@ docs/ SPEC.md, DATA_PIPELINE.md, DEVELOPMENT.md ## How to run ```bash -pip install -e ".[dev]" # deps already installed in this Codespace -python -m app.validate # check curated data +git clone https://github.com/GetTechAPI/TechAPI.git ../TechAPI # the data +pip install -e ".[dev]" +python -m app.validate # check the dataset python -m app.seed # dataset → ./techapi.db (SQLite) uvicorn app.main:app --reload # serve; curl http://localhost:8000/v1/smartphones/galaxy-s25 -pytest -q --cov=app # tests (target >60%, currently ~98%) +pytest -q --cov=app # tests (CI fails under 60% coverage) ruff check app tests && mypy app python -m app.dump # generate ./dump/ static tree (gitignored) ``` @@ -95,24 +98,26 @@ python -m app.dump # generate ./dump/ static tree (gitignored) - **Data restructured** to singular names + brand subfolders (maintainer request). - **Static-dump pivot** — `app/dump.py` exports the API to a static JSON tree, built by TechAPI at deploy time (see DATA_PIPELINE.md §3). -- **Scoring** is a Phase-0 reference-based approximation; Phase 1 → dataset-wide - min-max (§8.4). Raw third-party benchmarks (Geekbench/AnTuTu/Cinebench/Time Spy) - are stored as algorithm inputs but NOT exposed (ADR-006). +- **Scoring** reads its weights and reference scales from `config/scoring.yaml` + (§8). Raw third-party benchmarks (Geekbench/AnTuTu/Cinebench/Time Spy) are + stored as algorithm inputs but NOT exposed (ADR-006). ## Conventions (IMPORTANT) -- **Commits**: Conventional Commits (`feat(api): …`, `data: …`, `docs: …`). +- **Commits**: Conventional Commits (`feat(api): …`, `fix(ingest): …`, `docs: …`). Keep commit messages clean and to the point. - **Data accuracy**: only real, sourced models. All brand, device, and chip records require `source_urls`. Do not fabricate unsourced "all devices" data (SPEC §1.6). -- 100% type hints; tests alongside code; new top-level data fields must match the +- 100% type hints; tests under `tests/`; new top-level data fields must match the SQLModel (seeder does `Model(**record)` — unknown keys break it). ## Gotchas - SQLModel `table=True` models skip Pydantic validation, so `seed.py` coerces `release_date` strings to `date` objects manually. -- `app/services/scoring.py` camera score is intentionally simple (a 50MP flagship - can score below a 200MP phone) — known Phase-0 limitation, not a data bug. -- Nothing is committed yet — `git status` shows the build as adds. +- The camera score in `app/services/scoring/phones.py` is intentionally simple + (a 50MP flagship can score below a 200MP phone): a known limitation, not a + data bug. +- `app.seed` reads record timestamps from the TechAPI checkout's git history; a + shallow clone or a plain copy of `data/` falls back to the seed time. From 72238c163c5c3faa269d2097b0fcfaa9fae264d6 Mon Sep 17 00:00:00 2001 From: Seungpyo1007 Date: Fri, 13 Nov 2026 23:46:21 +0900 Subject: [PATCH 3/7] chore(github): point CODEOWNERS at an account that exists The organisation has no teams, so @GetTechAPI/maintainers matched nobody. --- .github/CODEOWNERS | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index c90df99..2e8c771 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,4 +1,2 @@ -# Default owners for everything in the repo. -* @GetTechAPI/maintainers - -/app/ @GetTechAPI/maintainers +# Default owner for everything in the repo. +* @Seungpyo1007 From 9f65e21e1eab6827d18806fb70d93e988423ee27 Mon Sep 17 00:00:00 2001 From: Seungpyo1007 Date: Fri, 13 Nov 2026 23:46:22 +0900 Subject: [PATCH 4/7] chore(github): send data reports to TechAPI This repo holds no data, so the data-addition and data-correction forms become a contact link. The bug form no longer points at a hosted API. --- .github/ISSUE_TEMPLATE/bug_report.yml | 9 ++++--- .github/ISSUE_TEMPLATE/config.yml | 8 ++++++ .github/ISSUE_TEMPLATE/data_addition.yml | 29 ---------------------- .github/ISSUE_TEMPLATE/data_correction.yml | 28 --------------------- 4 files changed, 13 insertions(+), 61 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/config.yml delete mode 100644 .github/ISSUE_TEMPLATE/data_addition.yml delete mode 100644 .github/ISSUE_TEMPLATE/data_correction.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 7406fd4..9836643 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,5 +1,5 @@ name: "🐛 Bug report" -description: Report a bug in the API or tooling +description: Report a bug in the validator, API server, dump generator, collectors or verification labels: ["type:bug"] body: - type: textarea @@ -13,9 +13,10 @@ body: id: reproduce attributes: label: Steps to reproduce - description: Include the exact request (curl) where possible. + description: Include the exact command or request, and the TechEngine commit you ran. placeholder: | - curl https://api.techapi.dev/v1/smartphones/galaxy-s25 + python -m app.validate + curl http://localhost:8000/v1/smartphones/galaxy-s25 validations: required: true - type: textarea @@ -28,4 +29,4 @@ body: id: request-id attributes: label: request_id (if any) - description: The `request_id` from the error response helps us trace it. + description: For API errors, the `request_id` from the error response. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..2d327d9 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: true +contact_links: + - name: Missing or incorrect data + url: https://github.com/GetTechAPI/TechAPI/issues/new/choose + about: This repository holds no data. Report a missing record or a wrong value in the TechAPI repository. + - name: Video games + url: https://github.com/GetTechAPI/game-catalog/issues + about: Game records live in the game-catalog repository. diff --git a/.github/ISSUE_TEMPLATE/data_addition.yml b/.github/ISSUE_TEMPLATE/data_addition.yml deleted file mode 100644 index 5aba152..0000000 --- a/.github/ISSUE_TEMPLATE/data_addition.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: "📥 Data addition" -description: Request a new device, SoC, or GPU -labels: ["type:data", "data:missing"] -body: - - type: dropdown - id: category - attributes: - label: Category - options: - - smartphone - - soc - - gpu - - brand - validations: - required: true - - type: input - id: name - attributes: - label: Name - placeholder: "Galaxy S25 FE" - validations: - required: true - - type: textarea - id: sources - attributes: - label: Source URLs (at least one) - description: Manufacturer spec sheet preferred (§9.2). - validations: - required: true diff --git a/.github/ISSUE_TEMPLATE/data_correction.yml b/.github/ISSUE_TEMPLATE/data_correction.yml deleted file mode 100644 index e2ed9eb..0000000 --- a/.github/ISSUE_TEMPLATE/data_correction.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: "✏️ Data correction" -description: Correct an existing spec value -labels: ["type:data", "data:incorrect"] -body: - - type: input - id: slug - attributes: - label: Resource slug - placeholder: "galaxy-s25" - validations: - required: true - - type: input - id: field - attributes: - label: Field to correct - placeholder: "battery_mah" - validations: - required: true - - type: textarea - id: correction - attributes: - label: Current value → correct value (with source) - placeholder: | - current: 4500 - correct: 4000 - source: https://www.samsung.com/... - validations: - required: true From 1558399f4422650ab9719573245e6af0f27a3f86 Mon Sep 17 00:00:00 2001 From: Seungpyo1007 Date: Fri, 13 Nov 2026 23:46:44 +0900 Subject: [PATCH 5/7] fix(docker): build without the dataset and mount it from a TechAPI checkout The Dockerfile copied data/ and scripts/, which left this repo with the split, and never copied config/, which the scoring service reads. The image now expects the dataset at TECHAPI_DATA_DIR=/data and compose mounts ../TechAPI/data there read-only. --- Dockerfile | 7 ++++--- README.md | 20 ++++++++++++++------ docker-compose.yml | 6 ++++++ 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/Dockerfile b/Dockerfile index a876fda..53fa8fa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,9 +11,10 @@ COPY pyproject.toml README.md ./ COPY app ./app RUN pip install --no-cache-dir . -# Runtime assets. -COPY data ./data -COPY scripts ./scripts +# Runtime assets. The dataset is not part of the image: mount a TechAPI +# checkout's data/ at /data (see docker-compose.yml). +COPY config ./config +ENV TECHAPI_DATA_DIR=/data # Run as a non-root user. RUN useradd --create-home --uid 10001 appuser \ diff --git a/README.md b/README.md index d369aff..2bf5dd0 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ tests/ # unit/, integration/, verify/ site/ # Astro landing page, deployed to GitHub Pages docs/ # SPEC, DATA_PIPELINE, DEVELOPMENT .github/workflows/ # CI; every workflow is listed below -Dockerfile, docker-compose.yml # stale, do not build (see Docker) +Dockerfile, docker-compose.yml # API + Postgres, dataset mounted (see Docker) ``` Routes under `/v1`: `health`, `version`, `brands`, `socs`, `smartphones`, @@ -115,11 +115,19 @@ Smartphones continue to require numeric values for both fields. ### Docker -`Dockerfile` and `docker-compose.yml` predate the split from TechAPI and do -not work as they are: the Dockerfile copies `data/` and `scripts/`, which no -longer exist here, so the image does not build, and the compose file mounts no -TechAPI checkout for `app.seed` to read. No workflow builds or uses them. Use -the Quickstart above; for Postgres, point `DATABASE_URL` at your own instance. +The image holds the engine only and expects the dataset at `/data` +(`TECHAPI_DATA_DIR`). `docker-compose.yml` starts Postgres and the API, and +mounts `../TechAPI/data` read-only at that path, so clone the two repos side by +side: + +```text +/TechEngine # this repo; run `docker compose up --build` here +/TechAPI # the dataset +``` + +The API seeds the database from the mount before it serves, which takes a +while on the full dataset. The image has no git, so record timestamps are the +seed time. No workflow builds or uses these files. ## Roadmap diff --git a/docker-compose.yml b/docker-compose.yml index 509df83..1f335e0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,6 +25,12 @@ services: API_ENV: development ports: - "8000:8000" + # The dataset comes from a TechAPI checkout next to this repo: + # /TechEngine (this repo; run docker compose here) + # /TechAPI (git clone https://github.com/GetTechAPI/TechAPI.git) + # Its data/ is mounted read-only where the image's TECHAPI_DATA_DIR points. + volumes: + - ../TechAPI/data:/data:ro # Seed the database, then serve. Idempotent: re-running skips existing rows. command: > sh -c "python -m app.seed && uvicorn app.main:app --host 0.0.0.0 --port 8000" From 0b7e89953430158435c1368165328442db017ee0 Mon Sep 17 00:00:00 2001 From: Seungpyo1007 Date: Fri, 13 Nov 2026 23:46:49 +0900 Subject: [PATCH 6/7] chore: drop ignore notes and env entries for things that are not here .gitignore described data/_staging and data/_verify, but this repo has no data/. .env.example listed Supabase, Sentry and Redis settings that no code reads. --- .env.example | 9 --------- .gitignore | 8 +------- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/.env.example b/.env.example index 8ed2cd3..f9365dc 100644 --- a/.env.example +++ b/.env.example @@ -5,11 +5,6 @@ DATABASE_URL=sqlite:///./techapi.db DATABASE_POOL_SIZE=10 -# === Supabase (production Postgres host) === -SUPABASE_URL=https://xxx.supabase.co -SUPABASE_ANON_KEY=eyJ... -SUPABASE_SERVICE_KEY=eyJ... # secret, never expose to clients - # === API === API_HOST=0.0.0.0 API_PORT=8000 @@ -22,10 +17,6 @@ CORS_ORIGINS=http://localhost:3000,https://techpicks.app # === Logging === LOG_LEVEL=INFO -SENTRY_DSN=https://... # optional - -# === External Services === -REDIS_URL=redis://localhost:6379 # optional (Phase 2+) # === Scoring === SCORING_CONFIG_PATH=./config/scoring.yaml diff --git a/.gitignore b/.gitignore index 1c9813c..385634c 100644 --- a/.gitignore +++ b/.gitignore @@ -23,15 +23,12 @@ env/ # TECHAPI_DATA_DIR); the dataset is never committed here. /TechAPI/ -# Generated static dump (build artifact; published by refresh-data workflow) +# Generated static dump (build artifact; deploy-pages.yml publishes it) /dump/ # Local-only handoff notes (private; never committed to the public repo) *.local.md -# Note: data/_staging/ (raw collected candidate pool) is intentionally tracked — -# comprehensive data collection is a purpose of this repo. - # Local Wikipedia GPU backfill cache and dry-run reports (never a TechAPI write) .wikipedia-gpu-backfill/ @@ -55,6 +52,3 @@ coverage.xml # Local Wikipedia SoC backfill cache and reports (never commit) .wikipedia-soc-backfill/ - -# Recomputable verifier cache -/data/_verify/state/ From c63f66888321b1d9a70bc61e9b4fdd6c9bd77ff9 Mon Sep 17 00:00:00 2001 From: Seungpyo1007 Date: Fri, 13 Nov 2026 23:47:46 +0900 Subject: [PATCH 7/7] fix(site): serve the landing page from this repository's Pages path The config still pointed at seungpyo1007.github.io/TechAPI, so the page published at gettechapi.github.io/TechEngine loaded its stylesheet and links from /TechAPI/. --- site/astro.config.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/astro.config.mjs b/site/astro.config.mjs index 93e690c..390f971 100644 --- a/site/astro.config.mjs +++ b/site/astro.config.mjs @@ -3,6 +3,6 @@ import { defineConfig } from 'astro/config'; // GitHub Pages project site. Data dump (v1/, openapi.json) is copied alongside // the built site in CI, so internal links use import.meta.env.BASE_URL. export default defineConfig({ - site: 'https://seungpyo1007.github.io', - base: '/TechAPI', + site: 'https://gettechapi.github.io', + base: '/TechEngine', });