
EinkPDA keyboard
TalismanDesign/PocketMage_PDA
An E-Ink PDA device using the ESP32 S3.

React + TypeScript + Vite, React Router, React Three Fiber / Three.js and GSAP ScrollTrigger. Russian, English and Traditional Chinese (Taiwan) public interfaces; seven routes. Russian is the default.
AquaNode is an open-source printed circuit board by toxonpf, from the toxonpf/aquaNode repository on GitHub. It is a 2-layer board of 80 × 60 mm with 65 parts on 24 nets, routed with 374 tracks and 85 vias.
It is built around the TPS61040DBV and ADS1115. Its parts include 16 resistors, 13 capacitors, 7 connectors, 4 transistors and 3 ICs.
React + TypeScript + Vite, React Router, React Three Fiber / Three.js and GSAP ScrollTrigger. Russian, English and Traditional Chinese (Taiwan) public interfaces; seven routes. Russian is the default. An icon-triggered language menu in the header and footer saves the selection and updates the interface without a reload. No contact form is configured.
Node 22.12+ (verified with Node 26) and npm:
npm install
npm run devOpen the URL printed by Vite (normally http://127.0.0.1:5173).
npm run build
npm run preview
npx playwright testTests use Playwright Chromium (npx playwright install chromium if needed). An installed browser can be selected without editing the config:
PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/chromium npx playwright testOpen the browser developer console on the running site:
oceanStyle(4) // Select a style immediately, without reloading the scene.
oceanStyle(9) // Return to the current ocean (default).
oceanStyle() // List all styles with numbers, names and descriptions.The choice is saved in this browser and survives reloads and navigation. The command is available on every page; the selected surface appears in the overview's 3D ocean. Static/reduced-motion illustrations remain static. Water, buoy motion and network links use the same selected wave profile. Invalid values throw a RangeError and leave the current choice unchanged.
| Number | Style | Version |
|---|---|---|
| 1 | Original | Original fine sparkling ripples |
| 2 | Smooth | Softer surface before the depth refinements |
| 3 | Soft depth | Organic colour variation and soft highlights |
| 4 | Fine ripples | Previous lake-like directional ripples |
| 5 | Long swell | First long ocean swells |
| 6 | Broad foam | Long waves with wide foam patches |
| 7 | Crest ribbons | Narrow foam ribbons along crests |
| 8 | Textured crests | Four waves, deeper colour and broken foam |
| 9 | Ocean | Current six-wave ocean with large swells and sparse foam |
Preset definitions are in src/features/ocean/scene/oceanStyles.ts, the console command and saved choice in src/features/ocean/scene/oceanStyle.ts, shared CPU/GPU wave functions in src/features/ocean/scene/ocean.ts, and appearance variants in src/features/ocean/scene/OceanSurface.tsx. Historical variants reuse the current buoy model, rectangular float and underwater scene; the original style retains its historical circular waterline. Only the selected surface shader is compiled.
Switch immediately in the browser console; the selection is saved across pages and reloads:
cursorStyle(0) // Native system cursor.
cursorStyle(1) // Water trail with animated arrows (default).
cursorStyle() // Read the selected number.The command is available on every page. Touch, reduced motion and forced colors retain native controls. The console store is in src/features/cursor/cursorStyle.ts; the pointer rendering is in src/features/cursor/SiteCursor.tsx.
Publish dist/ as a static site after npm run build. Configure the host to serve index.html for application paths (/about, /technology, /build, /journal, /team); asset paths must serve the actual files. A Netlify-style _redirects file is included. No backend or secrets are required. Hosting and domain remain undecided; nothing has been published. Add the final absolute site URL and social preview image to the metadata when the domain is chosen.
See the project structure and editing map for source folders, CSS order and test groups.
src/data/catalog.ts: navigation, people and optional social links, resources, assembly steps, project updates, conceptual part descriptions.src/main.tsx: React startup; src/app/App.tsx: routes and page shell; src/pages/: page composition and English source phrases passed to t().src/data/content.ts: localizes shared editorial records for the selected language.src/features/i18n/i18n.ts and src/features/i18n/locales/ru*.ts / zh-TW.ts: language selection, Russian copy and named placeholders. See localization notes.src/features/ocean/scene/Scene.tsx: ocean rendering, lighting and camera transitions.src/features/buoy/BuoyModel.tsx and src/features/buoy/BuoyDrawing.tsx: lightweight 3D and static buoy illustrations, based on the supplied open-pisciculture reference.src/features/ocean/story/BuoyAnnotation.tsx and src/features/buoy/buoyAnchors.ts: the annotation's fixed attachment point, SVG arrow and damped bend. The 3D scene projects the lid point after applying the buoy's current wave transforms; only the bend has inertia, while the tip tracks exactly. The static illustration uses its corresponding SVG point.src/features/ocean/story/SensorPanel.tsx, src/features/ocean/scene/Underwater.tsx and src/features/ocean/styles/sensors.css: the underwater chapter, sensor explanations, projected probe controls, light and particles.src/styles/base.css: desktop and separately composed mobile layouts, reduced-motion rules.public/resources/: genuine supplied downloadable materials. Do not copy the entire engineering package into this public directory: it contains unapproved protocol details.public/assets/: supplied engineering images and licensed ocean recording.New journal entries are objects in updates; leave dates undated when unknown. Team social links render only when a real { label, url } item exists. Contacts and form work were explicitly deferred by the user; no email address or successful submission is fabricated.
The opening section is one full viewport of ocean viewed from above, with a cream and marine-blue buoy at its centre. A dark loading screen with a small spinner covers the scene until its first WebGL frame is rendered, then fades out over 900 ms to reveal the brighter ocean. The navigation sits over the water. One second after that reveal, “what is this?” fades in and a curved arrow draws toward the buoy. A moving line and downward arrow invite scrolling; both the annotation and cue link to the current project section. The rest of the overview remains available below while sections are refined individually.
The Three.js ocean uses an actual displaced mesh, analytic wave normals, reflected sky, sun glints and fine wind ripples. The buoy samples the same four directional swells as the water, so its height and tilt follow the surface. Wave parameters and the shared CPU/GPU equations are in src/features/ocean/scene/ocean.ts. Opening-section styles are in src/features/ocean/styles/ocean.css.
The opening has five chapters in one persistent canvas: the overhead surface, a close look at the buoy, and the probes below the water. Each distinct vertical wheel gesture, swipe or navigation key advances one adjacent chapter. Short anchors, 56–96 px apart, replace the empty viewport-length gaps. Further input is consumed until the camera and copy have settled and the current gesture has paused for 280 ms, preventing momentum from skipping a chapter. Leaving the last chapter returns to ordinary page scrolling; its remaining momentum is consumed until that gesture ends. Chapter links and the dive cue provide direct navigation. Pinch zoom, horizontal gestures and text/button input retain their normal controls. The underwater camera travels around and beneath the float; the background, underside of the water and light change with it. Text and its gradient appear together once the camera settles. The isolated pH, EC and temperature controls select a matching explanation, probe highlight and pulse colour. Moving labels attached to the probe array offer duplicate pointer controls; the stationary selector provides keyboard and screen-reader access. No live measurements are simulated. Reduced motion and unavailable WebGL retain all chapter navigation and sensor explanations with the static illustration.
No texture downloads or post-processing passes are used. The enclosure label is drawn locally on a small canvas. Animation runs only while the scene is visible and the browser tab is active. The secondary model renders on demand. Pending 3D uses a loading indicator rather than an SVG illustration. A static SVG is reserved for reduced motion, limited hardware, unavailable WebGL or a failed 3D download; those states leave loading immediately instead of waiting for a frame that cannot render. The buoy follows the open-pisciculture reference's rectangular float, central mast, upright enclosure and lower probe tube, with softened edges and an AquaNode finish. Its dimensions and details remain illustrative. Scrolling stays native.
Current engineering source: AquaNode_R0.3_EC_pH_revC/, dated 2 November 2026. revC is a freshwater bench configuration with experimental EC (SEN0244), temperature (DS18B20), and isolated pH (SEN0169-V2 → DFR0504 → ADS1115). The pH isolator uses a separate regulated bench supply; battery-powered pH and its energy budget are incomplete.
The supplied reports record 18 Python tests (15 EC model, 3 pH exporter), 166 schematic pins and 139 PCB pads compared across source files. These are source/software checks, not hardware evidence. Fifteen C++ pH assertions were not run. The ESP32 build attempt stopped during dependency download. Native ERC/DRC, physical calibration, shared-water tests and fabrication release remain pending. Real calibration coefficients and measured accuracy are not supplied. The presentation profile is simulation and is not used as hardware evidence.
src/data/revisions/ec-ph-revc.json is a website projection of these reports, with unknown outcomes kept null; it is not a supplied status file. src/data/project.ts exposes the current revision. RU/zh-TW revC copy is in ru-revc.ts and zh-revc.ts. Public summaries, status, evidence and attribution are under public/resources/ec-ph-revc/. Localized diagrams are generated by scripts/design-architecture.mjs. Firmware/protocol implementation is not added to web downloads. The supplied engineering directory is unchanged.
Historical revB downloads and diagrams remain at their existing URLs. Older R0.3 native checks and previous source counts are historical, not revC results. The independent Taiwan station archive and geographic map examples are not AquaNode field readings.
Model code is lazy-loaded, the secondary model waits for proximity to the viewport, and DPR is capped at 1.5. The hero animates only while visible in an active tab; secondary rendering uses demand mode. Reduced motion, data saver, limited reported memory, missing WebGL2 and lost contexts use a lightweight SVG view. Descriptions remain accessible without 3D. No automatic audio playback or audio download; one persistent toggle starts/stops the recording. Large imagery uses lazy loading. Native navigation, focus outlines, skip link, descriptive image alternatives and keyboard controls are present.
The 3D chunk still contains the Three.js renderer and is significantly larger than the core page. Users who request reduced motion or cannot use WebGL do not load it. Google Fonts uses display=swap with system fallbacks; the site is usable if fonts cannot load.
AquaNode_R0.3/: README, Engineering, Purchase_and_test, Verification, BOM, Assembly and PCB drawings. Original directory is preserved. Public attribution: public/resources/ATTRIBUTION.md. New package documentation is CC BY 4.0; hardware CERN-OHL-P-2.0, with upstream notices in the original package.public/resources/ATTRIBUTION.md.| Qty | Value | Footprint | References |
|---|---|---|---|
| 4 | 100nF | AquaNode:C_0805_2012Metric | C1, C13, C14, C15 |
| 4 | 1uF | AquaNode:C_0805_2012Metric | C9, C11, C12, C16 |
| 4 | M3 NPTH | AquaNode:MountingHole_3.2mm_M3 | H1, H2, H3, H4 |
| 3 | 100k | AquaNode:R_0805_2012Metric | R5, R6, R18 |
| 3 | 22uF | AquaNode:C_1210_3225Metric | C8, C17, C18 |
| 3 | 4.7k | AquaNode:R_0805_2012Metric | R1, R2, R3 |
| 2 | 100k 0.1% | AquaNode:R_0805_2012Metric | R11, R12 |
| 2 | 10uF | AquaNode:C_0805_2012Metric | C7, C10 |
| 2 | 1k | AquaNode:R_0805_2012Metric | R15, R16 |
| 2 | 49.9k 0.1% | AquaNode:R_0805_2012Metric | R9, R10 |
| 1 | 1-Wire TVS | AquaNode:D_SOD-323 | D2 |
| 1 | 100R | AquaNode:R_0805_2012Metric | R4 |
| 1 | 10uH 1.4A sat | AquaNode:L_Bourns_SRN4018_Custom | L1 |
| 1 | 1M | AquaNode:R_0805_2012Metric | R17 |
| 1 | 20k 0.1% | AquaNode:R_0805_2012Metric | R8 |
| 1 | 3V3 | AquaNode:TestPoint_Pad_D2.0mm | TP3 |
| 1 | 5V LDO | AquaNode:SOT-23-5 | U8 |
| 1 | 5V_PH | AquaNode:TestPoint_Pad_D2.0mm | TP5 |
| 1 | 69.8k 0.1% | AquaNode:R_0805_2012Metric | R7 |
| 1 | ADC_BAT | AquaNode:TestPoint_Pad_D2.0mm | TP14 |
| 1 | ADC_PH | AquaNode:TestPoint_Pad_D2.0mm | TP13 |
| 1 | ADS1115 | AquaNode:VSSOP-10_3x3mm_P0.5mm | U1 |
| 1 | BATTERY + - | AquaNode:JST_PH_B2B-PH-K_1x02_P2.00mm_Vertical | J3 |
| 1 | BAT_EN | AquaNode:TestPoint_Pad_D2.0mm | TP4 |
| 1 | BOOST_RAW | AquaNode:TestPoint_Pad_D2.0mm | TP12 |
| 1 | Battery sense P-MOS | AquaNode:SOT-23 | Q3 |
| 1 | Battery sense driver | AquaNode:SOT-23 | Q4 |
| 1 | DS18B20 G V D | AquaNode:JST_PH_B3B-PH-K_1x03_P2.00mm_Vertical | J7 |
| 1 | GND | AquaNode:TestPoint_Pad_D2.0mm | TP6 |
| 1 | I2C_SCL | AquaNode:TestPoint_Pad_D2.0mm | TP8 |
| 1 | I2C_SDA | AquaNode:TestPoint_Pad_D2.0mm | TP7 |
| 1 | N-MOS gate driver | AquaNode:SOT-23 | Q2 |
| 1 | OW_CABLE | AquaNode:TestPoint_Pad_D2.0mm | TP9 |
| 1 | P-MOS high side | AquaNode:SOT-23 | Q1 |
| 1 | PH AFE G V A | AquaNode:JST_PH_B3B-PH-K_1x03_P2.00mm_Vertical | J9 |
| 1 | PH POWER 3V3 / 5V | AquaNode:PinHeader_1x03_P2.54mm_Vertical | JP1 |
| 1 | PH_EN | AquaNode:TestPoint_Pad_D2.0mm | TP11 |
| 1 | PH_OUT | AquaNode:TestPoint_Pad_D2.0mm | TP10 |
| 1 | SPST BATTERY SWITCH | AquaNode:JST_PH_B2B-PH-K_1x02_P2.00mm_Vertical | J5 |
| 1 | Schottky 20V | AquaNode:D_SOD-123 | D1 |
| 1 | TO XIAO BAT PADS | AquaNode:JST_PH_B2B-PH-K_1x02_P2.00mm_Vertical | J4 |
| 1 | TPS61040 | AquaNode:SOT-23-5 | U7 |
| 1 | VBAT | AquaNode:TestPoint_Pad_D2.0mm | TP2 |
| 1 | VBAT_RAW | AquaNode:TestPoint_Pad_D2.0mm | TP1 |
| 1 | XIAO_LEFT_D0..D6 | AquaNode:PinHeader_1x07_P2.54mm_Vertical | J1 |
| 1 | XIAO_RIGHT_D7..5V | AquaNode:PinHeader_1x07_P2.54mm_Vertical | J2 |
It measures 80 × 60 mm and has 2 copper layers, 1.6 mm thick.
65 parts, built around the TPS61040DBV and ADS1115. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the toxonpf/aquaNode repository on GitHub, at the commit this page was made from: the board is AquaNode_R0.3/cad/AquaNode.kicad_pcb and its schematic AquaNode_R0.3/cad/AquaNode.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask toxonpf before reusing the design.

TalismanDesign/PocketMage_PDA
An E-Ink PDA device using the ESP32 S3.


plinkysynth/plinky_public
a public release of the plinky sw and hw



temporal-community/badge.temporal.io
Open-source firmware, hardware files, docs, and community app registry for the Temporal Replay 2026 Badge.


Architeuthis-Flux/Temporal-Replay-26-Badge
Community firmware for the Temporal Replay 26 badge