Home
Softono
nudlers

nudlers

Open source TypeScript
18
Stars
9
Forks
1
Issues
0
Watchers
3 weeks
Last Commit

About nudlers

Smart personal finance tracker for Israeli banks & cards. Features AI categorization, recurring payments, self-hosting (Docker), and MCP support.

Platforms

Web Self-hosted Docker

Languages

TypeScript
Nudlers

Your Personal Finance Command Center for Israeli Banking

Automatically aggregate, categorize, and analyze your finances from all Israeli banks and credit cards in one beautiful dashboard.
Self-hosted Β· Open source Β· Hebrew & English (RTL) Β· Local-only by design

Website β€’ Features β€’ Quick Start β€’ Banks & Cards β€’ AI Integration


Why Nudlers?

Managing finances across multiple Israeli banks and credit cards is a nightmare. Different apps, different formats, no unified view. Nudlers solves this.

The Problem The Nudlers Solution
Scattered data across 5+ apps One unified dashboard
Manual transaction logging Automatic daily sync
Forgotten subscriptions and silent price hikes Insights inbox flags them automatically
No cross-bank insights AI-powered analysis
Time wasted on categorization Smart auto-categorization
Missed budget alerts WhatsApp notifications

✨ Features

πŸ“Š Unified Financial Dashboard

See all your money in one place. Nudlers aggregates transactions from every Israeli bank and credit card into a single, beautiful interface.

  • Multi-View Analytics β€” Switch between Summary, Budget, Category, Recurring Payment, and Balance Projection views
  • Balance Forecasting β€” Predict your future bank balance based on recurring payments and upcoming credit card charges
  • Real-Time Sync β€” Background syncing keeps your data fresh automatically
  • Custom Billing Cycles β€” Track spending by your credit card billing cycle, not just calendar months
  • Installment Tracking β€” Monitor ongoing installments with remaining payments and amounts

🧠 Intelligent Auto-Categorization

Stop wasting time manually categorizing transactions. Nudlers learns your spending patterns.

3-Phase Smart Categorization:

  1. Rule-Based Matching β€” Custom regex patterns for merchants you define
  2. Historical Learning β€” Remembers how you categorized "Aroma Coffee" and applies it automatically
  3. Selective Enrichment β€” Only fetches additional data when needed, avoiding bot detection

95%+ of transactions are categorized automatically after initial setup

πŸ”” Insights β€” anomalies worth your attention

A dedicated "Insights" view (ΧͺΧ•Χ‘Χ Χ•Χͺ) surfaces things that would otherwise hide in the noise. Everything is computed locally, fingerprinted so re-runs don't double-flag, and re-evaluated automatically after each daily sync.

  • Price hikes on subscriptions β€” "Apple Music: β‚ͺ19.90 β†’ β‚ͺ29.90 after 8 stable months." Catches silent price increases that most apps miss because the new amount clusters separately from the historical pattern.
  • New recurring charges β€” Surfaces forgotten free trials that quietly turned into monthly charges, on the second or third confirmation.
  • Category spend spikes β€” Flags weeks where a category jumps statistically far above its trailing-12-week mean (ΞΌ + 2Οƒ). Skips income/refund weeks; requires real history before it'll fire.
  • Daily WhatsApp digest β€” High and medium-severity anomalies are folded into the top of the daily summary message, so you see them without opening the app.
  • Inbox actions β€” Dismiss, mark "this is normal," or acknowledge β€” with optimistic updates and rollback on failure.

πŸ“± Native WhatsApp Integration

Get your daily financial summary delivered right to WhatsApp β€” no Twilio, no third-party services.

  • Daily Summaries β€” Wake up to yesterday's spending overview, with insight alerts at the top when something fired
  • Restart Notification β€” Optional one-shot ping when the app comes back up and the vault is locked, so you know to go unlock it (great for catching unexpected NAS reboots or deploys)
  • Resilient Send Path β€” Connection is verified before each send and reconnected automatically if the WhatsApp Web session drifted into a stale state
  • Group Support β€” Share summaries with family or partners
  • QR Code Setup β€” Connect in seconds, session persists across restarts

