
## About Fortura Data Solutions
Fortura Data Solutions provides a modern, enterprise-grade infrastructure stack that allows organizations to **own their hardware, slash their cloud bills, and maintain full control over their data**.
We built our platform for high-demand environments like VFX studios, where petabytes of data move in real-time on tight budgets. Now, we're bringing that same performance and cost-efficiency to every business serious about their bottom line and data sovereignty.
### Why Fortura?
* **Cost Reduction:** Stop paying rent. Own the hardware and see your operational costs drop significantly, often achieving break-even within 12 months.
* **Performance:** Get cloud-level performance with sub-10ms latencies on colocated hardware, tailored to your workloads.
* **Data Ownership & Privacy:** Your data stays on your hardware, governed by your rules. AI-native workflows keep your data private, with zero leakage to third parties.
* **Integrated Stack:** We help you build on the tools you already use, wiring them together and automating the boring parts.
* **Minimal Retraining:** Our "desire paths" approach means we embed with your team, shape the system to how you *actually* work, then automate.
## Getting Started
This repository contains the code for the Fortura Data Solutions marketing website. It's built with Next.js, TypeScript, and Tailwind CSS.
### Prerequisites
- Node.js >= 20
- pnpm >= 8
- Docker (optional, for containerized deployment)
### Environment Variables
To run this project, you'll need to set up the following environment variables:
```bash
# Create a .env.local file in the root directory
cp .env.local.example .env.local
```
Then edit the `.env.local` file to include your configuration:
```env
# Next.js environment
NODE_ENV=development
# API endpoints (if applicable)
# NEXT_PUBLIC_API_URL=http://localhost:3001/api
# Analytics (if self-hosted)
# NEXT_PUBLIC_PLAUSIBLE_DOMAIN=your-domain.com
# NEXT_PUBLIC_PLAUSIBLE_API_HOST=https://plausible.your-domain.com
# Contact form submission endpoint
# CONTACT_FORM_ENDPOINT=https://n8n.your-domain.com/webhook/contact-form
# Calendly integration (if applicable)
# CALENDLY_URL=https://calendly.com/your-calendly-url
```
### Development
To run the development server:
```bash
# Install dependencies
pnpm install
# Run the development server
pnpm dev
```
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
### Docker Deployment
To build and run the application using Docker:
1. Build the Docker image:
```bash
docker build -t fortura-website -f apps/www/Dockerfile .
```
2. Run the container:
```bash
docker run -p 3000:3000 --env-file .env.local fortura-website
```
Alternatively, use docker-compose:
```bash
docker-compose up --build
```
The application will be available at [http://localhost:3000](http://localhost:3000).
### Production Build
To create a production build:
```bash
# Build the application
pnpm build
# Start the production server
pnpm start
```
## Troubleshooting
### TS2742 from Fumadocs generated files (Next.js 15 type-check)
TypeScript can flag the generated Fumadocs output in `apps/www/.source/index.ts` because the inferred type of `docs` references private internals from `fumadocs-mdx/dist/...`. Next 15 enforces strict type portability and fails with TS2742.
Fast unblock (recommended and safe): exclude generated files from type-check.
1) Ensure `apps/www/tsconfig.json` excludes the generated folder and relaxes lib checks:
```json
{
"compilerOptions": {
"skipLibCheck": true
},
"exclude": [
".source",
".source/**/*"
]
}
```
2) Clean and rebuild the app:
```bash
rm -rf apps/www/.source
pnpm -C apps/www build
```
Proper fix (long-term): align Fumadocs + Zod and regenerate.
1) Upgrade deps (workspace-wide):
```bash
pnpm -w up fumadocs-mdx@latest fumadocs-core@latest fumadocs-ui@latest @types/mdx@latest
pnpm -w up zod@^4
```
2) Regenerate the `.source` output:
```bash
rm -rf apps/www/.source
pnpm -C apps/www build
```
3) If the generator still emits a generic that triggers TS2742, enforce a portable annotation in `apps/www/.source/index.ts` (temporary):
```ts
import { _runtime } from 'fumadocs-mdx';
type DocsData = ReturnType