Skip to main content
Back to Docs

Architecture

Technical overview of the ReportBridge platform — components, data flow, API surface, and infrastructure.

Two-Account AWS Model

Customer Data Account

PostgreSQL and SQL Server instances live in the customer's own AWS account. Report data never leaves their environment.

Application Tier Account

Lambda, API Gateway, report server EC2, workspace RDS, and demo environment. Connects to customer data via VPC peering. Demo reports use isolated sample data with no customer data exposure.

Config-Driven Lambda

  • Only 4 bootstrap environment variables are required at deploy time. All other configuration is loaded at runtime from the Domo Config DataSet.
  • Fixed outbound IP via NAT gateway allows customers to whitelist a single IP in their PostgreSQL security group.

High-Level Architecture Flow

ReportBridge high-level architecture — User to Domo Dashboard to ReportBridge Viewer to AWS Lambda to ReportBridge Report Server to PostgreSQL Database

User in Domo Dashboard

Domo Everywhere iframe

ReportBridge Viewer

Requests embed token (HMAC-SHA256 auth)

embed token request

AWS Lambda API (API Gateway)

Returns signed token

signed token

Report Server (EC2 Docker)

Executes SQL queries (Npgsql connector)

SQL queries

PostgreSQL (RDS / EC2)

Returns result sets; renders paginated report

Flow Summary

  1. A Domo user opens a dashboard containing a ReportBridge card.
  2. Domo Everywhere renders the card as an iframe hosting the ReportBridge Viewer (a React ProCode app).
  3. The Viewer requests an embed token from the AWS Lambda API, authenticated via HMAC-SHA256.
  4. The Viewer embeds the report server in a nested iframe, passing the signed token.
  5. the report server reads the RDL file natively, executes PostgreSQL queries through its Npgsql connector, and renders the paginated report server-side.
  6. The rendered report is displayed inside the Domo card with full paginated fidelity.

Migration Pipeline

ReportBridge migration pipeline — SSRS RDL files through AI conversion, SQL validation with auto-fix loop, publish to the report server, catalog sync, available in viewer

Original SSRS RDL Files

T-SQL queries

ReportBridge Admin App (React ProCode)

Upload, BOM stripped, datasources replaced

AI Conversion (Claude via Anthropic API or AWS Bedrock)

Send T-SQL + schema context

SQL Validation (EXPLAIN against PostgreSQL)

PASS or FAIL

FAIL

Auto-Fix Loop (up to 5 rounds)

Re-sent to AI with error context

back to AI
PASS

Publish to the report server

catalog synced to Domo DataSet

Report Server (EC2 Docker)

Available in ReportBridge Viewer

Pipeline Summary

  1. Upload original SSRS RDL files through the ReportBridge Admin App. BOM characters are stripped and datasource references are replaced automatically.
  2. The AI Conversion Engine (Claude) receives each T-SQL query along with the target PostgreSQL schema context.
  3. Converted SQL is validated via EXPLAIN against the live PostgreSQL instance.
  4. If validation fails, the query re-enters the AI conversion loop with error context for up to 5 rounds of automatic correction.
  5. Once all queries pass, the converted RDL is published to the report server and the Domo catalog DataSet is updated.
  6. The report becomes immediately available to end users in the ReportBridge Viewer.

Components

ComponentTechnologyPurposeRuns On
ReportBridge ViewerReportBridge ViewerReact (Domo ProCode)End-user report viewer with sidebar navigation, category grouping, search, and embed token authenticationDomo (iframe)
ReportBridge AdminReportBridge AdminReact (Domo ProCode)Admin UI for report catalog, AI conversion, batch publish, database configuration, access control, and audit logDomo (iframe)
Lambda APINode.js + pg (AWS Lambda)Central API bridge; handles embed tokens, dataset writes, SQL testing, schema discovery, AI proxy, and report publishingAWS Lambda (VPC), API Gateway
ReportBridge Report ServerRDL rendering engine (.NET), Docker Compose, nginxNative RDL / RDLC rendering engineAWS EC2 (Docker Compose)
PostgreSQL (report data)PostgreSQL 14+Stores migrated SQL Server data across multiple databases per jurisdictionAWS EC2 or RDS
PostgreSQL (report server metadata)PostgreSQLInternal metadata store for the report serverDocker container on report server EC2
Config DataSetDomo DataSetInstance settings: 46 columns covering report server host, credentials, authentication mode, AI config, database mappings, and DataSet IDsDomo
Viewer Config DataSetDomo DataSetViewer-safe configuration with HMAC-signed token, API URL, and display settings (no passwords or API keys)Domo
Catalog DataSetDomo DataSetReport inventory with status, group assignments, conversion metadata (24 columns)Domo
Databases DataSetDomo DataSetPostgreSQL connection configurations per data source (12 columns)Domo
Audit DataSetDomo DataSetTimestamped log of every conversion, test, publish, and configuration changeDomo
AI Conversion EngineClaude (Anthropic API / AWS Bedrock)Converts T-SQL to PostgreSQL with schema-aware contextAnthropic Cloud / AWS Bedrock
ALB + ACM CertificateAWS Application Load BalancerHTTPS termination and TLS for the report serverAWS
Workspace DatabasePostgreSQL 16 (AWS RDS)Application state: report inventory, dataset metadata, conversion history, parameter definitions, organization config. Postgres-authoritative with automated schema versioning.AWS RDS (db.t4g.micro)
OpenResty Reverse ProxyOpenResty (nginx + Lua, Docker)CORS headers, HTTPS header rewriting, and request routingDocker container on report server EC2