πŸ€– AI-Powered Insights

Ask questions about your finances in plain language. Bring your own AI provider β€” any OpenAI-compatible API works (OpenRouter, OpenAI, Groq, Together, Gemini, LMStudio, Ollama, etc.).

"What did I spend on groceries this month?"
"Compare my dining expenses to last month"
"Show me my top 10 expenses"

πŸ”Œ MCP Integration for AI Assistants

Connect Nudlers directly to Claude Desktop, Cursor, or Claude Code using the Model Context Protocol.

Quick Setup (localhost):

{
  "mcpServers": {
    "nudlers": {
      "command": "npx",
      "args": ["-y", "supergateway@latest", "--sse", "http://localhost:6969/api/mcp"]
    }
  }
}

For remote/hosted instances, replace localhost:6969 with your server URL (see MCP Setup for details).

Now your AI assistant can query your finances, search transactions, and add manual expenses.

πŸ’° Smart Budget Management

Set budgets by category and track them in real-time.

  • Visual Progress Bars β€” See budget consumption at a glance
  • Burndown Charts β€” Daily spending vs. ideal pace visualization
  • Historical Comparison β€” Compare this month to previous months
  • Overspend Alerts β€” Get notified before you exceed limits

πŸ“ˆ Smart Balance Projection

Know your future balance before it happens. Nudlers projects your bank balance for the next 30 days.

  • Predictive Analytics β€” Combines current balances, detected recurring bank transactions, and upcoming credit card settlements.
  • Visual Trends β€” Interactive charts show your balance trajectory and highlight potential risks.
  • Manual Overrides β€” Add manual recurring payments (like rent or direct debits) that the system hasn't detected yet.
  • Billing Cycle Awareness β€” Intelligently accounts for Israeli credit card billing cycles and settlement dates.
  • Negative Balance Alerts β€” Visual indicators catch when your projected balance might drop below zero.

πŸ”’ Bank-Grade Security

Your credentials never leave your machine unencrypted.

  • AES-256-GCM Encryption β€” Industry-standard encryption for all credentials
  • Local Processing β€” No cloud service sees your bank passwords
  • Secure by Design β€” Credentials decrypted only at scraping time
  • Memory-Locked Vault β€” Mandatory security layer. Your master key exists only in RAM. Even if your server is compromised, credentials remain unreadable without your passphrase
  • Passkey / Biometric Unlock β€” Use TouchID, FaceID, or a hardware security key to unlock the vault without typing your passphrase
  • Native 2FA Flows β€” Built-in support for OneZero's two-factor authentication and Bank Hapoalim's OTP, no third-party extensions required
  • Zero Telemetry β€” No analytics, no remote logs, no "anonymized usage data." If you don't see it in DevTools, it isn't happening

🌐 Hebrew & English, with proper RTL

Built for the Israeli banking ecosystem, with first-class support for both languages.

  • Live language switch β€” Toggle between Χ’Χ‘Χ¨Χ™Χͺ and English from the menu; the entire UI flips direction without a reload
  • Real RTL β€” Card corners, arrow direction, table alignment, financial number layout β€” all behave correctly in both directions, not bolt-on right-to-left
  • Hebrew display fonts β€” Heebo for the UI, with English text rendering in Inter when the app is in English mode

πŸ”’ Memory-Locked Credentials (Vault)

Nudlers uses a Memory-Locked Vault for all credential encryption. Your master encryption key is "wrapped" with a passphrase and stored in the database. When the application starts, it remains in a "locked" state until you provide the passphrase (or use a passkey) via the UI.

  • Non-Persistent: The decrypted key exists only in the application's memory (RAM).
  • Auto-Lock: If the app restarts or the server reboots, the vault automatically locks.
  • Brute-Force Protected: Key derivation uses scrypt with a custom salt.

