Inspiration

Tender relevance is not a single company-wide yes or no. The same public notice can fit one legal entity, geography, service line, or deadline policy and fail another. Small supplier teams often repeat that screening manually, lose the reasoning, and notice missing metadata too late.

TenderVerdict began with a narrow promise: turn public-procurement metadata into an explainable review queue, never a black-box bid decision. Next Gen extends that promise from one supplier profile to a bounded portfolio without taking the useful single-profile workflow away from free users.

What it does

TenderVerdict loads one normalized CSV or JSON notice feed and one to five supplier profiles. The deterministic core evaluates CPV fit, geography, lead time, notice type, and missing fields. Every notice becomes open_documents, watch, or reject with reasons, unknowns, provenance, and a concrete human next step.

The native macOS app adds:

  • a Profile Builder for creating, reordering, validating, and saving one to five profiles;
  • an import preview with record counts, normalized examples, warnings, and full-file metadata gaps;
  • a complete first-profile Free queue with search, buyer/deadline/verdict filters, reasoning, safe source links, and deterministic JSON export;
  • a RevenueCat-gated Portfolio Workspace that compares the same ordered notices across profiles and opens the exact evidence behind every differing result;
  • explicit opt-in file continuity that stores only security-scoped bookmarks and never persists tender content, reports, review dates, or billing configuration.

TenderVerdict never produces a cross-profile score, ranking, legal conclusion, or automatic bid.

How I built it

The canonical qualification engine is Python 3.11+ with strict bounded schemas, deterministic JSON, atomic export, a shared review date, and SHA-256 provenance. A private embedded-core adapter normalizes workspaces, previews notice files, and executes portfolio runs inside a self-contained macOS package.

The interface is SwiftUI. It decodes the canonical reports and rejects inconsistent counts, provenance, shared notices, identities, or ordering before presentation. Stable result identities keep filtered queues and comparison drill-down aligned.

The app uses the official RevenueCat Apple SDK 5.83.0. RevenueCat controls only the native visibility entitlement; it never changes qualification results. The Test Store path covers offering load, cancellation, simulated failure, purchase, CustomerInfo refresh, relaunch recovery, and restore. Judge Access uses a RevenueCat Granted Entitlement and explicitly states that no purchase was made. No usable SDK key is committed, bundled, logged, or stored.

The reproducible builder embeds the offline Python runtime, licenses, fixtures, and Swift resources; applies and verifies an ad-hoc signature; runs worktree-independent smoke checks; and produces a checksum-paired archive. This is a competition evaluation build, not a notarized consumer release or production-billing claim.

Challenges I ran into

The first challenge was monetization without weakening trust. Free had to remain a complete workflow, while Premium needed to solve a coherent repeated-use problem rather than hide basic reasoning.

The second was safe continuity. Convenience often invites accidental persistence, so the feature remembers only opt-in file bookmarks and never auto-runs analysis.

The third was preserving exact profile/notice identity through search and filtering. Comparison cells resolve by stable IDs instead of filtered array offsets.

The final challenge was keeping evidence honest across source, packages, RevenueCat state, screenshots, CI, and the submission form. Test Store activity is not a real payment, and a Next Gen repository/video entry is not a public store release.

Accomplishments that I'm proud of

  • One notice feed is normalized once and evaluated consistently for up to five ordered profiles.
  • Free remains useful: one complete analysis, all notice-level reasoning, filters, source access, and deterministic export.
  • Premium reveals cross-profile comparison and exact drill-down without changing a single verdict.
  • Invalid input preserves the last valid report and cannot silently replace exportable evidence.
  • Missing or invalid RevenueCat configuration fails closed; there is no local Premium toggle.
  • The official SDK, self-contained package, source security boundaries, deterministic core, native contracts, and remote CI are all covered by reproducible checks.
  • Shipaton managers confirmed that macOS is eligible without a platform-only disadvantage and that Test Store is enough for the Next Gen category.

What I learned

Entitlement-backed UI is strongest when billing state and domain logic remain separate. A useful free workflow makes the paid value proposition clearer, not weaker. Evidence is also part of the product: every public claim should resolve to a reproducible source, artifact, or organizer answer.

What's next for TenderVerdict Next Gen

Next, I want to validate the workflow with small supplier teams and add a signed, notarized distribution path. I will move from Test Store evidence to production billing only after real demand is proven. The current app remains an ad-hoc-signed competition evaluation build; it is not a consumer release, and no real payment was made.

Built With

Share this project:

Updates