Lambda API Actions

Report Rendering

rendering
ActionDescription
get-embed-tokenGenerates HMAC-SHA256 signed embed token for report server iframe authentication. Accepts jurisdiction context.
get-embed-urlGenerates a signed embed URL for iframe embedding with HMAC-SHA256 nonce, timestamp, and user email.
get-viewer-sessionValidates viewer token, fetches user groups, filters catalog server-side, returns embed token and sanitized config. Logs session to audit.

Report Publishing and Validation

publishing
ActionDescription
publish-reportUploads converted RDL (base64) to the report server via API. Temp-name-then-rename strategy.
validate-reportDownloads RDL, extracts SQL, executes against PostgreSQL for end-to-end verification.
bold-proxyGeneric proxy for report server API calls. Category listing, report metadata, admin operations.
reconcile-catalogCompares Domo catalog against the report server. Identifies mismatches and orphans.

SQL Testing and Schema Discovery

sql
ActionDescription
test-sqlValidates SQL via EXPLAIN (plan only, no execution).
run-sqlExecutes SQL with LIMIT 1 for runtime error detection. Read-only transaction enforced.
test-pgTCP connectivity test to PostgreSQL host/port.
fetch-schemasRetrieves all table/column schemas from PostgreSQL for AI context.

Domo Integration

domo
ActionDescription
write-datasetWrites rows to Domo DataSet via OAuth. Full replace and append modes.
list-groupsLists all Domo groups for Access Control assignment.
list-user-groupsFetches group memberships for a specific Domo user. Used by viewer for server-side access filtering.
create-datasetsAuto-creates 5 required DataSets (config, catalog, databases, audit, viewer-config) with correct schemas. Used by Setup Wizard.

Administration

admin
ActionDescription
generate-viewer-tokenCreates HMAC-SHA256 signed viewer token and derived API key. Writes viewer-safe config to Viewer Config DataSet.
bold-health-checkChecks report server health via documented health-check endpoints. Used by CI smoke tests.
update-dataset-schemaAdds missing columns to existing Domo DataSets. Used for zero-downtime schema evolution.

AI Conversion

ai
ActionDescription
anthropic-proxyProxies to Anthropic API or AWS Bedrock with retry on 503 (exponential backoff, up to 5 attempts).

Workspace Database

workspace
ActionDescription
ws-extract-rdlExtracts SQL queries and metadata from uploaded RDL files. Stores report, datasets, and parameters in workspace DB.
ws-convert-sqlAI converts a T-SQL dataset query to PostgreSQL with schema-aware context. Auto-stores result in workspace DB.
ws-fix-sqlAI fix loop: sends failing SQL with error context and previous attempts for iterative correction.
ws-test-allTests all dataset queries for a workspace report via EXPLAIN against live PostgreSQL.
ws-build-rdlRebuilds complete RDL XML from workspace state in native report server 2016 format. Supports PostgreSQL and SQL Server data providers.
ws-clean-publishBuilds RDL from workspace, permanently deletes any existing copy on the report server, and publishes fresh.
ws-dashboardReturns workspace summary statistics: total reports, pass/fail counts, publish status breakdown.
ws-list-reportsLists all reports in workspace DB with dataset counts, test status, and publish state. Scoped by instance_id.

Multi-Organization

multi-org
ActionDescription
list-orgsLists all organizations from workspace DB with config summary.
create-orgCreates organization with onboarding: seeds app_config, generates viewer signing secret, creates report server category.
update-orgUpdates organization-specific configuration fields (ds_map, databases, menus, access groups).

SQL Server

mssql
ActionDescription
test-mssqlTCP connectivity and authentication test against SQL Server via VPC peering.
run-mssqlExecutes SELECT query on SQL Server with TOP 100 safety limit. DDL/DML blocked. Passwords redacted in errors.
compare-report-dataRuns original T-SQL against SQL Server and converted SQL against PostgreSQL. Compares row counts and sample values for data validation.

Security Model

Defense in Depth

  • SQL injection prevention

    test-sql and run-sql accept only SELECT / WITH; DDL/DML blocked; read-only transactions.

  • Error sanitization

    Internal IPs, passwords, file paths stripped from error responses.

  • Parameterized queries

    All internal PostgreSQL operations use parameterized queries.

  • Dual-key authentication with fail-closed access

    Separate admin and viewer API keys with timing-safe validation. Server-side group filtering ensures users with no group assignments see zero reports. The Viewer app holds no passwords or database credentials.