Skip to content
CAI
Software that uses CAICheck a score

AhmadHassan-BTed/Noria

60.8

Adequate · 21 September 2026

8.4k

lines of production code

JavaScript

with Python

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

Features

Add Docker support for production and development environments

The application can now be containerized using Docker. A production Dockerfile is provided that builds the Node.js application, installs dependencies, and runs as a non-root user with a health check. A development Dockerfile is also added, which includes hot-reloading via nodemon. A docker-compose configuration is introduced to manage both production and development services, mapping ports 3000 and 3001 respectively, and mounting necessary volumes for authentication and logs.

docker · high confidence

Add example for custom job opportunities provider

Added a new example file, examples/custom-provider.js, which demonstrates how to create a custom provider for job opportunities. This example includes a JobAnalyzer that evaluates job postings based on skills, salary, and experience, and a JobNotifier that formats the results. The provider exports JobsProvider, JobAnalyzer, JobNotifier, and the response schema, illustrating how to extend the system with custom logic.

examples · high confidence

Added build artifacts for the cross-platform launcher

The build system now generates the necessary configuration files (Analysis, EXE, PKG, PYZ, and warnings) to package the \noria\_launcher\ application into a standalone executable (\Noria.exe\). This change establishes the foundation for distributing the application as a self-contained Windows binary, incorporating standard Python libraries and system dependencies required for the launcher to function without a pre-installed Python environment.

build · high confidence

Added utility modules for caching, metrics, queueing, retry logic, and validation

The src/utils directory now includes five new modules: cache.js provides an LRU cache with TTL and size limits; metrics.js tracks scraper, analyzer, WhatsApp, and LLM (Gemini/Groq) events with a formatted report; queue.js implements a dead-letter queue with exponential backoff and retry scheduling; retry.js offers a robust retry wrapper that parses rate-limit headers and handles network errors; and validators.js enforces URL, scraper payload, and analyzer response schemas. These utilities support the new pipeline orchestration and resilience features.

src/utils · high confidence

Introduce LLM-based job and scholarship processing pipelines with multi-provider fallback

Added new domains for processing job and scholarship opportunities using Large Language Models. The \src/domains/jobs\ and \src/domains/scholarships\ directories now contain the core logic for evaluating opportunities, including scoring criteria, response schemas, prompt builders, and message templates. To support these pipelines, the \src/infrastructure/llm\ directory introduces a stateless multi-provider dispatcher (\fallback.js\) that routes requests to a configurable chain of LLM providers (e.g., Google Gemini and Groq). The implementation includes specific adapters for each provider (\gemini.js\, \groq.js\) and a request queue (\requestQueue.js\) to manage API rate limits.

src/infrastructure · high confidence

Introduce event-driven pipeline architecture with global console logging and error handling

The application now features a new event-driven pipeline architecture, bootstrapped via a new \src/index.js\ entry point that initializes a \PipelineOrchestrator\ and loads pipeline configurations from YAML files. Additionally, \src/launcher.js\ has been added to provide a dynamic launch interface for pipeline instances, featuring global console output redirection to session-specific log files and robust error handling for uncaught exceptions and unhandled rejections.

src · high confidence

Introduce modular UI views for profile, scan, and settings management

The application's frontend has been refactored from a monolithic structure into a modular \ui/views\ package, separating concerns into distinct view files. This change introduces a dedicated profile management interface that allows users to configure multi-provider LLM chains (supporting Gemini and Groq) and Jina Reader keys. It also adds a scans management view for launching and monitoring opportunity extraction pipelines, and a settings view for managing Windows startup integration and performing a full application data reset. These components collectively enable users to manage applicant profiles, configure AI backends, and control background scanning operations.

ui/views · high confidence

Introduces a modular UI package with a WhatsApp-inspired dark theme

