Skip to content

Ashish 06 17 26#560

Merged
markkerzner merged 36 commits into
mainfrom
ashish-06-17-26
Jun 29, 2026
Merged

Ashish 06 17 26#560
markkerzner merged 36 commits into
mainfrom
ashish-06-17-26

Conversation

@ashishup01

Copy link
Copy Markdown
Collaborator

Added free tier data limitation.

markkerzner and others added 30 commits April 29, 2026 23:15
Use the empty main area — That's a lot of wasted space. You could show a welcome/quick-start panel there with shortcuts like "Open Project", "New Project", recent projects list, or a brief project summary when one is loaded.
2.
Make the window resizable — It's currently set to setResizable(false). Resizable windows are generally better UX, especially if you add content to the main area.
3.
Add the version number to the title or status bar (e.g. v10.8.4) — helpful for support/debugging.
Replaces the simple welcome panel with a 4-step workflow guide:
Project → Data → Process → Review. Steps update dynamically
based on project state (green checkmark for complete, blue for
current, gray for future).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Separate the combined Inventory/Stage/Process step into distinct
Inventory and Stage steps, each wired to its own action. Update
getCurrentStep() to detect progress via the inventory file and
staging dir in addition to inputs and results.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Hook refreshStepper() into each stage's completion point so the
stepper circles advance live: synchronously after inventoryProject(),
and from the setDone() callbacks of StagingProgressUI and
ProcessProgressUI. Stepper clicks were already wired to their actions.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Commit 11aebb0 accidentally duplicated the --convert-to/inputFile
argument, producing a malformed soffice command that hangs LibreOffice
for the full process timeout. Restore the single known-good conversion
command.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
A shared default LibreOffice profile (from a GUI instance, the startup
system check, or a concurrent/prior run) causes headless --convert-to
to hang on the profile lock. Give each invocation its own
-env:UserInstallation profile under the per-file temp dir, so
conversions never collide — verified converting an HTML file to PDF.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Saved web pages (e.g. a forum archive with 121 external references)
made soffice's headless HTML->PDF import fetch remote images, CSS, and
dead ad/tracking servers, hanging for the full process timeout.

Before rendering HTML, strip every external reference with jsoup:
remove script/link/base/iframe/object/embed tags, drop remote
src/href/background/poster/srcset attributes, and neutralize remote
url(...) in inline and embedded CSS. The renderer then never makes
outbound network calls -- required for forensic soundness (no phoning
home / tracking pixels) and it eliminates the hang.

Verified end-to-end: the forum page that previously hung now sanitizes
to zero fetchable remote references and soffice converts it to PDF in
seconds.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Process.destroy() only signals the parent. Wrapper launchers like the
soffice script spawn a child (soffice.bin) that was left orphaned and
still running after a timeout, accumulating stuck processes. On timeout,
forcibly destroy the captured descendant handles and the parent, then
reap. Verified: a wrapper that spawns child workers leaves zero
survivors after the timeout kill.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The final stepper step now calls openReviewUI() (the "Go to review"
action that opens the review web UI), matching user expectation,
instead of openOutputFolder() which only opened the output files.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The review web app is the freeeedui webapp (context /freeeedui), but the
default Review endpoint was http://localhost:8080/ — Tomcat's root splash
page, not the review app. Point the default (and the settings-UI example)
at http://localhost:8080/freeeedui.

Also enable Tomcat startup in start_dev_services.sh so the review web app
actually runs alongside Solr and Tika in development.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Implements phase 1 of #549 (registration + feedback button):

- Soft-required registration dialog on launch (Name/Company/Email).
  Re-prompts each launch until the user registers or clicks "Don't
  ask again". Never hard-blocks startup. This is identification, not
  licensing - the open-source core stays free and unlocks nothing.
- Help > "Send Feedback / Request Support" dialog.
- Both use the user's own email client via mailto: (UtilUI.openMailClient),
  so nothing is transmitted until the user presses Send. No case data
  or document content is ever included.
- Settings keys + accessors for user identity and registration status;
  Version/OS auto-appended to messages. Support address: mark@scaia.ai.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replaces the soft, skippable registration prompt with a required free
activation gate that blocks the app until the user activates. The goal is
unchanged - stay in touch with users - but a hard gate ensures we actually
reach everyone, while keeping registration free for all editions.

