Fortura/README.md
2025-08-20 12:59:31 -06:00

5.7 KiB

Fortura Data Solutions

A high-performance, cost-effective, and privacy-first alternative to cloud hosting for enterprises.

GitHub Repo stars Twitter Follow License

hero

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:

# 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:

# 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:

# Install dependencies
pnpm install

# Run the development server
pnpm dev

Open 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:

    docker build -t fortura-website -f apps/www/Dockerfile .
    
  2. Run the container:

    docker run -p 3000:3000 --env-file .env.local fortura-website
    

Alternatively, use docker-compose:

docker-compose up --build

The application will be available at http://localhost:3000.

Production Build

To create a production build:

# 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:
{
  "compilerOptions": {
    "skipLibCheck": true
  },
  "exclude": [
    ".source",
    ".source/**/*"
  ]
}
  1. Clean and rebuild the app:
rm -rf apps/www/.source
pnpm -C apps/www build

Proper fix (long-term): align Fumadocs + Zod and regenerate.

  1. Upgrade deps (workspace-wide):
pnpm -w up fumadocs-mdx@latest fumadocs-core@latest fumadocs-ui@latest @types/mdx@latest
pnpm -w up zod@^4
  1. Regenerate the .source output:
rm -rf apps/www/.source
pnpm -C apps/www build
  1. If the generator still emits a generic that triggers TS2742, enforce a portable annotation in apps/www/.source/index.ts (temporary):
import { _runtime } from 'fumadocs-mdx';
type DocsData = ReturnType<typeof _runtime.docs>;
export const docs: DocsData = _runtime.docs(/* generated arrays */);
// or fallback: export const docs: unknown = _runtime.docs(/* generated arrays */);

Note: Keeping .source excluded from type-checks is fine even after upgrades; it also speeds up CI.

Documentation

Detailed documentation for Fortura's services, migration guides, and operational procedures is available to clients on our internal portal.

License

This website's code is licensed under a proprietary license. See LICENSE.md for details.