nandi/frqpublic Fork 0
707093199019d7a222073965b5b2acfb3c7e8f04
Commits
Clone
git clone https://git.rickub.com/nandi/frq.git
git clone ssh://git@rickub.com/nandi/frq.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

README.md · 90 lines · 4.5 KBmarkdown Blame HistoryRaw
Split the tree three ways, and let the phone be Flutter's 7070931 nandi 7d ago1# The ClojureDart half
2
3Nothing here builds yet. This is the boundary, drawn before the port rather
4than after it, so that the question "can this file go on the phone?" has a
5filesystem answer.
6
7## The three trees
8
9```
10common/ .cljc both compilers. No jolt, no glimmer, no dart.
11src/ .clj jolt: glimmer, jolt.ffi, the cosmic and tui backends.
12flutter/ .cljd ClojureDart: Flutter widgets, dart:io, dart:ffi.
13```
14
15The extension is the boundary and the compilers enforce it. ClojureDart reads
16`.cljd` and `.cljc` and never `.clj`, so a namespace that reaches for
17`jolt.host` cannot accidentally end up in the APK — it is a `.clj` and the Dart
18compiler cannot see it. jolt reads all three, which is why `common/` works at
19all: one copy of `frq.clock`, compiled twice.
20
21Where both need a namespace but the answer differs, `.cljd` wins over `.cljc`
22in ClojureDart's own resolution, so a file here shadows a shared one without
23either side knowing. Reader conditionals work too, with one trap from
24ClojureDart's FAQ: the `:clj` feature is always on under cljd, so `:clj` goes
25**last** in a conditional, and macro code that wants the Clojure path during
26host evaluation asks for `:cljd/clj-host`.
27
28## What has crossed
29
30`frq.io` is the seam — the host's job named once, with `frq.io.jolt` answering
31it on the desktop and `frq.io.dart` here. It carries the filesystem, the
32environment, the config directory and the clock.
33
34Moved to `common/` and running under jolt today:
35
36| namespace | lines | note |
37|---------------|-------|-------------------------------------------------|
38| `frq.emoji` | 1,914 | data; nothing to port |
39| `frq.glyphs` | 84 | data |
40| `frq.av.dial` | 117 | already touched neither jolt nor glimmer |
41| `frq.clock` | 93 | zone-hunting moved into the backends |
42| `frq.store` | 122 | `install -m 600` became `write-private-file!` |
43
44`frq.clock` is the shape the rest should follow. It used to open with four
45guesses at the reader's zone — `TZ`, the target of `/etc/localtime`, the file
46itself by path, then Android's `persist.sys.timezone` — and then convert days
47to a date by printing one with `jolt.time.local` and taking a `subs` of the
48result. Both are gone: the guessing is a libc question and lives in
49`frq.io.jolt`, where Dart answers it in one call instead; the conversion is
50eleven lines of Hinnant's algorithm, checked against `java.time.LocalDate` for
51every day from 1901 to 2052.
52
53## What has not
54
55Roughly 4,000 lines are portable in substance and still `.clj` because the seam
56does not reach far enough yet. In the order worth doing them:
57
581. **`frq.wire`, `frq.msgsig`** — need a crypto seam beside the io one.
592. **`frq.irc`** (433) — the parser is pure; the reader is a blocking thread in
60 a `future`, and Dart has no threads. It becomes a `Stream` over
61 `SecureSocket`, which is also what makes TLS work on the phone at all.
623. **`frq.atproto`** (209), **`frq.oauth`** (182) — hand-rolled HTTPS over
63 `jolt.mvn-http`'s OpenSSL bindings, which is why sign-in is desktop-only
64 today. `dart:io` has TLS in the runtime; this is the single biggest thing
65 the port buys.
664. **`frq.state`** (1,930) — mostly portable logic, but its ratoms are
67 glimmer's. Needs the reactive layer decided first.
685. **`frq.app`** (1,834) — not a port. Flutter brings its own reconciler, so
69 the screens are rewritten against `cljd.flutter`.
70
71Not coming: `frq.tui` (no terminal Flutter), `frq.cosmic` (libcosmic is
72desktop-only), and the media plane — `moq/`, `codec/`, `capture/`, `av/`, about
733,800 lines of FFI against C libraries that do not exist on Android either way.
74`dart:ffi` does not conjure V4L2; that half wants Flutter's camera and audio
75plugins and is its own project.
76
77## To make this real
78
791. Pin `tensegritics/clojuredart` in `deps.edn` — it says `PIN-ME`.
802. Get a Flutter SDK and the cljd toolchain into the flake. Neither is there.
813. `clj -M:cljd init`, then `clj -M:cljd flutter`. (There is no `release`
82 subcommand — a release build is `clj -M:cljd compile` followed by
83 `flutter build`.)
844. `frq.io.dart` is written from the docs and has never been compiled. Expect
85 its interop to be wrong in detail.
86
87There is no other APK to fall back on. The jolt one — `nix/android.nix`, the
88`android/` manifest and Java glue, the `.#apk` outputs and `just apk` — is
89gone, along with the jvui and Vidya backends it painted through. Until step 2
90exists, frq has no Android build at all, and that is the honest state.