factcircuit
FactCircuit는 불변 출처와 단계별 검증, 제한된 검색, 재현 가능한 평가를 제공하는 감사 가능한 주장·증거 검증 루프입니다
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Android and iOS sensor companion for opensensor.space, sharing Kotlin protocol and sensor rules; Android provides verified offline archives and sync, while iOS currently provides live readings.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗The phone app for opensensor.space, a home for open sensors of every kind. Air quality is the first device family. Weather, water, soil, noise and energy families plug in the same way, as data rather than new screens.
The app does three things.
PAR1 checks pass.Private by design. The archive lives on the phone and works without internet. LAN
connects only to devices found through _ossync._tcp mDNS, with a token obtained over bonded
BLE. The only other network use is anonymous, read-only downloads of the public map feed and
basemap, which a Settings switch turns off. Sharing a device's own data is off by default and
is turned on per device, in that device's settings, with confirmation. No accounts, no
analytics. Approximate foreground location is asked only on the Near me or Use phone
location tap. Device settings can save a privacy-limited H3 area to your sensor,
starting at resolution 8, with an optional declared country. Exact phone fixes
are never saved or sent. See device location. Public
data carries H3 cells, never coordinates.
One product on two phones. Rules that must give the same answer on Android and iOS live in shared Kotlin, and screens share one design system based on the opensensor.space website. See docs/cross-platform-guide.md.
| Platform | Current scope | Verification |
|---|---|---|
| Android | Multi-device BLE/LAN collection, verified local archive, offline history, and background sync | Host gate passes; phone qualification is tracked separately in docs/status.md and the CoreS3 and Waveshare records. |
| iOS | The same shared screens, BLE and LAN collection into a verified local archive, offline history and per-device Auto-sync | Host, simulator and native checks pass. iPhone runs are tracked in docs/status.md, see docs/ios.md |
Host tests, simulator builds, and phone observations are different evidence. The app ID
is space.opensensor.app on Android and iOS. Read the
full status record for dated results and remaining checks.
The docs are split by concern so you read only what you need. Start at
docs/README.md for the routing table; the rules are in AGENTS.md.
flowchart LR
P[protocol-quickref] --> T[transports] --> S[sync-engine] --> D[data-model] --> H[history-pipeline] --> U[screens]
S --> B[background-sync] --> U
Q[parquet] --> S
Q --> H
| Concern | File |
|---|---|
| Product direction, device families, public H3 discover map, sharing rules | docs/devices-and-discovery.md |
| Keeping Android and iOS the same, adding a sensor family or transport | docs/cross-platform-guide.md |
| Device identity, fixed names, reset and reflash recovery | docs/device-identity.md |
| What is verified, where, and what is next | docs/status.md |
| Modules, layers, "what a change touches" | docs/architecture.md |
| iOS app, shared Kotlin boundaries, build and qualification | docs/ios.md, ios/AGENTS.md |
| Screens, navigation, detail levels | docs/screens.md |
| Opcodes, frames, error codes, UUIDs, LAN framing (mirror of the firmware contract) | docs/protocol-quickref.md |
| BLE vs LAN, pairing, the LAN token, reconnect |
The iOS app uses Kotlin Multiplatform for shared protocol and sensor rules, with a Compose Multiplatform live-reading screen and native Core Bluetooth and Bonjour adapters. The Android app retains its native Compose UI and platform data stack. Both platforms can collect over Wi-Fi after each phone saves access through BLE pairing. The shared firmware allows three Wi-Fi clients per sensor alongside one BLE connection; both apps can sync two sensors concurrently per phone. History/export UI and background collection remain Android features while iOS migration continues. Build and qualification instructions are in docs/ios.md; local iOS coding instructions are in ios/AGENTS.md. On 2026-10-08, the owner confirmed live readings, Bonjour discovery, saved Wi-Fi access and collection starting on a connected iPhone. Pairing prompts, reading accuracy, stale/background behavior and completed-file phone verification still need qualification. The iPhone card now shows average KiB/s; dated transfer evidence separates measured CoreS3 host throughput from pending phone speed checks.
Android and host gate:
export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home"
tools/setup-hooks.sh # once per clone: git hooks (ktlint, gitleaks, hygiene; verify on push)
./gradlew --no-daemon clean verify # lint + assembleDebug + every module's unit tests
adb install app/build/outputs/apk/debug/app-debug.apk
The iOS build requires macOS and Xcode. Follow docs/ios.md
for simulator framework linking, the Xcode build, and real-iPhone qualification steps.
GitHub Actions validates shared Kotlin iOS tests and unsigned simulator Debug/device
Release builds on Apple Silicon with Xcode 27 and the iOS 27 SDK. Simulator apps and failure reports are retained
as workflow artifacts; iOS signing and TestFlight setup are documented in
docs/build-and-release.md.
Ready-made APKs: every push to main refreshes the rolling latest
pre-release; a v* tag publishes a permanent release. Details, signing and the debug fake device:
docs/build-and-release.md.
The release page distributes Android APKs and links to iOS simulator artifacts in
Actions. Signed iPhone/TestFlight distribution is not available yet.
core/protocol/ KMP common rules + JVM adapters · contract mirror: UUIDs, frames v1+v2, CONFIG, LAN framing, JSON, PAR1/CRC verify
core/parquet/ JVM-only · own Parquet reader + writer (GeoParquet 2.0, LZ4/Snappy/GZIP, codec SPI) · test fixtures
core/history/ KMP sensor-domain rules + JVM file adapters · Metrics registry (moving to core/model), Aggregator → tiers, TimeEstimate, Columns, AirMood, file index
app/ Android app · data/{ble,lan,sync,background,history,local,settings,export,fake} · ui/{scan,device,history,files,debug,settings}
ios/shared/ Kotlin Multiplatform presentation state and Compose Multiplatform live screen
ios/App/ Xcode app · Swift/Core Bluetooth/Bonjour platform adapters
tools/ fixture generators + PyArrow/DuckDB oracle (run in ../opensensor-space-firmware's pixi env), hooks, signing
docs/ one file per concern (see the map above)
Planned (see the production plan)
build-logic/ convention plugins for every module
core/model/ Device, DeviceFamily, Capability, ObservedProperty, Scale, family registry
core/sync/ one sync engine for both phones behind FrameLink and ArchiveStore ports
core/designsystem/ opensensor.space tokens, theme and shared components (Compose Multiplatform)
core/publicfeed/ public discover feed port, sample fixture, later Parquet over HTTP
feature/discover/ shared map, cell sheet and public device page
The Bluetooth protocol is owned by the firmware repo (../opensensor-space-firmware/docs/shared/ble-sync-protocol.md);
this app mirrors it and never changes a frame, opcode, UUID or JSON key first.
Walkthru.Earth original code in this repository (app/, core/, feature/, ui/, ios/, tools/, build-logic/, build files and documentation) is licensed under the Creative Commons Attribution 4.0 International Public License (CC-BY-4.0). See LICENSE and NOTICE. The CC-BY-4.0 license does not cover the third-party parts listed below, which keep their own licenses.
Attribution requirement. Any application, app store build, firmware image, hardware product, dataset, or documentation that uses or incorporates
opensensor-space-mobilemust include clear, visible attribution to Walkthru.Earth (https://walkthru.earth), for example"Sensor sync and air quality views powered by Walkthru.Earth (
walkthru-earth/opensensor-space-mobile), licensed under CC-BY-4.0."
| Component | Location | License | Copyright |
|---|---|---|---|
| Android Studio architecture template, the portions this project started from | spread through the Android project, per-file headers replaced by NOTICE | Apache-2.0, see apache.org/licenses/LICENSE-2.0 | Copyright (C) 2022 The Android Open Source Project |
Cairo font v3.130, from google/fonts ofl/cairo at commit a2c83daed9bc723922de8d0a9512990bd3d91df4 | ui/designsystem/src/commonMain/composeResources/ | SIL OFL 1.1, see Cairo-OFL.txt | Copyright 2009 The Cairo Project Authors |
Quicksand font, the variable TTF from google/fonts ofl/quicksand | ui/designsystem/src/commonMain/composeResources/ | SIL OFL 1.1, see Quicksand-OFL.txt | Copyright 2011 The Quicksand Project Authors |
Libraries pulled in by Gradle (for example AndroidX, Kotlin, Compose Multiplatform, OkHttp and zstd-jni) are not copied into this repository. Each keeps its own license, and app builds that ship them must carry their notices.
docs/transports.md |
Download, verification, lost windows, resume, archive paths, REBOOT audit | docs/sync-engine.md |
| Auto-sync, WorkManager, foreground notification, WifiLock, triggers (presence / advertising / Wi-Fi) | docs/background-sync.md |
| Room v1, DataStore, files on disk, backup | docs/data-model.md |
| Index → tiers → derived day → charts; metrics, moods, time estimate | docs/history-pipeline.md |
| Own Parquet reader/writer, GeoParquet 2.0, fixtures, oracles | docs/parquet.md |
| Stack, build, hooks, CI, signing, fake device | docs/build-and-release.md |
| Lessons learned, grouped by concern | docs/lessons-learned.md |