435 Commits

Author SHA1 Message Date
09fe679f9b fix: Repair deploy workflow YAML (indent heredoc) 2025-12-21 15:35:20 +01:00
6a0e0c159c ci: Auto deploy via server-side pounce-deploy 2025-12-21 15:33:50 +01:00
faa1d61923 chore: Trigger CI run 2025-12-21 15:24:48 +01:00
d170d6f729 ci: Auto-deploy on push via SSH
- Gitea Actions workflow now syncs repo to server, builds images, restarts containers, and runs health checks
- Removed all hardcoded secrets from scripts/deploy.sh
- Added CI/CD documentation and ignored .env.deploy

NOTE: Existing secrets previously committed must be rotated.
2025-12-21 15:23:04 +01:00
13334f6cdd fix: Simplify CI pipeline, use local deploy script 2025-12-21 15:14:42 +01:00
436e3743ed feat: Add local deployment script
- Created scripts/deploy.sh for reliable local deployments
- Simplified CI pipeline to code quality checks only
- Deploy via: ./scripts/deploy.sh [backend|frontend]

The Gitea Actions runner cannot access host Docker in Coolify
environment, so deployments must be triggered locally.
2025-12-21 15:12:22 +01:00
86e0057adc refactor: SSH-based deployment pipeline
Changed from Docker-in-Docker to SSH-based deployment:
- Uses rsync to sync code to server
- Builds Docker images on host directly
- More reliable for Coolify environments
- Proper secret management via SSH
2025-12-21 15:07:58 +01:00
380c0313d9 refactor: Simplify CI/CD pipeline for reliability
- Removed REPO_PATH workaround (use checkout directly)
- Simplified env vars with global definitions
- Fixed network names as env vars
- Updated DATABASE_URL in Gitea secrets
- Cleaner deployment steps
- Better health checks
2025-12-21 15:03:43 +01:00
ddb1a26d47 fix: Implement IANA Bootstrap RDAP for reliable domain checking
Major improvements to domain availability checking:

1. IANA Bootstrap (rdap.org) as universal fallback
   - Works for ALL TLDs without rate limiting
   - Automatically redirects to correct registry
   - Faster than direct endpoints for most TLDs

2. Updated drop_status_checker.py
   - Uses IANA Bootstrap with follow_redirects=True
   - Preferred endpoints for .ch/.li/.de (direct, faster)
   - Better rate limiting (300ms delay, 3 concurrent max)

3. Updated domain_checker.py
   - New _check_rdap_iana() method
   - Removed RDAP_BLOCKED_TLDS (not needed with IANA Bootstrap)
   - Simplified check_domain() priority flow

Priority order:
1. Custom RDAP (.ch/.li/.de) - fastest
2. IANA Bootstrap (all other TLDs) - reliable
3. WHOIS - fallback
4. DNS - final validation

This eliminates RDAP timeouts and bans completely.
2025-12-21 14:54:51 +01:00
5f3856fce6 fix: RDAP ban prevention and DNS fallback
Problem: We are banned from Afilias (.info/.biz) and Google (.dev/.app)
RDAP servers due to too many requests, causing timeouts.

Solution:
1. Added RDAP_BLOCKED_TLDS list in domain_checker.py
2. Skip RDAP for blocked TLDs, use DNS+WHOIS instead
3. Updated drop_status_checker.py to skip blocked TLDs
4. Removed banned endpoints from RDAP_ENDPOINTS

TLDs now using DNS-only: .info, .biz, .org, .dev, .app, .xyz, .online, .com, .net
TLDs still using RDAP: .ch, .li, .de (working fine)

This prevents bans and timeouts while still providing availability checks.
2025-12-21 14:39:40 +01:00
84964ccb84 fix: use correct api.request() method in ZonesTab 2025-12-21 13:30:36 +01:00
f9e6025dc4 feat: Premium infrastructure improvements
1. Parallel Zone Downloads (3x faster)
   - CZDS zones now download in parallel with semaphore
   - Configurable max_concurrent (default: 3)
   - Added timing logs for performance monitoring