How It Works

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                   First-Time Setup                           β”‚
β”‚                                                             β”‚
β”‚  1. User creates a passphrase (8+ chars)                    β”‚
β”‚  2. Random 256-bit master key is generated                  β”‚
β”‚  3. Master key is wrapped with passphrase (scrypt + AES)    β”‚
β”‚  4. Wrapped key stored in database                          β”‚
β”‚  5. Master key held in memory β†’ vault is unlocked           β”‚
β”‚  6. User optionally registers a passkey (biometric)         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                   Subsequent Unlocks                         β”‚
β”‚                                                             β”‚
β”‚  Option A: Passkey (default when registered)                β”‚
β”‚    1. Browser triggers WebAuthn challenge                    β”‚
β”‚    2. User authenticates with biometric/security key         β”‚
β”‚    3. Server verifies, retrieves encrypted passphrase        β”‚
β”‚    4. Passphrase unwraps master key β†’ vault unlocked         β”‚
β”‚                                                             β”‚
β”‚  Option B: Passphrase                                       β”‚
β”‚    1. User types passphrase                                 β”‚
β”‚    2. Passphrase derives wrapping key via scrypt             β”‚
β”‚    3. Wrapping key decrypts master key β†’ vault unlocked      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                   Legacy Migration                           β”‚
β”‚                                                             β”‚
β”‚  If upgrading from env-var encryption:                       β”‚
β”‚    1. UI detects NUDLERS_ENCRYPTION_KEY in environment       β”‚
β”‚    2. Prompts user to create a vault passphrase              β”‚
β”‚    3. All credentials re-encrypted with new master key       β”‚
β”‚    4. Legacy env var can be removed after migration          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Setup Guide

  • New Installation: Launch Nudlers. The UI automatically detects that the vault is uninitialized and guides you through creating a passphrase. After setup, you'll be prompted to optionally register a passkey for biometric unlock.
  • Legacy Migration: If you have NUDLERS_ENCRYPTION_KEY set, the UI will guide you through migrating to the vault. All credentials are re-encrypted in a single transaction. You can remove the env var after migration.

Passkey Management

  • Register multiple passkeys (e.g., laptop fingerprint + phone FaceID)
  • View and delete individual passkeys in Settings β†’ Vault Security
  • When passkeys are registered, the vault defaults to passkey authentication
  • You can always switch to passphrase entry by clicking "Use passphrase instead"
  • Changing your passphrase invalidates all registered passkeys (re-register required)

Environment Variables for Vault

Variable Required Description
PASSKEY_ENCRYPTION_SECRET Production Required if using passkeys in production. A stable secret used to encrypt the vault passphrase stored in the database. Generate with openssl rand -base64 32. Must never change β€” rotating it invalidates all registered passkeys.
WEBAUTHN_RP_ID Production WebAuthn Relying Party ID. Defaults to localhost. Must be set to your domain (e.g. nudlers.example.com) when running behind a reverse proxy or over HTTPS.
WEBAUTHN_ORIGIN Production WebAuthn expected origin. Defaults to http://localhost:6969. Must be set to your full app URL (e.g. https://nudlers.example.com) when running behind a reverse proxy or over HTTPS. Without this, passkey registration/login will fail with an origin mismatch error.

πŸ“ Runs Anywhere

From powerful servers to a Raspberry Pi β€” Nudlers adapts to your hardware.

Mode Target Hardware RAM Usage
Normal Servers, PCs 2GB+
Low Synology NAS, QNAP, Raspberry Pi 512MB+

🏦 Supported Institutions

Banks

Hapoalim Leumi Mizrahi Tefahot Discount
FIBI Yahav Otsar Hahayal Beinleumi
Massad Union Jerusalem Pepper
OneZero

