Verity solves the problem of financial reporting by turning a messy, manual document process into a workflow. Instead of treating quarterly filings and annual disclosures as static files passed around for review, the app uses RavenDB to keep the documents, their history, and their analysis in one place. That means teams can track how a filing evolved, preserve an audit trail, and work from a single source of truth when reviewing high-stakes financial narratives.
The application also demonstrates the power of declarative usage of AI tools. Filings are fetched from SEC EDGAR, then processed automatically through RavenDB’s GenAI tasks. We show how easily you can handle files bigger that the context size window and still reason about the content and extract the data that you need.
To fully embed itself into Microsoft Azure ecosystem, Verity delegates the filling payload handling to the Azure Storage, using the RavenDB's Remote Attachments. On top of this, it uses Azure Storage Queues with RavenDB's ETL capabilities to show that easily build up a data-centric hub to support communication with other parts of your platform. RavenDB's native Data Subscriptions are used to support a command line terminal, showing capability to react to documents being changed in real time.
Finally, Verity highlights how RavenDB supports trustworthy, long-lived reporting workflows through built-in governance features. The sample uses revisions to preserve audit history, archival and expiration to control document lifecycle, and AI agents to help auditors review filings in a structured way. The point is not just storing a report, but making that report defensible: keeping historical versions, managing retention automatically, and enabling AI assistance inside a controlled system of record rather than as an isolated add-on.
Built with RavenDB, .NET Aspire, Azure Storage, Azure Functions, AI integration, and a modern frontend.
The following RavenDB features are used to build the application:
- AI Capabilities
- GenAI tasks - process documents as they are added or modified by sending them to an AI model
- AI Agents - server-side components that act as secure proxies between RavenDB clients and AI models
- Clould Capabilities
- Remote Attachments - stored in external storage such as Amazon S3 or Azure
- Azure Storage Queues ETL - microsoft Azure service for the storage and retrieval of large numbers of messages
- Revisions - snapshots of documents and their extensions
- Data Subscriptions - server sends batches of documents to the client
- Hub/Sink Replication - maintain a live replica of a database or a chosen part of it
- Document Expiration - documents can be scheduled for deletion
- Data Archival - Documents are compressed, excluded from indexes and subscriptions but still present and retrievable
The following technogies were used to build this application:
- RavenDB 7.2
- .NET 10
- Aspire
- Node.js 22
- Svelte
A few steps are required to run the application locally.
- Check out the GIT repository
- Install prerequisites:
- Use
aspire runto run the application- When running for the first time,
Aspirewill ask you to fill some parameters:- UserAgent: your nick and email, eg. "UserAgent": "John john@mail.web"
- ApiKey: your OpenAI api key
- AzureStorage: your Azure storage connection string
- RavenDB License: your license which you can get here RavenDB download
- When running for the first time,
When adding a company, the user should select U.S. based companies, as foreign companies do not have 10-K and 10-Q reports, which the application focuses on.
The sink does not replicate subscriptions from the hub. Subscriptions are created only when the subscription display application (running on the sink) is started, at which point they are initialized for all existing companies. When a new company is added on the hub, a subscription is created immediately. On the sink, however, the subscription is only created after the application refreshes the company list. Until this happens, there is no active subscription for that company on the sink, which creates a potential gap where change notifications may be missed.
If you spot a bug, have an idea or a question, please let us know by rasing an issue or creating a pull request.
We do use a Discord server. If you have any doubts, don't hesistate to reach out!
We encourage you to contribute! Please read our CONTRIBUTING for details on our code of conduct and the process for submitting pull requests.
This project is licensed with the MIT license.