2. Email Alerts for Ops
   - New send_ops_alert() in email service
   - Automatic alerts on zone sync failures
   - Critical alerts on complete job crashes
   - Severity levels: info, warning, error, critical

3. Admin Zone Sync Dashboard
   - New "Zone Sync" tab in admin panel
   - Real-time status for all TLDs
   - Manual sync trigger buttons
   - Shows drops today, total drops, last sync time
   - Health status indicators (healthy/stale/never)
   - API endpoint: GET /admin/zone-sync/status
2025-12-21 13:25:08 +01:00
3d25d87415 feat: Premium zone sync improvements
1. Parallel Zone Downloads (CZDS):
   - Downloads up to 3 TLDs concurrently
   - Reduced sync time from 3+ min to ~1 min
   - Semaphore prevents ICANN rate limits

2. Email Alerts:
   - Automatic alerts when sync fails
   - Sends to admin email with error details
   - Includes success/error summary

3. Admin Zone Sync Dashboard:
   - New "Zone Sync" tab in admin panel
   - Shows all TLDs with domain counts
   - Manual "Sync Now" buttons for Switch/CZDS
   - Live stats: drops/24h, total domains

4. Backend Improvements:
   - /admin/zone-stats endpoint
   - Fixed zone-sync endpoints with correct imports
2025-12-21 13:07:03 +01:00
6dca12dc5a fix: Add zone volume permissions to deploy pipeline 2025-12-21 12:47:20 +01:00
622aabf384 fix: Add dig to Docker, fix admin sync endpoints
- Added dnsutils (dig) to backend Dockerfile for DNS zone transfers
- Fixed admin zone sync endpoints with correct imports
- AsyncSessionLocal instead of async_session_maker
2025-12-21 12:41:36 +01:00
bbf6afe2f6 feat: Add admin endpoints for manual zone sync trigger 2025-12-21 12:36:32 +01:00
3bdb005efb feat: Consistent domain status across all pages
Backend:
- Added DROPPING_SOON status to DomainStatus enum
- Added deletion_date field to Domain model
- domain_checker now returns DROPPING_SOON for pending delete
- Track endpoint copies status and deletion_date from drop

Frontend:
- Watchlist shows "TRANSITION" status for dropping_soon domains
- AnalyzePanel shows consistent status from Watchlist
- Status display unified between Drops, Watchlist, and Panel
2025-12-21 12:32:53 +01:00
5df7d5cb96 fix: Consistent domain status across pages + refresh-all timezone fix
Backend:
- Fixed datetime timezone error in refresh-all endpoint
- Added _to_naive_utc() helper for PostgreSQL compatibility

Frontend:
- Watchlist now passes domain status to AnalyzePanel
- Status is consistent between Drops, Watchlist, and Sidepanel
- Shows "Available" or "Taken" status in AnalyzePanel from Watchlist
2025-12-20 23:44:53 +01:00
4995101dd1 fix: Frontend proxy uses pounce-backend in production
- next.config.js now detects NODE_ENV=production
- Uses http://pounce-backend:8000 in Docker instead of localhost
- Logs backend URL during build for debugging
2025-12-20 23:39:43 +01:00
c5a9bd83d5 fix: Track endpoint error handling, improve drops UI with tracked state
Backend:
- Fixed track endpoint duplicate key error with proper rollback
- Returns domain_id for already tracked domains

Frontend DropsTab:
- Added trackedDrops state to show "Tracked" status
- Track button shows checkmark when already in watchlist
- Status button shows "In Transition" with countdown

AnalyzePanel:
- Added dropStatus to store for passing drop info
- Shows Drop Status banner with availability
- "Buy Now" button for available domains in panel
2025-12-20 23:29:31 +01:00
fca54a93e7 fix: Rename GITHUB_CLIENT_SECRET to GH_OAUTH_SECRET (reserved name) 2025-12-20 23:09:58 +01:00
85b1be691a fix: Disable RDAP verification to prevent bans, improve drops UI
- Disabled verify_drops scheduler job (caused RDAP rate limit bans)
- Zone files now saved without RDAP verification (zone diff is reliable)
- Added date-based zone file snapshots with 3-day retention
- Improved DropsTab UI with better status display:
  - "In Transition" with countdown timer for dropping_soon
  - "Available Now" with Buy button
  - "Re-registered" for taken domains
  - Track button for dropping_soon domains
