Document Management in .NET: Renditions & Secure Links
Storing an uploaded file is the easy 20%. The other 80% — thumbnails, typed metadata, and secure expiring share links — is what every team reinvents badly. Here is how Granit solves all three.
Storing an uploaded file is the easy 20%. The other 80% — thumbnails, typed metadata, and secure expiring share links — is what every team reinvents badly. Here is how Granit solves all three.
Regex-parsing an LLM's prose reply breaks the day the model rephrases. Ask for a typed object instead — your C# type becomes a JSON schema the model must satisfy.
You don't need a vector database vendor to ship retrieval-augmented generation in .NET. Here's semantic search end to end — embeddings, pgvector, similarity search, and a grounded LLM answer — on the Postgres you already run.
Finance wants the numbers in Power BI, refreshed daily — again. Instead of hand-building another CSV export, expose a governed OData v4 feed from your .NET app and let Power BI pull live data through the same security pipeline as your grids.
Tax is where naive SaaS billing quietly breaks. Here is how to get EU cross-border VAT, US sales tax, and historical invoice integrity right in a .NET SaaS — with real Granit code.
A hand-written fetch wrapper drifts from your .NET contract the moment someone renames a field. Here is how to make the backend contract the single source of truth for your React client — with type errors at build time instead of 500s in prod.
Recurring billing looks like a cron job that charges a card once a month. Then a customer upgrades on day 20, a card declines, and someone overpays. Here is how the hard parts actually work in .NET.
Recurring EU billing does not require a US payment gateway. Here is how a provider-agnostic design collects a finalized invoice over SEPA — no Stripe, no Mollie, no Cloud Act exposure — and stays retry-safe end to end.
You do not need a metering vendor to bill on usage. Here is the full in-process pipeline — event ingest, idempotent dedupe, watermark rollup, quota alerts, invoice — built on Granit.Metering and Granit.Invoicing.
Row-level, schema-per-tenant, or database-per-tenant? Here is how the three isolation strategies trade off — and how Granit gives you the safe default plus a mechanical path to strict isolation when a customer demands it.