Flow:
- On launch, the user enters Name / Company / Email and an optional
  "Tell us a few words about your project", then clicks "Request Activation
  Key" (opens their mail client to mark@scaia.ai via mailto:).
- We reply with their free per-user key; they paste it and click Activate.
- The key is verified entirely offline (HMAC-SHA256 of the normalized email)
  so no backend is needed. Closing the dialog quits the app.

Details:
- Activation: offline key engine + a main() that generates a key for an
  email (used when replying to users).
- UserRegistrationDialog: reworked into the modal activation gate, with the
  optional project field persisted and included in the registration email.
- Settings/ParameterProcessing: user-project and user-activation-key storage;
  isActivated() re-validates the stored key against the stored email.
- FreeEedUI: gate runs before the main UI; quitting exits.

The key costs nothing and unlocks the same software for everyone - it only
guarantees an email handshake. Issue #549 updated to reflect this direction.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
SUPPORT_EMAIL now lists mike@sicuroanalytics.com and mark@scaia.ai, so the
mailto: opens with both owners in the To field for every registration request
and feedback message. This is the vendor inbox only - each user still registers
with their own email, which remains their identity for any paid add-ons.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Convenience wrapper around org.freeeed.services.Activation for replying to
registration emails: ./genkey.sh <email> [<email> ...] prints each user's free
activation key. Auto-locates the compiled classes or the runnable jar.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The previous symmetric HMAC scheme shipped its secret in the open-source repo,
so anyone could mint keys. Switch to Ed25519: the app now embeds only the
PUBLIC key and verifies a key offline; it can no longer create one. The private
signing key and the generator live solely in the private AI Advisor repo
(scripts/freeeed_activation.py) and never ship here.

- Activation: verify-only via java.security Ed25519 (JDK 17 runtime; generic
  JCA API so it still compiles at source level 11). Removed the secret, the
  HMAC minting, and main().
- Removed genkey.sh from the open-source repo (its capability moved to AI
  Advisor). Keys are now Ed25519 signatures over the normalized email
  (URL-safe base64), pasted by the user.

Keys remain free and unlock nothing - they only prove an email handshake.
Existing keys are reissued under the new keypair.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Completes the previous commit (which only removed genkey.sh): replace the
symmetric HMAC + embedded secret with offline Ed25519 verification using only
the public key. The app can verify an activation key but can no longer mint
one; the private signing key lives solely in the AI Advisor repo.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
docs/strategy/FreeEed-2027-Vision.md: the 2027 vision - data understanding as
the product, expanding from eDiscovery into investigations, government/FOIA
disclosure, and AI data readiness, with human-in-the-loop AI and the open /
transparent / affordable / practical product principles.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The "Inventory inputs" step walked every input directory regardless of the
Active checkbox, so the Staged inventory counted files from unselected
custodians (e.g. 129 files when only one of three custodians was active).

- FreeEedMain.runInventoryInput: skip directories whose Active flag is not "y"
  (this is the bug behind the reported symptom).
- ActionStaging: the stage-in-place branch also ignored Active - fixed; and the
  file-count used for the progress total now respects Active too.
- ProjectUI.collectProjectInputs: clear the cached catalog when inputs or the
  Active selection change, so a stale inventory can't show unselected data.

Verified: with one of three custodians active, the catalog now reports that
custodian's files only (6) instead of all (129).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
markkerzner and others added 6 commits June 10, 2026 19:03
Abstracted, court-ready ESI production specification for #551: Bates numbering,
single-page Group IV TIFF, multipage text, native handling, .DAT/.OPT load
files, Exhibit A/B metadata field tables, family/dedup/redaction rules, and
volume/delivery layout. Written in FreeEed's own terms, referencing a public
GPO-authenticated court order rather than embedding the case PDF.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The README daily-build links were version-pinned (e.g. ...-10.8.4-SNAPSHOT.zip),
so they had to be edited on every bump and drifted between branches. Switch them
to stable 'latest' URLs, and have release_freeeed_complete.sh also publish each
daily artifact under a 'latest' alias:
  freeeed_complete_pack-latest.zip, FreeEed-latest-Windows.exe,
  FreeEed-latest-Linux.run (+ macOS dmg). README links now never need updating.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Build unencrypted zips and drop the ZIP_PASS requirement.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Frame the portable offline Viewer as an embodiment of the vision; AI Case
Chat runs on a local model with no outbound calls (forensic soundness).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@markkerzner markkerzner merged commit 6d40400 into main Jun 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants