Skip to content
CAI
Software that uses CAICheck a score

hrj/abandon

56.6

Adequate · 20 September 2026

7k

lines of production code

Scala

with TypeScript

1

measurement over time

CAI band scale
CAI lens gauges

What this system is

Abandon is a double-entry accounting tool that processes ledger files to generate financial reports such as balance sheets, profit and loss statements, and transaction registers. It provides multiple interfaces for interacting with this data, including a command-line interface, a desktop GUI, and a web-based UI. The system supports advanced features like transaction filtering, glob-based file input, and secure handling of nested archives, while also serving as the foundation for reusable Scala libraries for file operations and testing.

How it got here

2013 — Scala 3 migration and modularization

12 changes.

The project underwent a significant architectural overhaul, migrating the build system to SBT 1.12 and Scala 3 while restructuring the codebase into a multi-project layout. This period focused on refactoring the GUI and CLI components into modular units, introducing a new Svelte-based web interface, and enhancing core functionality with transaction filtering and improved file handling.

2014–2022 — Core library and testing infrastructure

6 changes.

This period focused on establishing the foundational infrastructure for the project by releasing the better-files-core library and developing the DirSuite testing framework. Significant effort was also dedicated to expanding test coverage for the Abandon application, including CLI argument handling, security validations, and comprehensive functional tests for accounting reports.

2023–2026 — Web UI and API implementation

4 changes.

This period focused on building the initial web interface and backend API for the Abandon application, introducing a SvelteKit-based UI and a lightweight HTTP server library. The work included implementing core data models, transaction reporting endpoints, and custom JSON serialization utilities to support the new web features.

Features

Add complete example with configuration, ledger data, and documentation

A new complete example has been added to the \examples/complete\ directory, providing a self-contained walkthrough for the \abandon\ tool. This includes a \README.md\ explaining the configuration syntax and file structure, an \accounts.conf\ file demonstrating report generation (Balance Sheet, Profit and Loss, Registers), export formats (XML, Ledger), and constraint definitions (date ranges, EOD constraints). The example is populated with realistic transaction data across multiple ledger files (\accounts.ledger\, \opening.ledger\, \invoices.ledger\, \cash.ledger\) covering opening balances, daily expenses, invoices, and payments.

examples/complete · high confidence

Add picoserve HTTP server library

Introduces the picoserve library (org.limium.picoserve) providing a lightweight HTTP server implementation built on Java's built-in HttpServer. The library includes a Handler class for mapping paths and HTTP methods to processors, a Server class that manages request routing, query parameter parsing, and response handling, and a ServerBuilder for convenient configuration of ports, backlogs, and handler registration. This enables the CLI to expose HTTP endpoints for programmatic interaction or integration.

cli/src/main/java · high confidence

Added DirSuite testing framework and license

Added the DirSuite testing framework for Scala, including the Apache 2.0 license file, the main DirSuite class, and the TestValidator utility. The TestValidator provides default validation methods for comparing text and XML test outputs against reference files, supporting directory-based test execution.

dirsuite · high confidence

Added Replit configuration for cloud development

A new \.replit\ configuration file has been added to enable running the project directly in the Replit cloud IDE. This setup defines the required Java and Node.js modules, installs SBT, and configures a workflow to start the application on port 5000, mapping it to external port 80 for webview access.

(repo-wide) · high confidence

Added launch scripts and configuration for CLI, GUI, and IDE formatting

New shell and batch scripts (abandon\_cli, abandon\_gui) are now provided to launch the application, automatically detecting JAVA\_HOME if set. The GUI launcher includes macOS-specific dock options (icon and name). Additionally, appstart.properties defines the main class and follow behavior, while formatterPreferences.properties configures Scalariform code formatting rules.

tools · high confidence

Added simple accounting example with sample data and configuration

The examples/simple directory now includes a complete, runnable example consisting of an accounts.conf configuration file and an accounts.ledger data file. The configuration defines report options, including a Balance Sheet and a Profit and Loss report, specifying which account types are considered right-side accounts and which account patterns to match for each report. The ledger file provides sample transactional data from March 2012 to February 2013, covering opening balances, expenses, assets, liabilities, and income, allowing users to see how the tool processes real-world accounting entries.