Native 2FA is built in for OneZero and Bank Hapoalim's OTP flow β€” no manual code-typing per sync.

Credit Cards

Visa Cal Max (Leumi Card) Isracard American Express

πŸš€ Quick Start

Prerequisites

  • Docker (recommended) OR Node.js 22+ with PostgreSQL 16+
  • Google Chrome (for scraping, included in Docker)

Option 1: Docker (Recommended)

# Clone the repository
git clone https://github.com/enudler/nudlers.git
cd nudlers

# Configure environment
cp .env_example .env
# Edit .env with your database password

# Start everything
docker-compose up -d

Open http://localhost:3000 and start adding your accounts!

Option 2: NAS / Server (Pre-built Image)

For Synology, QNAP, or any server with Docker:

# Create deployment directory
mkdir nudlers && cd nudlers

# Download production configs
curl -O https://raw.githubusercontent.com/enudler/nudlers/main/docker-compose.prod.yaml
curl -O https://raw.githubusercontent.com/enudler/nudlers/main/.env_example

# Configure and start
cp .env_example .env
# Edit .env with your settings
docker-compose -f docker-compose.prod.yaml up -d

Supports both linux/amd64 and linux/arm64 architectures.

Option 3: Manual Installation

# Clone and install
git clone https://github.com/enudler/nudlers.git
cd nudlers/app
npm install

# Configure PostgreSQL and .env file
# See Environment Variables section below

# Run
npm run dev

βš™οΈ Configuration

Environment Variables

Variable Required Description
NUDLERS_DB_USER βœ… PostgreSQL username
NUDLERS_DB_HOST βœ… Database host (nudlers-db for Docker)
NUDLERS_DB_NAME βœ… Database name
NUDLERS_DB_PASSWORD βœ… Database password
NUDLERS_DB_PORT Database port (default: 5432)
RESOURCE_MODE normal or low (default: normal)

Application Settings

All settings are configurable through the Settings UI (gear icon in navigation):

Category Settings
Language Hebrew or English (RTL flips automatically)
Sync Enable/disable, sync hour, days to fetch
Display Currency, date format, billing cycle start day
Scraper Timeout, show browser (debugging), category fetching
AI Provider base URL, API key, model slug
WhatsApp Enable summary, send hour, recipients, summary mode, restart-locked notification
Vault Passphrase, passkeys, change-passphrase

πŸ€– AI Integrations

Built-in AI Assistant

The built-in chat answers questions about your finances using any OpenAI-compatible AI provider:

  • "What's my budget status for groceries?"
  • "Show me all transactions from Rami Levy"
  • "How much did I spend on dining this month vs last month?"

Setup: Open Settings β†’ AI Provider and configure:

  • Base URL β€” defaults to OpenRouter (https://openrouter.ai/api/v1). Presets included for OpenAI, Groq, Together, Gemini, or paste any custom OpenAI-compatible endpoint.
  • API Key β€” bearer token for the selected provider.
  • Model β€” provider-specific slug (e.g. google/gemini-2.5-flash, openai/gpt-4o-mini, anthropic/claude-3.5-sonnet).

Or via env vars: AI_BASE_URL, AI_API_KEY, AI_MODEL.

MCP for Claude Desktop / Cursor / Claude Code

Nudlers exposes a Model Context Protocol (MCP) endpoint that AI assistants can use directly to query and manage your finances.

Setup for Claude Desktop

Add to ~/.config/claude/claude_desktop_config.json (macOS/Linux) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "nudlers": {
      "command": "npx",
      "args": ["-y", "supergateway@latest", "--sse", "http://localhost:6969/api/mcp"]
    }
  }
}

Setup for Cursor

Add to ~/.cursor/mcp.json:

{
  "mcpServers": {
    "nudlers": {
      "command": "npx",
      "args": ["-y", "supergateway@latest", "--sse", "http://localhost:6969/api/mcp"]
    }
  }
}

Setup for Claude Code

