AhmadHassan-BTed/Noria
60.8
Adequate · 21 September 2026
8.4k
lines of production code
JavaScript
with Python
4
measurements over time
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.