examples/simple · high confidence

Initial release of better-files-core library

This change introduces the core source code for the better-files library, adding a comprehensive set of Scala wrappers and utilities for file system operations. Users gain access to a fluent DSL for common file actions (such as copy, move, delete, and permission management), a \Dispose\ typeclass for safe resource handling similar to Java's try-with-resources, and a \Scanner\ for efficient text parsing. The release also includes support for file monitoring via \WatchService\, resource loading from classpaths, and robust handling of Unicode character sets with byte-order markers.

better-files-core · high confidence

Initial release of the web UI for the Abandon application

This change introduces the complete web-based user interface for the Abandon application, built on SvelteKit. The UI provides a tabbed interface allowing users to view account balances in a hierarchical tree, browse a monthly register of transactions, and drill down into individual account transaction details. A key interactive feature allows users to select specific monetary amounts (by holding Ctrl/Cmd and clicking) to calculate and display real-time statistics—including count, sum, average, min, and max—in the header. The interface also handles empty states by displaying a message for accounts with no transactions and includes error banners for application-level issues.

web-ui · high confidence

Initial web UI and API implementation

This change introduces the first version of the web interface and its underlying API. It adds core data models for transactions and posts, including logic to demultiplex and 'cook' transaction data for reporting. A new WebAPI provides endpoints to generate account balance reports and monthly transaction registers, with support for filtering inactive accounts. Additionally, a custom JSON serialization utility is included to handle formatting and escaping of special characters for the web response.

cli/src/main/scala/co/uproot/abandon/web · high confidence

Architecture

Refactored GUI reports into modular components and upgraded to ScalaFX 3

The GUI architecture has been restructured to improve maintainability and readability. Report rendering logic for the Balance, Register, and Transaction views has been extracted from the main UI object into dedicated, modular components (BalanceUIReport, RegUIReport, TxnUIReport), each implementing a common UIReport trait. The main application entry point has been migrated from JFXApp to JFXApp3, requiring updated imports and dependency handling. Additionally, the Info tab's placeholder text has been updated to reflect actual file processing status, and the codebase now uses modern Scala collection conversions.

gui/src/main/scala · high confidence

Behavioural changes

Added ProGuard configuration for GUI assembly

A new ProGuard configuration file has been added to the GUI module to define rules for obfuscation, shrinking, and optimization of the Scala and JavaFX application. This configuration ensures that critical classes, such as the main entry point and Scala concurrency primitives, are preserved during the build process, preventing runtime errors caused by aggressive code removal or renaming.

gui · high confidence

Application entry point simplified to CLI-only execution

The main entry point in Main.scala has been refactored to exclusively launch the command-line interface (CLIApp), removing the previous conditional logic that attempted to detect and launch a graphical user interface (GUI) via JavaFX. The code responsible for ensuring JavaFX availability and invoking the GUI launcher has been commented out, meaning the application now starts directly in CLI mode regardless of command-line arguments.

src/main · high confidence

Introduction of default theme stylesheet with specific font and color styling