- Added --shm-size=8g to backend container for multiprocessing
- Removed duplicate host cron job (scheduler handles everything)
2025-12-20 22:56:25 +01:00
618eadb433 fix: Auction end_time timezone - add UTC suffix
Some checks failed
Deploy Pounce / build-and-deploy (push) Has been cancelled
The frontend was calculating wrong time remaining because
end_time was sent without timezone suffix (Z).

JavaScript's new Date() interprets "2025-12-20T20:49:20" as
local time, but the server stores it as UTC.

Fix: Add json_encoders to Pydantic models that append "Z"
to all datetime fields, marking them as UTC.

Affected models:
- AuctionListing
- AuctionSearchResponse
- MarketFeedItem
- MarketFeedResponse
- ScrapeStatus
2025-12-20 21:31:30 +01:00
77e3e9dc1f fix: Zone file persistence + .li TSIG key correction
Zone File Storage:
- Persistent storage in /data/pounce/zones/ (not /tmp)
- 3-day retention for historical snapshots
- Volume mounts in CI/CD pipeline
- New zone_retention.py for snapshot management

Bug Fix:
- Fixed wrong TSIG key for .li zone transfer
- Key was corrupted, causing BADSIG errors
- Now using official Switch.ch key

Config Changes:
- Added switch_data_dir setting
- Added zone_retention_days setting (default: 3)
- CZDS path now defaults to /data/czds
2025-12-20 21:21:37 +01:00
a7e1ceaca0 feat: Server performance boost + CI/CD improvements
Some checks failed
Deploy Pounce / build-and-deploy (push) Has been cancelled
- CI/CD: Add Redis URL and job queue env vars to deploy pipeline
- CI/CD: Fix Frontend BACKEND_URL for internal communication
- Multiprocessing: New zone_file_parser.py with parallel chunk processing
- RAM Drive: Extract zone files to /dev/shm for 50x faster I/O
- CZDS Client: Use high-performance parser with all 32 CPU cores

Performance improvements for Ryzen 9 7950X3D server:
- Zone file parsing: Minutes instead of hours
- Uses ProcessPoolExecutor with 75% of cores
- Memory-efficient streaming for 150M+ domain files
2025-12-20 21:07:49 +01:00
b0b1930b7e Security: Move secrets to Gitea Actions secrets
- All sensitive credentials now use ${{ secrets.* }} syntax
- Removed hardcoded API keys, passwords, and tokens
- Repository is now private
2025-12-20 19:55:33 +01:00
9a576f5a90 Trigger CI/CD pipeline build 2025-12-20 19:35:26 +01:00
9302c279df Fix CI/CD pipeline for self-hosted runner
- Single job deployment workflow
- Direct Docker build and deploy on server
- SSL/HTTPS configuration with Let's Encrypt
- Proper Traefik labels for routing
- Health checks and cleanup steps
2025-12-20 19:33:41 +01:00
34d242c614 Add CI/CD pipeline and Docker configuration
- Add Gitea Actions workflow for automatic deployment
- Add production Dockerfile for frontend
- Add docker-compose.prod.yml for easy deployment
- Zero-downtime deployment with health checks
2025-12-20 18:57:31 +01:00
b58b45f412 Deploy: 2025-12-19 13:35
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
2025-12-19 13:35:06 +01:00
0729c2426a Deploy: 2025-12-19 12:41
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
2025-12-19 12:41:46 +01:00
c35548c9d4 Deploy: 2025-12-19 12:34
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
2025-12-19 12:34:31 +01:00
06976674d3 Deploy: 2025-12-19 12:20
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
2025-12-19 12:20:48 +01:00
2011aae6fa Deploy: 2025-12-19 12:10
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
2025-12-19 12:10:14 +01:00
93a18820c2 Deploy: 2025-12-19 09:35
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
2025-12-19 09:35:11 +01:00
8dc6f85fb8 Deploy: 2025-12-19 09:11
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
2025-12-19 09:11:46 +01:00
108b0ae775 fix(subscription): Cancel subscription in Stripe before local downgrade
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
- Add StripeService.cancel_subscription() method
- Update /cancel endpoint to call Stripe API
- Set cancelled_at timestamp
- Clean up PostgreSQL reference in server .env
2025-12-19 07:39:24 +01:00
5d81f8d71e fix(yield): Check multiple DNS servers to handle propagation delays
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
2025-12-18 16:08:36 +01:00
c822517694 feat(yield): Add Verify DNS button for pending domains
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
2025-12-18 15:57:36 +01:00
aeafb7257e chore: Remove debug logging
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
2025-12-18 15:49:30 +01:00
186563ffba debug: Add logging to yield dashboard
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
2025-12-18 15:47:41 +01:00
eb2148080a fix: Eagerly load partner relationship for yield domains
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
2025-12-18 15:40:58 +01:00
433b0d6ebd fix: Yield dashboard + Forge UI improvements
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
Yield:
- Safely handle partner relationship to prevent errors