The \ui/\ directory is introduced, separating frontend logic into \state.py\ and \styles.py\. \state.py\ manages application state including predefined scan templates, profile persistence, and session logs. \styles.py\ applies a comprehensive dark theme using CSS variables (e.g., \--bg-page: \#212121\) and customizes Streamlit components, typography, and layout spacing to match a WhatsApp-inspired aesthetic.

ui · high confidence

Introduces a modular, event-driven pipeline orchestration system

The application now uses a new core architecture that manages data processing pipelines through a central orchestrator. This system reads YAML configurations to wire together distinct stages—such as listeners, scrapers, LLM analyzers, and senders—using a function-based registry. Users can now define and run automated workflows (e.g., for scholarships or jobs) where each step is a decoupled module, allowing for more flexible and extensible data processing.

src/core · high confidence

New build, launcher, and release automation scripts

The scripts directory now includes a suite of new automation tools: build.js and build\_exe.py handle the build process, including compiling a standalone C\# launcher (Noria.exe) with a custom icon; launcher.cs provides a cross-platform startup experience that checks for Python and Node.js dependencies and launches the application in an app window; publish\_release.py automates GitHub release creation with the compiled executable as an asset; and supporting scripts (convert-ico.py, embed-logo.py, render-logo.js, test-models.js) handle asset conversion, embedding, and API testing.

scripts · high confidence

Noria v1.0.0: Core Platform Launch with Multi-LLM Support and Streamlit Control Center

Noria v1.0.0 launches as a decoupled, hexagonal pipeline orchestrator for opportunity extraction and generative evaluation. The update introduces a Streamlit-based control center (app.py) that manages profiles, scans, and settings. It supports multi-LLM fallback chains (Gemini and Groq) for analysis, alongside WhatsApp-based notifications and scanning. The release includes a Makefile for development workflows, a Windows launcher (run\_noria.bat) that opens the app in a dedicated Chrome/Edge window, and a Dockerfile for containerized deployment. Configuration is standardized via a new .env.example template, and the project adopts the MIT license.

(repo-wide) · high confidence

Behavioural changes

Introduce structured error logging and system boot banner

The application now features a new event-driven architecture with a dedicated queue broker. Users will see a formatted system error log that displays the error source, URL, and message in a structured box, along with a boot banner confirming the pipeline is live. This replaces previous, less structured console output for system events.

src/config/constants, src/queue · high confidence

Modularize UI components and introduce sidebar navigation

The monolithic frontend code has been refactored into a modular \ui/components\ package, separating concerns into distinct files for countries, device cards, and navigation. This change introduces a new sidebar navigation component that provides a unified dashboard for managing applicant profiles, opportunity scans, and system settings. The device card component has been updated to handle connection linking, QR code scanning, and status tracking for WhatsApp-linked devices.

ui/components · high confidence

Test coverage

Add unit tests for LLM, messaging, and domain modules; Added unit tests for core event, pipeline, and registry modules; Added unit tests for utility modules.

Dependencies

Update project dependencies

The project's dependency tree has been updated. The \package-lock.json\ file was regenerated, and the \requirements.txt\ file was added to manage Python dependencies. Additionally, several \node\_modules\ directories were removed from the repository, indicating a cleanup of vendored or cached dependencies.

(dependencies) · medium 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

This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.

Score

  • CAI 64 → 61 (-3.4)
  • Rubric changed (rubric-2026.08.18 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 58 → 48 (-10.4)
  • Architecture 99 → 85 (-13.2)
  • Maturity 75 → 76 (+1.2)
  • Readiness 61 → 67 (+6.6)
  • Security 68 → 76 (+8.0)

Resolved (27)

  • Change coupling: app.py ↔ whatsapp-listener.js (app.py)
  • Coverage not included — suite not readable by the collector
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • Duplicated block (17 lines × 2) (ui/views/profiles.py)
  • Duplicated block (23 lines × 2) (ui/views/profiles.py)
  • Duplicated block (31 lines × 2) (ui/views/profiles.py)
  • Duplicated block (6 lines × 2) (ui/components/device_card.py)
  • Duplicated block (9 lines × 2) (ui/components/device_card.py)
  • Duplicated block (9 lines × 2) (ui/views/profiles.py)
  • High CVE: [GHSA redacted] (package-lock.json)
  • High CVE: [GHSA redacted] (package-lock.json)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • …and 7 more

New (89)

  • ChannelFetcher._installBridge (cyclomatic 42) (src/infrastructure/messaging/channel-fetcher.js)
  • ChannelFetcher._strategyNewsletterStore (cognitive 23) (src/infrastructure/messaging/channel-fetcher.js)
  • ChannelFetcher._strategyNewsletterStore (cyclomatic 19) (src/infrastructure/messaging/channel-fetcher.js)
  • ChannelFetcher.fetchWithRetry (cognitive 17) (src/infrastructure/messaging/channel-fetcher.js)
  • ClassTooLong: WhatsAppListener (src/infrastructure/messaging/whatsapp-listener.js)
  • Coverage not measured — JavaScript/TypeScript suite
  • Dependency advisory scan runs only on code events
  • Dependency hygiene PARTLY measured — Python dependencies read, no exact pin to grade for currency
  • Documentation: no installation or build instructions (README.md)
  • Duplicated block (10 lines × 2) (ui/components/device_card.py)
  • Duplicated block (11–16 lines × 3) (ui/views/profiles.py)
  • Duplicated block (22–26 lines × 3) (ui/views/profiles.py)
  • Duplicated block (35–36 lines × 2) (ui/views/profiles.py)
  • Duplicated block (5 lines × 2) (ui/components/device_card.py)
  • Duplicated block (8 lines × 2) (ui/views/profiles.py)
  • FileTooLong: messaging/whatsapp-listener.js (src/infrastructure/messaging/whatsapp-listener.js)
  • High CVE: [GHSA redacted] (package-lock.json)
  • High CVE: [GHSA redacted] (package-lock.json)
  • High CVE: [GHSA redacted] (package-lock.json)
  • High CVE: [GHSA redacted] (package-lock.json)
  • …and 69 more

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

Survey your own repository

AhmadHassan-BTed/Noria 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 21 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 68a46c1e4402566ab5e54433d7d5e0aaba2d522a — 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-28e75b8e3254.