Add to your project's .mcp.json or global ~/.claude/mcp.json:

{
  "mcpServers": {
    "nudlers": {
      "command": "npx",
      "args": ["-y", "supergateway@latest", "--sse", "http://localhost:6969/api/mcp"]
    }
  }
}

Remote / Hosted Setup

For Nudlers running on a remote server, NAS, or Docker container, replace the URL:

{
  "mcpServers": {
    "nudlers": {
      "command": "npx",
      "args": ["-y", "supergateway@latest", "--sse", "https://your-server.com/api/mcp"]
    }
  }
}

Examples:

  • Docker on local network: http://192.168.1.100:3000/api/mcp
  • Synology NAS: http://nas.local:3000/api/mcp
  • Cloud server with HTTPS: https://nudlers.yourdomain.com/api/mcp

Note: For HTTPS, ensure your server has a valid SSL certificate. For local network access, use HTTP with your server's IP address.

Available Tools

Tool Description
get_monthly_summary Get financial summary by vendor with income, expenses, and net balance
get_category_expenses Get all transactions for a specific category
get_category_breakdown Get spending breakdown by category with percentages
get_all_categories List all spending categories in the system
search_transactions Search transactions by description, vendor, or category
get_all_transactions Get all transactions for a time period
get_budgets Get budget vs actual spending comparison
get_recurring_payments List subscriptions and installment payments
get_balance_projection Get daily balance projection for the next 30 days
get_sync_status Check sync status for all connected accounts
list_accounts List all configured bank accounts and credit cards
add_manual_expense Add a manual expense or income transaction

Example Queries

Once connected, you can ask your AI assistant:

  • "What did I spend on groceries this month?"
  • "Show me my budget status"
  • "Add a manual expense: Coffee at Aroma, 25 ILS, today, category Dining"
  • "What are my recurring payments?"
  • "Search for transactions from Rami Levy"
  • "Compare my spending by category"

Troubleshooting MCP

Connection refused:

# Verify Nudlers is running
curl http://localhost:6969/api/ping
# Should return: {"status":"ok"}

Test the MCP endpoint:

# This should return SSE headers and keep connection open
curl -N http://localhost:6969/api/mcp

"supergateway" not found:

# Ensure npx is available (comes with Node.js)
npx --version

# Or install supergateway globally
npm install -g supergateway

Wrong port:

  • Development mode uses port 6969
  • Docker production typically uses port 3000
  • Check your docker-compose.yaml for port mappings

Firewall issues (remote access):

  • Ensure the port is accessible from your client machine
  • For Docker: check port mappings in docker-compose.yaml
  • For NAS: check firewall and port forwarding settings

πŸ’‘ Smart Categorization Explained

Nudlers uses a unique 3-phase approach to achieve high accuracy while avoiding bot detection:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        PHASE 1: Hybrid Scrape                        β”‚
β”‚  Fetch transactions WITHOUT categories (avoids bot detection)        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                 β”‚
                                 β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     PHASE 2: Local Matching                          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚   Custom Rules   β”‚ -> β”‚  If no match, check historical cache β”‚   β”‚
β”‚  β”‚  (Regex-based)   β”‚    β”‚   "Aroma" -> "Dining" (from history) β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                 β”‚
                                 β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                  PHASE 3: Selective Enrichment                       β”‚
β”‚  Only for remaining uncategorized: targeted API calls (low risk)     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

This approach provides:

  • Speed β€” Most transactions categorized instantly from cache
  • Accuracy β€” 95%+ categorization rate
  • Safety β€” Minimal API calls prevent account lockouts

πŸ“± WhatsApp Integration

How It Works

Nudlers uses a headless browser to connect to WhatsApp Web β€” no third-party services required.

Setup

  1. Go to Settings β†’ WhatsApp Daily Summary
  2. Click Start WhatsApp Service
  3. Scan the QR code with your phone (WhatsApp β†’ Linked Devices)
  4. Configure recipients (phone numbers or group IDs)
  5. Set your preferred delivery time