Forge:
- AI mode now default for Trader/Tycoon users
- AI mode button moved to left (primary position)
- "Describe your..." label now bright purple
- Textarea border brighter for better visibility
2025-12-18 15:37:24 +01:00
81eeceb856 fix: Add missing Clock import
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
2025-12-18 15:24:23 +01:00
fc40a4784d fix: Improve DNS verification for portfolio domains
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
- Check TXT records at ROOT domain instead of _pounce subdomain
- Much simpler for users - just add TXT record with verification code
- Update frontend verification modal with clearer instructions
- Add option to verify immediately when adding domain to portfolio
2025-12-18 15:22:17 +01:00
dae4da3f38 feat: Redesign Yield activation wizard with clear 3-step flow
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
- Step 1: Select domain from verified portfolio
- Step 2: Simple DNS instructions with A-record to 46.235.147.194
- Step 3: Success confirmation

Much cleaner UI with:
- Visual step indicators
- Copy IP button
- Clear explanations
- Preview for non-Tycoon users
2025-12-18 15:13:06 +01:00
800379b581 feat: HTTP-based Yield routing (no DNS server required)
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
- Updated yield_dns.py to support A-record verification (simplest method!)
- A-record pointing to 46.235.147.194 is now the primary verification method
- Added Nginx catch-all config for yield domains
- DNS schema updated with method and actual_a fields
- CoreDNS installed but Port 53 blocked by hosting provider
2025-12-18 14:55:59 +01:00
dad97f951e fix: Scout tier restrictions - no listings, no sniper alerts
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
Frontend:
- Scout: Listings and Sniper marked as unavailable
- Updated comparison table

Backend TIER_CONFIG:
- Scout: domain_limit=5, portfolio_limit=5, listing_limit=0, sniper_limit=0
- Trader: domain_limit=50, portfolio_limit=50
2025-12-18 14:47:25 +01:00
86bfcc0e36 fix: Pricing page limits consistency + DropsTab cleanup
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
Pricing page:
- Scout: 5 watchlist, 5 portfolio (was 10/3)
- Trader: 50 watchlist, 50 portfolio (was 100/50)
- Yield: Preview for Trader, Active for Tycoon
- Removed Daily Drop Digest (not implemented)

DropsTab:
- Removed zone file analysis hint banner
- Removed TLD flag icons from filter buttons
2025-12-18 14:40:49 +01:00
42e09b46ab feat: Display tier limits with infinity symbol on all pages
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
- Listing: 1/10/∞ limits, fixed table column alignment
- Watchlist: 5/50/∞ limits with display
- Portfolio: 5/50/∞ limits with display in header
- Sniper: Already had limits (2/10/50)
- Yield: Tycoon-only, no limit needed

Uses formatLimit() helper to show ∞ for Infinity values
2025-12-18 14:31:55 +01:00