ReportForge is a personal, single-operator WinForms tool for managing DevExpress reports and rendering them on demand.
- Core contains SQL Server access, schema creation, report/source storage, source password encryption, parameter validation, and DevExpress rendering.
- Studio is the desktop UI for managing sources, creating reports, and
designing/saving
.repxlayouts. - Host is a small local console process exposing report rendering over HTTP.
- SQL Server stores the application tables in the
reportingschema.
This is intentionally small:
- One operator.
- Personal desktop workflow.
- WinForms, DevExpress Reports, Dapper, and SQL Server.
- Report management and rendering only.
- Local/trusted Host endpoint only.
Keep future changes sized for that reality.
- Report - a reusable DevExpress report template. It stores the report name, description, saved layout XML, and declared parameter schema.
- Source - a saved SQL Server connection used by reports. The password is stored encrypted at rest using the local secret key.
Everything else should be treated as mechanism unless it clearly earns a place in the model.
Core.Data.Schema.EnsureCreated() creates:
reporting.Reportreporting.Source
Database connection values are read from mssql.env.
The Host reads RenderEndpointPrefix from Host/App.config.
Default:
http://localhost:8787/
Endpoints:
GET /healthreturns a simple status payload.GET /reportslists renderable reports. A report is renderable only after a layout has been saved.POST /renderrenders one report and returns a base64 file payload.
Example render request:
{
"reportId": 1,
"exportType": "Pdf",
"params": {
"pFrom": "2026-01-01",
"pTo": "2026-01-31"
}
}Allowed export formats:
PdfExcelImageHtml
- Configure
mssql.env. - Run Studio.
- Create one or more sources.
- Create a report.
- Open the designer, build the
.repxlayout, and save it. - Run Host.
- Call
/reportsto inspect available reports and parameters. - Call
/renderto generate the requested file.
Rendering should fail loudly when something is wrong:
- Missing report.
- Missing saved layout.
- Unknown parameter.
- Missing required parameter.
- Invalid parameter type.
- Invalid period range.
- Template/schema mismatch.
- Unsupported export format.
Never silently render an unfiltered or mismatched report.
- Prefer the existing Core/Studio/Host split.
- Keep database changes narrow and explicit.
- Keep the endpoint small and deterministic.
- Avoid adding unrelated workflow domains unless explicitly requested.
- Encrypt source passwords at rest, but do not overbuild security for this personal local app.