Add an embedded systems topic
All checks were successful
Build and deploy static pages / build-and-push (push) Successful in 14s
All checks were successful
Build and deploy static pages / build-and-push (push) Successful in 14s
Eight conferences and six journals, curated for the computer-science side of
the field. EDA and circuit-design venues are deliberately excluded — DAC, DATE,
ICCAD and CODES+ISSS are canonical for embedded systems but not for the kind of
work this site tracks — and venues.yaml carries that rationale as a header
comment so the next person doesn't "helpfully" add them back.
Two curation calls worth recording. SenSys, IPSN and IoTDI merged in 2026 into
one conference, the ACM/IEEE International Conference on Embedded Artificial
Intelligence and Sensing Systems; it is tracked under the SenSys acronym, which
is what ICORE and DBLP still use, and IPSN and IoTDI are not listed separately.
RTCSA and ICCPS were dropped — the first is CORE B with no announced 2027
edition, the second carries no CORE rank at all.
Deadlines are all source: manual, verified against the official CFPs. Only EWSN
has a WikiCFP entry for its current edition; every other series there stops at
an edition that has already been held, so the rest are wikicfp_id: false. ECRTS
and LCTES have no announced next edition and sit under missing:, which renders
as TBD. With the stale-deadline handling from 5b06f48 this reads correctly:
only RTAS shows an open deadline, and the rest land in the elapsed-rounds table
rather than advertising passed dates as upcoming.
The topic also exposed three generator bugs that cloud-edge never hit:
_journals_section_body() read scimago_* straight off the venues.yaml entry, so
the journals index showed a dash for every journal without inline values, while
the journal pages resolved the same numbers from rankings/scimago.csv. Both now
share a _journal_ranks() helper, and gen_section_indexes() takes the SCImago
table to feed it. cloud-edge never saw this because all seven of its journals
carry inline values.
The SCImago CSV writes SJR with a decimal comma (0,864). Nothing consumed those
values before, so the loader now normalises them to a dot and CSV-derived
numbers render like the inline ones.
gen_digests() now writes digests/_index.md. Hugo only auto-creates a section
page when the section has a listable page, and a topic with no digests yet
holds nothing but build.list: never stubs, so the Digests nav link 404'd. It
preserves any existing body, leaving cloud-edge's file unchanged.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
27
README.md
27
README.md
@@ -11,7 +11,7 @@ Hugo-generated website that helps researchers:
|
||||
|
||||
The site is domain-driven: a researcher picks a research area (e.g. "edge and cloud systems") and the assistant builds a curated, ranked, up-to-date snapshot of where to publish, when to submit, and what to read. The output is a static Hugo site that can be rebuilt on demand.
|
||||
|
||||
Multiple research topics live under the same Hugo instance as subsites (`/cloud-edge/`, `/embedded-ai/`, …). Each topic has its own venue list, deadlines, digests, and calendar. Layouts, theme, and JavaScript are shared.
|
||||
Multiple research topics live under the same Hugo instance as subsites (`/cloud-edge/`, `/embedded-systems/`, …). Each topic has its own venue list, deadlines, digests, and calendar. Layouts, theme, and JavaScript are shared.
|
||||
|
||||
Work is split between **automated scripts** (data fetching, Hugo content generation) and **agent tasks** (domain curation, paper selection, deadline gap-filling). The README below documents both halves so the site can be kept fresh over time.
|
||||
|
||||
@@ -157,6 +157,18 @@ A venue whose `deadlines.yaml` entry says `source: manual` is skipped by the fet
|
||||
|
||||
**Conferences not on WikiCFP** (for systems/networking): OSDI, NSDI, USENIX ATC, SC, MobiSys, SEC. Use `wikicfp_id: false` for all of them.
|
||||
|
||||
For the embedded-systems topic only EWSN has a WikiCFP entry for its current edition (`190920`); every other conference is `wikicfp_id: false`:
|
||||
|
||||
| Venue | Why | |
|
||||
| --- | --- | --- |
|
||||
| EWSN | 190920 | current edition; `source: manual` (two cycles) |
|
||||
| RTSS, RTAS | WikiCFP series stops at the 2025 editions | |
|
||||
| EMSOFT, CASES | WikiCFP series is stale (2025 / 2023); ESWEEK publishes one shared date set for both, so they always carry identical deadlines | |
|
||||
| ECRTS, LCTES | latest WikiCFP entry is the edition that already took place; no next edition announced yet | |
|
||||
| SenSys | SenSys, IPSN and IoTDI merged into a single conference in 2026 — WikiCFP still lists the three old series | |
|
||||
|
||||
**Merged venues**: SenSys, IPSN and IoTDI are now one conference, the *ACM/IEEE International Conference on Embedded Artificial Intelligence and Sensing Systems*, kept under the `SenSys` acronym (which is also what ICORE and DBLP still use). Do not add IPSN or IoTDI as separate venues.
|
||||
|
||||
**Manual deadline entries**: Add entries with `source: manual` to `site/data/<topic>/deadlines.yaml`. The fetcher preserves all `source: manual` entries across runs — indefinitely, and by design: WikiCFP cannot express multi-cycle venues and does not carry most systems conferences at all, so re-fetching a manual entry would replace researched data with worse data or nothing. Nothing refreshes these but a person or an agent.
|
||||
|
||||
Because of that, a manual entry can sit unchanged long after its deadline passes. The fetcher does not fix this, but it does **report** it: any entry whose recorded rounds have all elapsed is listed under `stale:` in `deadlines.yaml` and printed at the end of the run. See Task 7. Format:
|
||||
@@ -277,12 +289,12 @@ topics:
|
||||
- slug: cloud-edge
|
||||
title: "Edge and Cloud Systems"
|
||||
description: "Conferences and journals for edge computing, cloud systems, and distributed systems."
|
||||
- slug: embedded-ai
|
||||
title: "Embedded AI"
|
||||
description: "Conferences and journals for on-device ML, edge inference, and TinyML."
|
||||
- slug: embedded-systems
|
||||
title: "Embedded Systems"
|
||||
description: "Conferences and journals for real-time systems, embedded software, and sensing systems."
|
||||
```
|
||||
|
||||
The `slug` must match the directory names under `site/data/` and `site/content/`. It also becomes the URL prefix (`/cloud-edge/`, `/embedded-ai/`). The `title` appears in the nav bar on the root page and on the topic's section home.
|
||||
The `slug` must match the directory names under `site/data/` and `site/content/`. It also becomes the URL prefix (`/cloud-edge/`, `/embedded-systems/`). The `title` appears in the nav bar on the root page and on the topic's section home.
|
||||
|
||||
---
|
||||
|
||||
@@ -377,7 +389,7 @@ Full pipeline orchestrator. Loops over all topics in `topics.yaml` by default.
|
||||
### Multi-topic routing
|
||||
|
||||
Hugo treats `site/content/<topic>/` as a section. All pages inside it are served under `/<topic>/`. The nav bar partial (`site/layouts/partials/header.html`) detects `.Section` at render time:
|
||||
- **Inside a topic** (`cloud-edge`, `embedded-ai`, …): renders Venues / Calendar / Digests links relative to that section.
|
||||
- **Inside a topic** (`cloud-edge`, `embedded-systems`, …): renders Venues / Calendar / Digests links relative to that section.
|
||||
- **At the root** (`/`): renders one link per topic from `site/data/topics.yaml`.
|
||||
|
||||
To add a topic: populate `site/data/topics.yaml` + `site/data/<topic>/venues.yaml`, then run `./build.sh --topic <slug>`. The new section appears in the global nav automatically.
|
||||
@@ -710,6 +722,7 @@ Worth re-running even when no deadline changed: the calendar's open/elapsed spli
|
||||
- **Rankings CSVs are in `site/data/rankings/`**: Hugo's data loader is configured to ignore `data/rankings/*.csv` via `ignoreFiles` in `hugo.toml`. If you move these files or add new CSVs, update `ignoreFiles` accordingly — Hugo cannot parse arbitrary CSV as a data map and will error on build.
|
||||
- **ICORE pagination**: the ICORE portal uses `javascript:jumpPage('N')` links, not standard `?page=N` URLs. `fetch_icore.py` handles this. If you get only 50 results instead of ~900, pagination is broken.
|
||||
- **SCImago blocked**: `pa-fetch-scimago` will raise a clear error if anti-bot HTML is returned. Refresh `site/data/rankings/scimago.csv` by hand, or add data inline to `venues.yaml`.
|
||||
- **SCImago values resolve in two places**: both the journal page and the journals index run `_journal_ranks()` — inline `scimago_*` fields in `venues.yaml` win, and `rankings/scimago.csv` fills the gap by `full_name`. The CSV writes SJR with a decimal comma (`0,864`); the loader normalises it to a dot so CSV-derived and inline values render alike. If a journal's quartile shows `—`, its `full_name` does not match the CSV `Title`.
|
||||
- **Never edit `site/themes/PaperMod/`**: it is a submodule pinned to upstream, and CI checks it out fresh — edits there are not committed and disappear on deploy. Put CSS in `site/assets/css/extended/custom.css` and template overrides in `site/layouts/`.
|
||||
- **Generated content is committed, and CI never regenerates it**: the Gitea workflow only runs `hugo`. After editing any `site/data/` file, run `./build.sh` (or `pa-generate`) and commit the resulting `site/content/` diff, or the deployed site will not change.
|
||||
- **`npm ci` before `hugo`**: `js.Build` resolves `@fullcalendar/*` from `site/node_modules/`, which is gitignored. A fresh clone that skips it gets a build error on the calendar page.
|
||||
@@ -730,4 +743,4 @@ Worth re-running even when no deadline changed: the calendar's open/elapsed spli
|
||||
- **Citation tracking** — periodically re-query OpenAlex for citation counts on digest papers.
|
||||
- **Best paper badge** — `pa-generate` could cross-reference `best_papers.yaml` with digest candidates and add a `best_paper_award: true` flag, then render a badge in `_digest_body()`.
|
||||
- **Automated WikiCFP ID discovery** — when a venue has no `wikicfp_id`, attempt a search and record the result in `venues.yaml` for future runs (reduces manual work when bootstrapping new topics).
|
||||
- **Cross-topic venue pages** — some venues (e.g., ASPLOS) span multiple topics. A future `cross_listed: [embedded-ai, cloud-edge]` field in `venues.yaml` could render the venue under multiple topic sections without duplicating data.
|
||||
- **Cross-topic venue pages** — some venues (e.g., ASPLOS) span multiple topics. A future `cross_listed: [embedded-systems, cloud-edge]` field in `venues.yaml` could render the venue under multiple topic sections without duplicating data.
|
||||
|
||||
Reference in New Issue
Block a user