Commit graph

21 commits

Author SHA1 Message Date
Adam Brown
3a85c461dd
Stop large story imports from freezing the app
Some checks are pending
Build CI / android-instrumented-tests (push) Waiting to run
Build CI / iOS compile & test (push) Waiting to run
Build CI / iOS UI tests (push) Waiting to run
Build CI / build (push) Waiting to run
Build CI / static-analysis (push) Waiting to run
PublishInternal / publish-google-play (push) Waiting to run
Importing a 100k+ word Markdown story froze the editor and consumed all its
RAM. Parsing was never slow (~60ms for 120k words); creating the scenes was,
and quadratically in their number. Resolving a path by id regex-parsed every
filename in the project, sibling counts re-listed the parent directory several
times per scene, and the order re-padding loop re-scanned once per renamed
sibling.

The cached directory scan now carries a scene-id index and a child-count
index, in ScenePathIndex. A created file is absorbed in place; anything else
drops the cache. The re-padding loop reads what it needs before it rather than
inside it, so a run of renames costs one re-scan instead of one each.

Measured on an in-memory filesystem, importing 400 scenes drops from 2.1s to
~0.3s and 1600 from 37s to ~3s. A real disk gains more, since the discarded
scans are syscalls.

Also builds the import preview off the UI thread, debounced and single
flighted, shows the dialog while it reads instead of leaving the projects list
looking idle, makes the preview pane lazy, and ignores the local scratch
directory.
2026-07-30 21:10:36 -07:00
Adam Brown
f9f57ca510
Redesign the home page for writers (#779)
It was very oriented towards technical details before, now it's more about hammer's value for writters
2026-07-27 13:44:55 -07:00
Adam Brown
60a61541e9
Harden release task against network failures 2026-06-08 21:45:29 -07:00
Adam Brown
d676429fd6
update ignore 2026-06-07 23:27:30 -07:00
Adam Brown
db4343d8f1
Adds a full monitoring subsystem to the server admin panel
- Data foundation: SQLDelight tables for API metrics, error logs, and
login attempts with a v1→v2 schema migration
- Metrics pipeline: per-endpoint request counts, latency, and error
rates collected via a Ktor plugin; daily rollup job with configurable
retention windows
- Error tracking: fingerprinted deduplication, occurrence counts,
first/last seen timestamps, and email alerting on persistent errors
- Security page: login-attempt tracking, brute-force/spray detection
with cooldown alerts, optional IP storage
- Admin dashboard UI: performance charts (Frappe), error panel with
route filter and JSON export, live log viewer (10k ring buffer),
security event feed
- Alert deep-links from the dashboard into filtered error views
- Settings UI: all monitoring options converted to toggle switches;
master switch disables and grays out sub-options via JS; email field
conditionally required with htmx:before-request validation
2026-06-05 19:19:11 -07:00
Wavesonics
331ff2336c Prep iOS Info.plist + profile reference for App Store submission
Declare ITSAppUsesNonExemptEncryption=false so App Store Connect stops
asking on every upload, drop the legacy armv7 UIRequiredDeviceCapabilities
entry, and align CFBundleShortVersionString with the shared codebase
version (3.0.3) in gradle/libs.versions.toml. pbxproj now references the
freshly-issued "Hammer AppStore iOS" provisioning profile.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 23:16:31 -07:00
Wavesonics
496e05d934 clean up ios user files 2026-05-20 22:45:14 -07:00
Wavesonics
5c4da8909c Add Mac App Store packaging for the desktop module
Pass -PmacOsAppStoreRelease=true -PbuildNumber=N to produce a sandboxed,
signed .pkg ready for TestFlight upload via Transporter / iTMSTransporter.
Apple Silicon only for v1; JBR runtime stays.

- Sandbox-friendly entitlements (network.client + user-selected files
  for the app; JIT/unsigned-mem/disable-library-validation for the JVM).
- JNA libjnidispatch.jnilib is pre-extracted into desktop/resources/macos/
  and located via -Djna.boot.library.path so JNA never tries to extract
  to a temp dir at runtime (which would hang silently in the sandbox).
- com.apple.application-identifier / team-identifier baked into the app
  signature so it matches the embedded provisioning profile.
- UrlLauncher drops the Runtime.exec("open") fallback in favor of the
  Desktop API only.
- Projects-directory picker is hidden in App Store builds; the sandbox
  container's ~/Documents is the only writable location for v1.
- unquarantineMacApp Gradle task strips com.apple.quarantine xattrs
  before pkg packaging to avoid App Store validation errors.
- New helper: desktop/scripts/build-appstore.sh — pre-flight checks,
  one-shot build, codesign + pkgutil signature verification.

Signing assets and API key live in desktop/{embedded,runtime}.provisionprofile
and desktop/secrets/ (both gitignored).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 17:46:07 -07:00
Adam Brown
0d6f87f480
Add Gradle toolchain/wrapper config and ignore .claude directory 2026-04-26 20:13:28 -07:00
Adam Brown
c015999a40
Ignore 2026-02-07 22:28:07 -08:00
Adam Brown
ff4ecd194f Create gradle tasks to produce these distributions 2025-12-26 18:44:56 -08:00
Adam Brown
2bb490aa3f
Frontend rewrite to Hmx (#435) 2025-12-19 01:28:28 -08:00
Adam Brown
18f59ff0eb Converted from Moko Resources to Compose Resources 2025-12-10 01:24:49 -08:00
Adam Brown
91ad3374fe Fix obfuscation crashes 2024-11-02 11:09:17 -07:00
Adam Brown
40de1fd521 Ignore test report dirs 2024-10-19 19:52:25 -07:00
Adam Brown
92d224767d add .kotlin to ignore 2024-05-26 16:07:54 -07:00
Wavesonics
9278504355 Working on Android publishing 2023-08-09 20:54:45 -07:00
Adam Brown
ef5667ace5 Prep for Google Play release 2023-04-24 17:55:05 -07:00
Wavesonics
a4fdc68785 Windows release specs 2023-02-01 22:06:04 -08:00
Adam Brown
ee6784b57a Android up and running 2022-06-02 01:13:43 -07:00
Adam Brown
a30817a109 Initial commit 2022-05-30 23:16:54 -07:00