Skip to content

[Submission] Faldony — self-hosted document archive with durable processing #129

Open

Description

@SixthPhilosopher

Project link

https://github.com/SixthPhilosopher/Faldony

Language

Java

Short description (max 256 chars)

Faldony is a self-hosted, local-first document archive. Every upload becomes a durable Temporal workflow: extract (OCR), embed, finalize — a crash mid-import never loses your file. Search fuses full-text, fuzzy, and vector ranking over a single PostgreSQL dataset.

Long Description

What this is

Faldony is a self-hosted, single-node document archive for personal and
professional files. You upload PDFs, scans, or photos; the system OCRs them,
embeds the text, and makes the whole library searchable — all on hardware
you own, with no cloud vendor in the path.

The problem it solves

Document archives tend to live in one of two extremes: cloud services that
hold your data hostage, or local folders you can never find anything in.
Faldony combines local-first storage with real retrieval — ingest is
automatic and durable, and search understands semantics, typos, and
structure. It is a private, searchable binder that survives crashes and
power cuts.

How it uses Temporal

Temporal is the backbone of the ingest pipeline. Every upload starts a
DocumentProcessingWorkflow — a single durable execution identified by the
document's content hash:

  • OCR + chunking runs as Activities against a self-hosted Docling
    server, polled on durable timers (a restart or crash costs nothing).
  • Embedding runs as another Activity with batch-resumable heartbeats.
  • A Saga compensation registered first guarantees cleanup on any
    permanent failure; cancellation is cooperative, never a terminate.
  • Failures are classified into a durable processing ledger, and a
    Reconciliation Workflow (a Temporal Schedule) self-heals the stack
    every few minutes — resuming transient failures, garbage-collecting
    orphans, and keeping the ledger honest.
  • Live UI progress streams straight from workflow state via the Java SDK's
    Workflow Streams, bridged to Server-Sent Events.

The workflows and activities are visible under
backend/src/main/kotlin/com/kiss/backend/temporal/.

  • DocumentProcessingWorkflow.kt / DocumentActivities.kt — the ingest
    pipeline (extract → embed → single-write finalize)
  • ReconciliationWorkflow.kt / ReconcileActivities.kt — the self-healing
    schedule
  • EmbeddingBackfillWorkflow.kt — the dormant backfill pass
  • TitleUpdateWorkflow.kt — per-document metadata updates

For setup instructions, see the README.

Author(s)

Alessandro Saccinto (SixthPhilosopher)

https://avatars.githubusercontent.com/u/72933724?v=4

Activity

  1. github-actions commented on Sep 6, 2026

    @github-actions

    ZiggyBot — automated pre-evaluation


    Criterion Assessment
    Useful to Temporal users ✅ Yes — Demonstrates durable ingestion pipelines, Saga compensation, cooperative cancellation, and Workflow Streams as a reference implementation in the Java SDK.
    Benefits clearly explained ✅ Yes — The README and submission describe the problem, architecture, and Temporal usage in specific technical detail.
    OSI Approved License ✅ Yes — GPL-3.0 is OSI-approved and present in the repository.
    README with working instructions ⚠️ Unclear — The README covers architecture and design extensively, but the setup/deployment instructions fall in the truncated tail and cannot be verified from the available content.

    Overall: Needs review ⚠️

    Notes:

    • Language declared as Java in the submission, but the source is Kotlin on the JVM using the Temporal Java SDK; the submission text refers to "Java SDK" while the code path is .../kotlin/.... Minor labeling inconsistency, not a defect.
    • The stated language field ("Java") conflicts with the KMP/Kotlin badges and .kt source files; worth confirming for catalog accuracy.
    • Temporal usage is non-trivial and covers multiple primitives: per-document workflows keyed by content hash, Saga compensation in a detached cancellation scope, cooperative cancellation via signal plus requestCancel, heartbeat-based batch resumption, a reconciliation Schedule, and Workflow Streams bridged to SSE.
    • The claim that Temporal open-workflow visibility is ephemeral, motivating a durable projection into a processing_ledger, is a reasonable design decision and is documented.
    • Single-write finalize activity establishing a "row exists == fully processed" invariant is a clean idempotency boundary; it depends on the finalize activity being idempotent under retry, which is asserted but not verifiable from the truncated files.
    • Repository has 0 stars and is marked beta; arm64/Raspberry Pi target is stated as not yet validated.
    • DocumentProcessingWorkflow.kt is truncated at the review boundary; the compensation and cancellation logic described in the docstring could not be fully inspected in the workflow body.

    Suggested questions for submitter:

    • Confirm the primary implementation language for the catalog entry (Kotlin vs. Java).
    • Do the README setup instructions include a complete, runnable docker-compose quickstart, and have they been validated on a clean environment?
    • Are the finalizeDocument and embedMissingChunks activities idempotent under retry, and is the single-write finalize transactional across the document row and all chunk rows?

    Notable Temporal pattern:

    Saga compensation executed inside a detached cancellation scope combined with cooperative cancellation (signal plus requestCancel rather than terminate), ensuring cleanup activities run even when the root scope is cancelled. This is representative because it addresses a specific Temporal gotcha where a cancelled root scope would otherwise cancel the compensation activities before they execute.
    View in source ↗


    Automated AI pre-screen by ZiggyBot. Final decisions are made by the community team.

    Reviewer: Check the box below to generate a Contentful-ready long description for this submission.

    • Generate long description if needed
  2. github-actions commented on Sep 6, 2026

    @github-actions

    ZiggyBot — automated pre-evaluation

    An error occurred during automated evaluation; the community team will need to review this submission manually.

    401 {"type":"error","error":{"type":"authentication_error","message":"API key is invalid."},"request_id":null}
    

    Automated AI pre-screen by ZiggyBot. Final decisions are made by the community team.

  3. SixthPhilosopher commented on Sep 8, 2026

    @SixthPhilosopher
    Author

    Hi! Just following up on this submission to check whether it’s in the review queue.

    It looks like the automated pre-evaluation has failed twice with an authentication error (401 API key is invalid). I’m not sure if that means the submission is waiting for manual review, or if it may have been missed by the process pipeline.

    Could someone confirm whether the submission is still queued for review?

    Thanks!

  4. Shy commented on Sep 17, 2026

    @Shy
    Member

    Thanks for catching. I'm working with our IT team to get our key fixed.

  5. self-assigned this
    on Sep 17, 2026
  6. assigned and unassigned on Oct 8, 2026
  7. added
    website ready!This is ready to be added to the Code Exchange site by a Temporalite
    and removed
    triageIssues that Temporal folk need to look at
    on Oct 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

code exchange submissionCode and/or content about Temporal!website ready!This is ready to be added to the Code Exchange site by a Temporaliteziggy reviewedPre-screened by ZiggyBot

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions