Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
8ca7ae6
Configure project
Dementor430 Jun 28, 2026
089be3d
Add v1 design spec for salt-lamp meeting reminder
Dementor430 Jun 28, 2026
6bd2a45
Revise spec: add temp/humidity sensor + closed-loop dryness; both cal…
Dementor430 Jun 28, 2026
4802e68
Add STPA safety analysis: hardware-personal, hardware-meetingroom, fi…
Dementor430 Jun 28, 2026
96bcd4a
Fold post-STPA decisions into spec: over-temp ownership, open securit…
Dementor430 Jun 28, 2026
de62e92
STPA iteration 5: post-decision delta (open bootloader, heartbeat, ov…
Dementor430 Jun 28, 2026
d9c7397
Spec: fold iteration-5 delta-STPA board requirements (latch-state sen…
Dementor430 Jun 28, 2026
0a7506c
Add hardware implementation plan (atopile v0.2.x)
Dementor430 Jun 28, 2026
014ae13
hw: scaffold buildable SaltLamp top module + ci target
Dementor430 Jun 28, 2026
7a88c3e
hw: install USB-C/CH224K/AL8860/eFuse/ESP32-C3-MINI-1U/SHT40/SK6812/c…
Dementor430 Jun 28, 2026
247367c
hw: PowerInput — USB-C + CH224K PD-9V + eFuse + gated 9V rail
Dementor430 Jun 28, 2026
a967197
hw: VBUS TVS + low-cap ESD on CC/D+/D- + creepage notes
Dementor430 Jun 28, 2026
a400b0e
hw: Rail3V3 — always-on 9V->3.3V buck for the MCU
Dementor430 Jun 28, 2026
8d31323
hw: Mcu — ESP32-C3-MINI-1U + decoupling + EN/boot + USB/I2C/GPIO brea…
Dementor430 Jun 28, 2026
0d5b2ad
hw: LedDriver — AL8860 buck CC, RC analog dim, keyed LED/NTC pigtail
Dementor430 Jun 28, 2026
5ed0f1a
hw: OverTemp — fail-toward-hot NTC + comparator latch gating eFuse EN…
Dementor430 Jun 28, 2026
19eb9aa
hw: fix OverTemp — push-pull TLV3012 window comparator + SN74LVC1G74 …
Dementor430 Jun 28, 2026
e482ad5
hw: Sensing — SHT4x I2C temp/humidity + SK6812 RGB status LED
Dementor430 Jun 28, 2026
6feb2f8
docs: task-9 report — SK6812 voltage decision + build output
Dementor430 Jun 28, 2026
816ad65
hw: top-level integration — button, test points, full control wiring,…
Dementor430 Jun 28, 2026
7f26070
hw: BOM + frozen CI build + KiCad netlist handoff
Dementor430 Jun 28, 2026
2901722
fix: finalize review — easyeda2kicad doc, repo hygiene, MCU/antenna B…
Dementor430 Jun 28, 2026
35cd29c
port: migrate to atopile 0.15 — manifest + clear v0.2 source (minimal…
Dementor430 Jun 28, 2026
eb8e4a7
port: regenerate all 20 ICs as 0.15 atomic parts (ato create part)
Dementor430 Jun 28, 2026
4832ea5
port: PowerInput module to atopile 0.15 (builds green)
Dementor430 Jun 28, 2026
1287982
port: complete hardware port to atopile 0.15 — full board builds green
Dementor430 Jun 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,9 @@ venv/

# IDEs
.vscode/

# SDD scratch (superpowers task reports, briefs, review diffs, progress)
.superpowers/

# Research artifact (not part of the design source)
board.json
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"python.defaultInterpreterPath": "/home/lars_erhardt/.local/share/uv/tools/atopile/bin/python"
}
3 changes: 0 additions & 3 deletions .vscode/settings.json.j2

This file was deleted.

4 changes: 2 additions & 2 deletions LICENSE.j2 → LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2024 {{ author | default("ORIGINAL AUTHOR", true) }}
Copyright (c) 2024 Lars Erhardt

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand All @@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
SOFTWARE.
11 changes: 9 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
# atopile project template
# ground

Don't fork this repository to setup your atopile project - it contains jinja templates anyways. Instead, use `ato create`, which will setup the project for you. Project setup instructions are here: https://atopile.io/
Wooohooo a new package!

## Build

`ato build` is self-contained on a fresh clone (all parts + the `generics/`
dependency are vendored). See [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) for the
`easyeda2kicad` CloudFront/User-Agent workaround needed when installing **new**
parts via `ato install --jlcpcb <id>`.
3 changes: 0 additions & 3 deletions README.md.j2

This file was deleted.

9 changes: 9 additions & 0 deletions ato.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
requires-atopile: "^0.15.0"

paths:
src: elec/src
layout: elec/layout

builds:
default:
entry: elec/src/ground.ato:SaltLamp
6 changes: 0 additions & 6 deletions ato.yaml.j2

This file was deleted.

47 changes: 47 additions & 0 deletions docs/DEVELOPMENT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# Development & Setup Notes

## Building the board (self-contained)

`ato build` is **fully self-contained** on a fresh clone. All JLCPCB parts and the
`generics/` dependency are vendored/committed under `elec/src/` (including
`elec/src/generics/`), so no network access or extra tooling is required:

```sh
ato build # default + ci configs; must finish with zero ERC errors
```

## Installing NEW parts (`ato install --jlcpcb <id>`) — known workaround

> This only matters when adding **new** components in the future. The committed
> design does not need it to build.

atopile uses `easyeda2kicad` to pull footprints/symbols from EasyEDA/LCSC. On a
clean machine this currently **fails** for two reasons:

1. **CloudFront 403** — `easyeda.com`'s WAF blocks the default
`easyeda2kicad vX.Y.Z` User-Agent, returning HTTP 403.
2. **`lceda.cn` fallback** — some older LCSC IDs are IP-rate-limited on
`easyeda.com` and must be fetched from `lceda.cn` instead.

### Workaround

Add a `sitecustomize.py` to the atopile venv's `site-packages` that monkey-patches
`easyeda2kicad.easyeda.easyeda_api.EasyedaApi` to (a) send a browser User-Agent and
(b) fall back to `lceda.cn` on an empty/403 response. The venv lives at:

```
$(dirname $(dirname $(readlink -f $(which ato))))/lib/python3.11/site-packages/sitecustomize.py
```

(e.g. `~/.local/share/uv/tools/atopile/lib/python3.11/site-packages/sitecustomize.py`
for a `uv`-installed atopile.)

The patch sets:

- `User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36`
- Fallback URL: `https://lceda.cn/api/products/{lcsc_id}/components?version=6.4.19.5`

This file is **machine-local and intentionally NOT committed** (it patches the
venv, not the repo). Re-add it after recreating the atopile venv. Upstream
`easyeda2kicad` may fix the User-Agent issue in a future release, making the patch
unnecessary.
2,729 changes: 2,729 additions & 0 deletions docs/stpa/2026-06-28-stpa-firmware.md

Large diffs are not rendered by default.

978 changes: 978 additions & 0 deletions docs/stpa/2026-06-28-stpa-hardware-meetingroom.md

Large diffs are not rendered by default.

861 changes: 861 additions & 0 deletions docs/stpa/2026-06-28-stpa-hardware-personal.md

Large diffs are not rendered by default.

Loading
Loading