Releases: verycareful/kern
Kern 0.1.9.0
[0.1.9.0] — 2026-06-26 18:55 IST · UI
This release is the UI overhaul. Every screen in the app has been reskinned against a new design system built from scratch on top of Material 3. The token layer, typography, component library, icon set, and settings screen all land together here. Nothing about how Kern reads, edits, or saves files has changed — this release is entirely about how it looks and feels.
Design system
Kern now has its own token layer (KernColorScheme, KernTheme, KernType, KernRadius, Density) sitting above Material 3's ColorScheme. Legacy call sites that reference Material 3 tokens directly continue to work without changes; the new tokens project onto them at theme resolution time.
Colour. Light and dark neutral palettes, 12 user-selectable accent colours, and per-format identity hues (the colour associated with each file type) are all defined as first-class tokens. Accent and theme choices persist across sessions.
Radius. A single locked value: Soft 6dp, applied consistently everywhere. No mixed corner radii.
Typography. Four font families are bundled as res/font/*.ttf under SIL OFL licences:
| Family | Use |
|---|---|
| Outfit | UI chrome — labels, buttons, metadata |
| Quicksand | Wordmark |
| IBM Plex Mono | Cell references, technical metadata |
| Sora | EPUB reading body |
Brand assets. Theme-aware chevron mark and wordmark lockup PNGs (res/drawable-nodpi/) that switch correctly between light and dark.
Component library (KernComponents.kt)
A shared set of composables used consistently across every screen:
KernIconButton · KernSegmented · FileBadge · OnDevicePill · SectionLabel · KernDivider · KernToggle · KernTopBar · KernBottomSheet · SheetActionRow · EditorToolbar · ToolbarButton · ToolbarSeparator
KernTopBar applies statusBarsPadding() and EditorToolbar applies navigationBarsPadding(), which fixes the top-bar/status-bar and bottom-toolbar/navigation-bar clashes that existed across all editors and the settings screen.
Icon set (KernIcons.kt)
Semantic mappings over Material Outlined icons, plus a custom GitHub vector. All icon references in the app go through this file rather than raw Material icon names.
Settings screen
A new Settings screen is wired from the file browser's settings cog (Destinations.SETTINGS). It is organised into grouped surface cards:
Appearance — Theme (light / dark / system) and Density selector.
Accent — 12-swatch colour picker. The selected accent propagates to header highlights, selection states, and per-format hue tints throughout the app.
Files & storage — Scan toggles for Documents and Downloads folders. These are now functional: FileScanner skips any folder whose toggle is off, so its files no longer appear in the browser or open in the app.
Privacy & permissions — Network access and analytics are shown as permanently off (no network permission in the manifest). Storage access status reflects the real runtime permission state and taps through to the system grant dialog when missing (previously this row was hardcoded to "GRANTED").
About — Version, licence (AGPL-3.0 text displayed in a full-screen scrollable dialog from res/raw/license.txt), Source code (opens the Kern GitHub repo), and PDF engine (opens the Qyra GitHub repo). Both links use external intents and require no network permission.
Settings are persisted via KernSettings.kt, an observable SharedPreferences-backed store for theme mode, accent, density, scan-documents, and scan-downloads.
Per-screen reskin
Every screen has been updated to the new design system. Notable specifics:
File browser — BrandMark + OnDevicePill header, KernSegmented tabs (Recent / All / Pinned), KernToggle chips for format filtering, reskinned list rows and grid cards, KernBottomSheet for sort and per-file actions, empty and missing-permission states.
Grid editors (CSV and Excel) — Sunken cell-reference pill styled in IBM Plex Mono, accent-coloured header selection, per-format hue tints on column and row headers, EditorToolbar at the bottom, zoom badge.
Word editor — Paper-page surface with updated formatting toolbar.
EPUB editor — Reading body set in Sora, chapter navigation and TOC sheet reskinned.
PowerPoint editor — 16:9 canvas, thumbnail rail, slide toolbar.
PDF editor — Page and zoom pills, tools bottom sheet.
EditorChrome — Migrated to KernTopBar and tokens; toolbar and extra-actions slots added for per-editor extensibility.
Bug fixes
Browser rescanning. The file list was being rebuilt on every navigation return. It now scans once on first load, again when a scan toggle changes, and again after a permission grant. Returning from an open file shows the cached list.
Scan toggles had no effect. The Documents and Downloads scan toggles in Settings were stored but not read by FileScanner. They are now respected.
Storage permission status was hardcoded. The Privacy & permissions card always showed "GRANTED" regardless of the real state. It now reads the live permission and updates when the user grants or revokes access.
Status-bar and navigation-bar clashes. The settings screen, all editor top bars, and all file viewers now apply statusBarsPadding(). Editor bottom toolbars apply navigationBarsPadding(). The visual overlap with system bars is gone.
Test results
| Environment | Suites | Tests | Result |
|---|---|---|---|
| Android Studio (device) | 5 | 15 | All passing |
No new automated tests in this release. All changes are UI and design. A tests-only release (0.1.9.1) is due next.
What comes next
Currently, not much. I will soon finish up Alpha by focusing on each file type and improving them one by one, especially for editing.
Kern 0.1.8.1
[0.1.8.1] — 2026-06-13 19:38 IST · First Major Release
This is the first release of Kern designated as a major milestone. Over the past eight days, the project has grown from an empty scaffold into a fully-featured, on-device document editor for Android: six format editors, a native file browser, a compiled PDF engine, resizable grids, and a complete automated test suite. Version 0.1.8.1 closes the work begun in 0.1.8.0 by adding test coverage for the new grid dimension system and confirming the codebase is clean for the milestone tag.
What's in this release
Resizable grid columns and rows · #12
The spreadsheet grid now supports drag-to-resize for both columns and rows. Explicit drag handles appear at the trailing edge of each selected header — replacing the previous invisible hit-target approach that was hard to discover and easy to misfire. Double-tapping a column or row header auto-resizes to fit the longest content in that column or row. Custom dimensions persist to .xlsx files via Apache POI, so a resized workbook reopens at the same proportions it was saved with.
Implementation notes for contributors:
- Handles are rendered via
Modifier.zIndexand non-consuming pointer input, which means they sit above the grid without blocking the two-finger pan gesture. - The subcompose layout uses binary search over a precomputed offset map to locate visible rows and columns under dynamic (non-uniform) cell sizes — a meaningful performance improvement over the previous linear scan.
- Dimension serialisation stores column widths and row heights in the POI
SheetAPI's native units and round-trips them through save and reopen without drift.
Test coverage for grid dimensions
A new test, applyEdits_preservesColumnWidthsAndRowHeights, was added to ExcelDocumentTest.kt. It exercises the full POI serialisation path: a sheet with custom row heights and column widths is written out, read back in, and the recovered values are asserted to match the originals. This closes the gap left by 0.1.8.0, where the feature shipped ahead of its unit test.
The .skill-extracted artefact has also been removed from Git tracking and the result verified in the tree.
Test results
| Environment | Suites | Tests | Result |
|---|---|---|---|
| Android Studio (device) | 5 | 15 | ✓ All passed |
The count increased from 14 to 15 with the addition of applyEdits_preservesColumnWidthsAndRowHeights.
Cumulative changelog since project start (0.1.0.0 → 0.1.8.1)
A summary of everything that has shipped across the eight-day development run, for readers coming to the project for the first time.
Format editors
| Format | Read | Edit | Save in place | Export copy | Notes |
|---|---|---|---|---|---|
| CSV | ✓ | ✓ | ✓ | ✓ | Scrollable grid, add row/column, insert at selection |
Excel .xlsx |
✓ | ✓ | ✓ | ✓ | Multi-sheet, merged cells, resizable grid, formula display |
Word .docx |
✓ | ✓ | ✓ | ✓ | Paragraph text, heading styles, pinch-to-zoom |
PowerPoint .pptx |
✓ | ✓ | ✓ | ✓ | Text boxes per slide, pinch-to-zoom |
| ✓ | — | — | ✓ | Viewer + merge/extract via native lopdf bridge | |
| EPUB | ✓ | ✓ | ✓ | ✓ | Chapter-by-chapter, TOC, DRM detection |
File browser (added 0.1.7.0): lists Documents and Downloads; recent, all-files, and pinned-favorites views; search; per-format filter chips; list/grid toggle; sort by date, name, size, or type; per-file share, info, and delete; persisted pins and recents via SharedPreferences.
Grid editor highlights (Excel and CSV): 2D virtualised subcompose layout with true merged-cell spanning (0.1.7.7); LazyRow-based horizontal axis with bidirectional scroll sync (0.1.7.6); insert-at-selection for rows and columns (0.1.7.5); per-sheet scroll reset on tab switch (0.1.7.4); resizable columns and rows with drag handles and auto-fit (0.1.8.0–0.1.8.1).
Native PDF bridge: The kern-bridge Rust crate wraps lopdf and is cross-compiled to arm64-v8a, armeabi-v7a, and x86_64 via cargo-ndk in CI. The bridge is bundled into the APK and its availability is detected at runtime; tools degrade gracefully when the .so is absent (0.1.5.0, 0.1.7.3).
Quality and correctness
- Unsaved-changes guard on back navigation across all editors (0.1.7.2).
- Error feedback split between
AlertDialog(long/instructional messages) andSnackbar(short confirmations), per Material 3 guidelines (0.1.7.8). mutableStateOf<Int>replaced withmutableIntStateOfacross all ViewModels to eliminate boxing allocations (0.1.7.9).Modifier.clickableonSurfacereplaced with the nativeonClickparameter (0.1.7.10).- Dependencies:
compose-bomupdated to2026.05.01,apache-poito5.5.1(0.1.7.11).
Automated tests (added 0.1.7.1, grown to 0.1.8.1):
| Suite | Coverage |
|---|---|
| CSV | Parse/serialise round-trip, ragged rows, quoting, column labels |
| Excel | Multi-sheet read; edit-only save preserves untouched cells and sheets; column/row dimension persistence |
| Word | Paragraph text and coarse style read; edit-only save |
| PowerPoint | Slide text read; edit-only save |
| EPUB | Spine/TOC/block parsing; edit-only save with correct mimetype ordering; DRM rejection |
All test fixtures are generated in-test via POI, OpenCSV, Jsoup, and zip — no binary files committed to the repository.
Upgrade notes
No migration steps are required. The .skill-extracted file has been removed from Git tracking; if you have it locally, git rm --cached .skill-extracted will clean it up.
What comes next
Comprehensive UI redesign is on the way!
Kern 0.1.8.0
Full Changelog: 0.1.7.11...0.1.8.0
Kern 0.1.7.7
Full Changelog: 0.1.7.6...0.1.7.7
Kern 0.1.7.6
Full Changelog: 0.1.7.5...0.1.7.6
Kern 0.1.7.5
Full Changelog: 0.1.7.4...0.1.7.5
Kern 0.1.7.4
Full Changelog: 0.1.7.3...0.1.7.4
Kern 0.1.7.3
Full Changelog: 0.1.7.2...0.1.7.3
Kern 0.1.7.2
Full Changelog: 0.1.7.1...0.1.7.2
Kern 0.1.7.1
Full Changelog: 0.1.7.0...0.1.7.1