├── components ├── notebooks.tsx ├── ui │ ├── skeleton.tsx │ ├── sonner.tsx │ ├── label.tsx │ ├── separator.tsx │ ├── collapsible.tsx │ ├── input.tsx │ ├── tooltip.tsx │ ├── button.tsx │ ├── card.tsx │ ├── breadcrumb.tsx │ ├── animated-group.tsx │ ├── form.tsx │ ├── alert-dialog.tsx │ ├── dialog.tsx │ ├── sheet.tsx │ ├── text-effect.tsx │ ├── dropdown-menu.tsx │ └── particles.tsx ├── theme-provider.tsx ├── logout.tsx ├── footer.tsx ├── mode-switcher.tsx ├── call-to-action.tsx ├── search-form.tsx ├── mode-toggle.tsx ├── app-sidebar.tsx ├── page-wrapper.tsx ├── sidebar-data.tsx ├── note-card.tsx ├── notebook-card.tsx ├── create-note-button.tsx ├── create-notebook-button.tsx ├── forms │ ├── forgot-password-form.tsx │ ├── reset-password-form.tsx │ ├── login-form.tsx │ └── signup-form.tsx ├── features.tsx ├── auth-page.tsx ├── logo.tsx ├── emails │ ├── verification-email.tsx │ └── reset-email.tsx ├── hero-section.tsx ├── header.tsx └── rich-text-editor.tsx ├── app ├── favicon.ico ├── api │ └── auth │ │ └── [...all] │ │ └── route.ts ├── login │ └── page.tsx ├── signup │ └── page.tsx ├── forgot-password │ └── page.tsx ├── reset-password │ └── page.tsx ├── page.tsx ├── dashboard │ ├── layout.tsx │ ├── page.tsx │ └── notebook │ │ └── [notebookId] │ │ ├── note │ │ └── [noteId] │ │ │ └── page.tsx │ │ └── page.tsx ├── layout.tsx └── globals.css ├── public ├── dark.png ├── light.png ├── noteforge-logo.png ├── vercel.svg ├── window.svg ├── file.svg ├── globe.svg └── next.svg ├── postcss.config.mjs ├── next.config.ts ├── db ├── drizzle.ts └── schema.ts ├── lib ├── auth-client.ts ├── utils.ts └── auth.ts ├── drizzle.config.ts ├── eslint.config.mjs ├── middleware.ts ├── hooks └── use-mobile.ts ├── .gitignore ├── components.json ├── tsconfig.json ├── server ├── users.ts ├── notes.ts └── notebooks.ts ├── README.md ├── package.json └── auth-schema.ts /components/notebooks.tsx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheOrcDev/noteforge/HEAD/app/favicon.ico -------------------------------------------------------------------------------- /public/dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheOrcDev/noteforge/HEAD/public/dark.png -------------------------------------------------------------------------------- /public/light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheOrcDev/noteforge/HEAD/public/light.png -------------------------------------------------------------------------------- /public/noteforge-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheOrcDev/noteforge/HEAD/public/noteforge-logo.png -------------------------------------------------------------------------------- /postcss.config.mjs: -------------------------------------------------------------------------------- 1 | const config = { 2 | plugins: ["@tailwindcss/postcss"], 3 | }; 4 | 5 | export default config; 6 | -------------------------------------------------------------------------------- /public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /next.config.ts: -------------------------------------------------------------------------------- 1 | import type { NextConfig } from "next"; 2 | 3 | const nextConfig: NextConfig = { 4 | /* config options here */ 5 | }; 6 | 7 | export default nextConfig; 8 | -------------------------------------------------------------------------------- /db/drizzle.ts: -------------------------------------------------------------------------------- 1 | import { drizzle } from 'drizzle-orm/neon-http'; 2 | import { schema } from './schema'; 3 | 4 | export const db = drizzle(process.env.DATABASE_URL!, { schema }); 5 | -------------------------------------------------------------------------------- /lib/auth-client.ts: -------------------------------------------------------------------------------- 1 | import { createAuthClient } from "better-auth/react" 2 | 3 | export const authClient = createAuthClient({ 4 | baseURL: process.env.NEXT_PUBLIC_BASE_URL, 5 | }) -------------------------------------------------------------------------------- /app/api/auth/[...all]/route.ts: -------------------------------------------------------------------------------- 1 | import { auth } from "@/lib/auth"; 2 | import { toNextJsHandler } from "better-auth/next-js"; 3 | 4 | export const { POST, GET } = toNextJsHandler(auth); -------------------------------------------------------------------------------- /lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { clsx, type ClassValue } from "clsx" 2 | import { twMerge } from "tailwind-merge" 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)) 6 | } 7 | -------------------------------------------------------------------------------- /drizzle.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "drizzle-kit"; 2 | 3 | export default defineConfig({ 4 | schema: "./db/schema.ts", 5 | out: "./migrations", 6 | dialect: "postgresql", 7 | dbCredentials: { 8 | url: process.env.DATABASE_URL!, 9 | }, 10 | }); 11 | -------------------------------------------------------------------------------- /app/login/page.tsx: -------------------------------------------------------------------------------- 1 | import { LoginForm } from "@/components/forms/login-form"; 2 | 3 | export default function Page() { 4 | return ( 5 |
13 | Fast, local-first, and built for code. Notes that work the way you 14 | think. 15 |
16 | 17 |{notebook.notes?.length ?? 0} notes
63 |14 | Smart, flexible, and powerful — everything you need to build your 15 | second brain. 16 |
17 |30 | Capture ideas instantly with lightning-fast input and 31 | keyboard-first UX. No friction — just flow. 32 |
33 |
40 | 47 | Markdown, code blocks, CLI shortcuts, and Git-style versioning. 48 | Feels like home. 49 |
50 |64 | Your notes are private. Local-first architecture and optional 65 | end-to-end encryption mean full control. 66 |
67 |40 | login or create your asme account. 41 |
42 |54 | By clicking continue, you agree to our{" "} 55 | 59 | Terms of Service 60 | {" "} 61 | and{" "} 62 | 66 | Privacy Policy 67 | 68 | . 69 |
70 |153 | {body} 154 |
155 | ) 156 | } 157 | 158 | export { 159 | useFormField, 160 | Form, 161 | FormItem, 162 | FormLabel, 163 | FormControl, 164 | FormDescription, 165 | FormMessage, 166 | FormField, 167 | } 168 | -------------------------------------------------------------------------------- /components/ui/alert-dialog.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as React from "react" 4 | import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog" 5 | 6 | import { cn } from "@/lib/utils" 7 | import { buttonVariants } from "@/components/ui/button" 8 | 9 | function AlertDialog({ 10 | ...props 11 | }: React.ComponentProps