Bundles in-flight ECHODO work with the Coolify deployment configuration: App - New routes: ai, forms, planner, settings (templates/types), teams, doc detail, whiteboard detail - New components: app shell rework (icon-rail, top-header), forms builder/renderer/responses, types manager, objects creation dialog, card primitive, form + overview views - New tRPC routers: favorites, forms, types, workspaces; updates to health and objects routers - Markdown backlog sync (packages/database) + cursor-sync schema/migrations - Schema additions: forms, types, favorites, markdown_backlog, cursor_sync - Initial Drizzle migrations checked in Deployment - docker/docker-compose.coolify.yml: drops bundled Postgres/Redis (uses CT 102 shared services), removes host port mappings, adds Coolify SERVICE_FQDN_* magic vars for web + collab - .env.example rewritten as the full ECHODO/Coolify variable manifest - NextAuth gains an Authentik OIDC provider (gated on env presence) - Root layout injects Umami tracking script when configured; metadata title flipped to ECHODO Security - .gitignore expanded to exclude AGENT-DEPLOY.md, .env.*, secrets/, credentials.*, *.key, *.crt, *.pem, ssh keys Made-with: Cursor
46 lines
1.3 KiB
TypeScript
46 lines
1.3 KiB
TypeScript
import type { Metadata } from "next";
|
|
import { Inter } from "next/font/google";
|
|
import Script from "next/script";
|
|
import "@/styles/globals.css";
|
|
import { ThemeProvider } from "@/components/providers/theme-provider";
|
|
import { TRPCProvider } from "@/components/providers/trpc-provider";
|
|
|
|
const inter = Inter({ subsets: ["latin"], variable: "--font-sans" });
|
|
|
|
export const metadata: Metadata = {
|
|
title: "ECHODO",
|
|
description: "Project management, docs, and whiteboards — all in one place.",
|
|
};
|
|
|
|
const umamiScript =
|
|
process.env.NEXT_PUBLIC_UMAMI_SCRIPT ?? "https://analytics.stillwell.cloud/script.js";
|
|
const umamiWebsiteId = process.env.NEXT_PUBLIC_UMAMI_WEBSITE_ID;
|
|
|
|
export default function RootLayout({
|
|
children,
|
|
}: {
|
|
children: React.ReactNode;
|
|
}) {
|
|
return (
|
|
<html lang="en" suppressHydrationWarning>
|
|
<body className={`${inter.variable} font-sans antialiased`}>
|
|
<ThemeProvider
|
|
attribute="class"
|
|
defaultTheme="dark"
|
|
enableSystem
|
|
disableTransitionOnChange
|
|
>
|
|
<TRPCProvider>{children}</TRPCProvider>
|
|
</ThemeProvider>
|
|
{umamiWebsiteId ? (
|
|
<Script
|
|
defer
|
|
src={umamiScript}
|
|
data-website-id={umamiWebsiteId}
|
|
strategy="afterInteractive"
|
|
/>
|
|
) : null}
|
|
</body>
|
|
</html>
|
|
);
|
|
}
|