Docker Configuration

For Docker deployments, add these to your docker-compose.yaml:

services:
  nudlers-app:
    volumes:
      - whatsapp-data:/app/.baileys_auth  # Persist Baileys session
    cap_add:
      - SYS_ADMIN
    security_opt:
      - seccomp=unconfined
    shm_size: '2gb'

volumes:
  whatsapp-data:

πŸ› οΈ Troubleshooting

"Block Automation" Errors (Isracard/Max/Amex)

These vendors have aggressive bot detection. Solutions:

  1. Use Low Resource Mode β€” Set RESOURCE_MODE=low to reduce browser footprint and memory usage
  2. Reduce Sync Days β€” Lower sync_days_back to 7-14 days
  3. Manual Login β€” Log in to the vendor website once to clear notices
  4. Wait β€” If blocked, wait 24 hours before retrying

Chrome Not Found

For custom environments:

PUPPETEER_EXECUTABLE_PATH=/usr/bin/google-chrome

WhatsApp QR Code Not Appearing

  1. Check browser capabilities in Docker config
  2. Ensure shm_size is at least 1gb
  3. Check logs: docker-compose logs -f nudlers-app

πŸ—οΈ Architecture

nudlers/
β”œβ”€β”€ app/                          # Next.js application
β”‚   β”œβ”€β”€ components/               # React UI components
β”‚   β”‚   β”œβ”€β”€ CategoryDashboard/    # Main dashboard views
β”‚   β”‚   β”œβ”€β”€ Layout.tsx            # App shell with navigation
β”‚   β”‚   └── ...
β”‚   β”œβ”€β”€ pages/
β”‚   β”‚   β”œβ”€β”€ api/                  # API routes
β”‚   β”‚   β”‚   β”œβ”€β”€ transactions/     # Transaction CRUD
β”‚   β”‚   β”‚   β”œβ”€β”€ scrapers/         # Scraper control
β”‚   β”‚   β”‚   β”œβ”€β”€ reports/          # Financial reports
β”‚   β”‚   β”‚   β”œβ”€β”€ anomalies/        # Insights inbox + manual evaluator
β”‚   β”‚   β”‚   β”œβ”€β”€ mcp.ts            # MCP integration endpoint
β”‚   β”‚   β”‚   └── ...
β”‚   β”‚   └── index.tsx
β”‚   β”œβ”€β”€ scrapers/                 # Bank scraper logic
β”‚   β”œβ”€β”€ utils/                    # Shared utilities
β”‚   └── styles/                   # Theming (light/dark mode)
β”œβ”€β”€ docker-compose.yaml           # Local development
β”œβ”€β”€ docker-compose.prod.yaml      # Production deployment
└── db-init/                      # Database initialization

Tech Stack

Layer Technology
Framework Next.js 16 (Pages Router)
Language TypeScript
Database PostgreSQL 16
UI Material-UI v6, CSS Variables
Scraping israeli-bank-scrapers, Puppeteer
AI OpenAI-compatible (OpenRouter default), MCP SDK
Messaging Baileys (WhatsApp), Telegram Bot API
Testing Vitest, Playwright

πŸ§ͺ Development

cd app

# Install dependencies
npm install

# Start development server (port 6969)
npm run dev

# Run tests
npm run test

# Run linter
npm run lint

# Start Storybook (port 6006)
npm run storybook

πŸ”„ Updating

Docker

docker-compose pull
docker-compose up -d

Manual

git pull
cd app
npm install
npm run build
npm start

Database migrations run automatically on startup.


πŸ“„ License

Polyform Noncommercial License 1.0.0

Free for personal, non-commercial use. For commercial licensing, please contact the author.

See LICENSE for full terms.


πŸ™ Credits


Take control of your Israeli finances.
nudlers.com β€’ Star on GitHub β€’ Report Issues