Any issues? Contact the Customer Services Team on +45 2383 5523 or support@intellens.com
This console writes directly to production. Every action is logged to the audit trail. When in doubt, check Recent Activity before making changes.
The Intellens Admin Console is the internal operations tool for Intellens staff. It gives you direct, audited access to the production database through a purpose-built UI — creating clients, managing users, onboarding suppliers, inspecting what users see, and reviewing the full change history.
It runs locally on your machine over an SSM tunnel to production RDS. The PRODUCTION badge is intentional — there is no staging version of this tool.
https://app.intellens.aiaggressive / balanced / conservative. Controls which risk alerts surface in the app. balanced is the usual default.| Role | What they can do in the app |
|---|---|
| admin | Full access: manage users, suppliers, settings, view all data. |
| manager | View and manage suppliers, alerts, tasks — cannot manage users. |
| user | Read-only access to dashboards and alerts. |
| intellens_staff | Internal Intellens staff role — same access as admin but scoped to the Intellens org client. |
Shows the most recent successful login timestamp. Never logged in means the user hasn't used their credentials yet — common for newly created accounts.
Company*. Optional: Email, Type, Importance, ABC, Address.composite_supplier_risk_timeline cron manually from AWS Lambda.Shadow profiling lets you open app.intellens.ai exactly as a specific user would see it — their suppliers, risk scores, alerts, and settings — without knowing their password or disrupting their session.
It is used for: customer support calls, onboarding reviews, reproducing reported bugs, and QA on a specific client's data.
app.intellens.ai loaded as that user.| Control | What it does |
|---|---|
| One-time token | 32 random bytes, burned on first use — the URL is useless after the tab opens. |
| 5-minute expiry | Token expires before it can be forwarded or leaked from logs. |
| 15-minute session | The shadow JWT expires in 15 min. Regular user JWTs are unaffected. |
| Dual-identity JWT | Every API call the app makes carries both your identity and the target user's. All server-side mutations are attributed to you, not the user. |
| Immutable audit | Token mint and redemption are both written to the audit trail. Neither can be deleted by the operator. |
| User notification | The target user receives an email the moment the session opens, including your name and the reason. |
| One active token per user | Clicking "View as" twice returns the same token — no flooding. |
The target user receives an email like: "An Intellens administrator (lm@intellens.ai) opened a shadow session on your account — Reason: Customer support call — 2026-06-26 14:03 UTC."
Their own session is not affected. They stay logged in. The shadow session is entirely separate.
Every mutation made through this console is written to settings.audit_log in real time. The feed at the bottom of the right panel shows the 50 most recent entries.
| Action | What it means |
|---|---|
create_client | New client organisation created. |
create_user | New user account created (includes which client). |
update_user | User profile field changed. Metadata shows the old → new values. |
delete_user | Soft delete. The ↩ Undo button appears on this row — use it to restore. |
restore_user | User restored from soft delete. |
reset_password | Password reset by operator. Does not log the new password. |
add_supplier | Supplier added to a client. |
update_supplier | Supplier field changed. |
delete_supplier | Soft delete. ↩ Undo available. |
restore_supplier | Supplier restored from soft delete. |
shadow_token_minted | Shadow session token generated — who, for which user, and the stated reason. |
shadow_view | Data panel opened for a user (read-only, separate from the live session). |
login_locked | An email address was locked out after too many failed login attempts. |
The ↩ Undo button appears on delete_user and delete_supplier rows. Clicking it calls the restore endpoint and creates a restore_* audit entry. The operation is instant and writes to production — there is no confirmation prompt.
Each activity row shows: who was affected (name + email + client), what fields changed (for updates), and when. Timestamps are relative ("3 min ago") — hover for the exact UTC time.
The Lambda monitor (left panel, λ button) is an at-a-glance view of every intellens-* Lambda's execution status and recent failures, grouped by SAM stack (action / fact / operations). It is read-only — it queries CloudWatch, CloudWatch Logs, and Lambda; it never invokes or modifies anything.
Each function carries a text status badge (colour and word, so it reads without relying on colour). Failing / warning / unknown rows are also tinted with a coloured left border.
| Badge | Meaning |
|---|---|
| healthy | Ran in the last 24h with no failed invocations, no logged ERROR lines, and no alarm firing. |
| warning | Throttled; overdue (a function that normally runs at least daily hasn't logged anything in >26h); or running much slower / much faster than its own 7-day norm (possible hang vs silent no-op). |
| recovered | Logged an ERROR earlier in the last 24h, but the most recent run completed cleanly (a success line newer than the last error) — a transient/upstream blip (e.g. a World Bank 503), not a current failure. |
| failing | A real failure: a failed invocation (Errors metric), an ERROR/Traceback line in the logs (even if the invocation "succeeded" — unless it has since recovered), or a CloudWatch alarm in ALARM. |
| unknown | Metrics or logs couldn't be read for a function that did run — we can't confirm it's clean, so it is deliberately not shown as healthy. |
| idle | No invocations in 24h — normal for on-demand / monthly functions. |
Why two kinds of "error": CloudWatch's Errors metric only counts invocations that failed. A function can catch an exception, log it as ERROR, and still return success — invisible to the metric. This board counts both (the ⚑ flag = logged-only), so a run that quietly logged errors can't hide behind a healthy badge.
ERROR-line count (amber ⚑, + if the 100-line cap was hit; n/a = logs couldn't be read). Either one flags the function failing. A red ↑ means more failed invocations than the function's own 7-day daily average (trending up). Hover the cell for when it last failed (UTC).Firing-alarms panel — above the tables, every alarm currently in ALARM is listed with its reason. Alarms not tied to a specific function (custom-metric / business alarms) are tagged standalone so they can't slip through the per-function view.
The board leads with a hero count ("3 functions failing" / "2 need attention" / "All N healthy"), a chip strip, the firing-alarms panel, and a Needs attention list of the worst offenders with the reason each is flagged — click one to jump straight to its row. Show problems only collapses the board to failing/warning/unknown functions. Rows are sorted worst-first within each stack.
Click any row to expand it: a one-line summary of what the function does, a status line with 24h + 7d counts, avg/peak duration and the last run's timing, the full Last output, every alarm with its reason, quick actions (Logs↗ / Function↗ / Metrics↗ deep-link into the AWS console in a new tab — read-only, authorised by your own AWS session; Copy name), and the last ~25 ERROR / Exception / Traceback / "Task timed out" lines from /aws/lambda/<function>. Use ↻ Refresh to re-pull (results are briefly server-cached, so a burst of refreshes is cheap). The console stays read-only — it never invokes or changes anything.
Requires the console's IAM role to allow lambda:ListFunctions, cloudwatch:GetMetricData, cloudwatch:DescribeAlarms, logs:DescribeLogStreams, logs:FilterLogEvents, logs:GetLogEvents (see CONSOLE_LAMBDA_DASHBOARD.md).
| Layer | Protection |
|---|---|
| Localhost binding | Server binds to 127.0.0.1:8765 only — not reachable over the network. |
| Host-header allowlist | Rejects requests from any host not in {127.0.0.1:8765, localhost:8765} — blocks DNS rebinding attacks. |
| Origin check | Every /api/* call checks the Origin header; state-changing requests (POST/PATCH/DELETE) must carry an allowed Origin — blocks cross-site requests from other tabs. |
| Session token | A per-login session token is minted on a successful superadmin login + 2FA and sent in the custom X-Admin-Token header on every authenticated API call. A custom header can't be added cross-site without a CORS preflight, so this is the primary CSRF control. |
| 2FA login | Password + one-time code emailed to the superadmin's own address. Both must match. Codes expire in 10 minutes. |
| Rate limiting | 5 wrong passwords → 15-minute lockout per email. 5 wrong 2FA codes → code invalidated immediately. |
| Session TTL | Admin sessions expire after 8 hours. |
| SSM tunnel | Database access flows through an AWS SSM tunnel to the production RDS — the DB port is never exposed to the internet. |
netstat -ano | findstr 8765 then taskkill /PID <pid> /F.