A new default theme stylesheet (default\_theme.css) has been added to define the visual appearance of the GUI. This change introduces specific styling rules: the '.report' class now uses a monospaced font stack (prioritizing 'Monospaced', 'Droid Sans Mono', etc.) at 11pt size, while '.txn-date-line' and '.txn-comment' classes are styled with bold text and specific colors (dark gray \#444 and blue \#4169e1 respectively).

gui/src/main/resources · high confidence

Refactored report output into a dedicated ReportWriter component

The logic for writing reports to files and the console has been extracted from App.scala into a new ReportWriter class. This change ensures that report content is consistently written to both specified output files and the screen, automatically creates parent directories for output files if they do not exist, and handles the formatting of headings, code blocks, and XML output through a unified interface.

cli/src/main/scala/co/uproot/abandon · high confidence

Support for transaction filters and improved file input handling

Users can now filter transactions using the new --filter option (e.g., --filter onOrAfter=2023-01-01) and input files can be specified using glob patterns (glob:) or regular expressions (regex:) to automatically include multiple files. The file watcher has been moved to the base module and now returns updated paths on changes, while the parser tracks input positions to provide more precise error messages.

base/src/main · high confidence

Test coverage

Added DirSuite testing framework components; Added comprehensive test coverage for core Abandon components; Added test coverage for CLI argument handling, error cases, and security validations; Added tests for JSON utility methods in WebAPI; Expanded functional test coverage for Abandon.

Dependencies

Introduce web-ui frontend and modernize Scala build configuration

The project now includes a new web-ui module built with Svelte 5, SvelteKit, and Vite, adding a static web interface alongside the existing CLI and GUI. The Scala build has been upgraded to Scala 3.8.4 and restructured into a multi-project layout (base, cli, gui, dirsuite, better-files-core) with centralized dependency management. Key dependency updates include upgrading scalafx to 1.0.0-M4, adding stryker for mutation testing, and replacing joda-time with java.time.

(dependencies) · high confidence

Migrate build to SBT 1.12 and Scala 3 with updated dependencies

The project build has been upgraded to SBT version 1.12.15 and migrated to Scala 3, replacing the legacy \build.scala\ with a modern \Dependencies.scala\ object that defines current library versions (including ScalaTest 3.2.20, Scallop 6.0.0, and ScalaFX 19.0.0-R30). The build configuration also updates \sbt-assembly\ to 2.4.2, enables the \sbt-native-image\ plugin (0.5.0) for GraalVM support, and adds \sbt-buildinfo\ and \sbt-stryker4s\ for code generation and mutation testing, while disabling older plugins like \sbteclipse\ and \sbt-proguard\.

project · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Baseline

  • First survey — no prior run to compare against. CAI 57.

Lenses

  • Code Health 69
  • Architecture 88
  • Maturity 59
  • Readiness 67
  • Security 95
  • Accessibility 45

Changes since last survey

  • 300 commits — 280 feature/other, 20 fixes

By area

  • (repo) — 127 commits
  • project/plugins.sbt — 34 commits
  • cli/src — 30 commits
  • project/build.properties — 30 commits
  • (root) — 27 commits
  • project/Dependencies.scala — 21 commits
  • base/src — 11 commits
  • .github/workflows — 8 commits
  • web-ui/src — 4 commits
  • web-ui/package-lock.json — 3 commits
  • .github/scala-steward.conf — 2 commits
  • better-files-core/src — 2 commits
  • .agents/memory — 1 commit

Notable commits

  • fix: Fix CWE-209: Generation of Error Message Containing Sensitive Information
  • fix: Fix common Scala compiler warnings
  • fix: Fix deprecation and compiler warnings across all subprojects
  • fix: Fix file watcher exception handling and display error in web UI
  • fix: Fix path traversal vulnerability in Web UI static handler
  • fix: Merge pull request #496 from hrj/fix-account-tab-empty-state-5095868263337885942
  • fix: Merge pull request #497 from hrj/fix-scala-compiler-warnings-17241675499551191457
  • fix: Merge pull request #504 from hrj/fix-exception-leak-5972526327476462177
  • fix: Merge pull request #507 from hrj/fix-file-watcher-exception-handling-8357718374124391010
  • fix: Merge pull request #508 from hrj/fix/jsonutils-xss-escaping-14235257952258508794
  • fix: Merge pull request #509 from hrj/fix/zip-slip-vulnerability-6424924777851354466
  • fix: Merge pull request #510 from hrj/sec-fix-path-traversal-web-ui-1838166881103505002
  • fix: Merge pull request #511 from hrj/fix-scala3-deprecation-warnings-15683815294576241486
  • fix: Revert "move example reports to separate folder and git ignore it"
  • fix: Update WebAPI.scala Map type match to fix unchecked warning
  • fix: fix compilation
  • fix: fix compiler warnings
  • fix: fix compiler warnings
  • fix: fix(security): sanitize path names in ZipFileReader to prevent Zip Slip
  • fix: minor: fix compiler warnings
  • …and 280 more

Architecture

  • 0 containers · 4 bounded contexts · 3 dependency edges (baseline)

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

hrj/abandon was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 20 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 709e1cce1dee6df2d5bdea2f9a80bffd1cb2237c — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-b51f968c9b10.