├── server ├── .env.example ├── .dockerignore ├── nodemon.json └── dockerfile ├── templates ├── vanillajs │ ├── .static │ ├── script.js │ ├── .gitignore │ ├── .buildpacks │ ├── .dockerignore │ ├── package.json │ ├── vite.config.js │ ├── e2b.Dockerfile │ └── e2b.toml ├── streamlit │ ├── requirements.txt │ ├── Procfile │ ├── .gitignore │ ├── .dockerignore │ ├── main.py │ ├── e2b.Dockerfile │ └── e2b.toml ├── reactjs │ ├── src │ │ ├── vite-env.d.ts │ │ ├── lib │ │ │ └── utils.ts │ │ ├── index.tsx │ │ └── App.tsx │ ├── postcss.config.js │ ├── .dockerignore │ ├── tsconfig.json │ ├── e2b.Dockerfile │ ├── vite.config.js │ ├── index.html │ ├── components.json │ ├── tsconfig.node.json │ ├── e2b.toml │ ├── Dockerfile │ └── tsconfig.app.json ├── nextjs │ ├── cache │ │ └── config.json │ ├── public │ │ └── favicon.ico │ ├── next.config.js │ ├── .dockerignore │ ├── pages │ │ ├── _app.tsx │ │ └── api │ │ │ └── hello.ts │ ├── e2b.Dockerfile │ ├── styles │ │ └── globals.css │ ├── e2b.toml │ ├── package.json │ └── tsconfig.json ├── php │ ├── .gitattributes │ ├── .dockerignore │ ├── package.json │ ├── vite.config.js │ └── e2b.toml ├── deploy.sh ├── tsconfig.json └── package.json ├── web ├── .gitignore ├── app │ ├── opengraph-image.alt.txt │ ├── opengraph-image.png │ ├── (app) │ │ ├── code │ │ │ └── page.tsx │ │ └── dashboard │ │ │ └── page.tsx │ ├── page.tsx │ ├── (auth) │ │ └── layout.tsx │ ├── loading │ │ └── page.tsx │ └── api │ │ └── [[...route]] │ │ └── route.ts ├── public │ ├── icons │ │ ├── file_type_matlab.png │ │ ├── file_type_wallaby.svg │ │ ├── default_file.svg │ │ ├── default_folder.svg │ │ ├── file_type_c2.svg │ │ ├── file_type_erb.svg │ │ ├── file_type_volt.svg │ │ ├── file_type_bolt.svg │ │ ├── file_type_vscode.svg │ │ ├── file_type_diff.svg │ │ ├── file_type_puppet.svg │ │ ├── default_folder_opened.svg │ │ ├── file_type_kite.svg │ │ ├── file_type_vsix.svg │ │ ├── file_type_vscode2.svg │ │ ├── file_type_fsharp.svg │ │ ├── file_type_light_kite.svg │ │ ├── file_type_light_vsix.svg │ │ ├── file_type_riot.svg │ │ ├── file_type_tailwind.svg │ │ ├── file_type_vue.svg │ │ ├── file_type_cpp2.svg │ │ ├── file_type_light_gamemaker2.svg │ │ ├── file_type_nuxt.svg │ │ ├── default_root_folder.svg │ │ ├── file_type_light_codeclimate.svg │ │ ├── file_type_gamemaker2.svg │ │ ├── file_type_xml.svg │ │ ├── file_type_xsl.svg │ │ ├── file_type_npm.svg │ │ ├── file_type_procfile.svg │ │ ├── folder_type_vscode.svg │ │ ├── folder_type_vscode_test.svg │ │ ├── file_type_ionic.svg │ │ ├── file_type_codeclimate.svg │ │ ├── folder_type_private.svg │ │ ├── file_type_shaderlab.svg │ │ ├── file_type_cheader.svg │ │ ├── file_type_light_shaderlab.svg │ │ ├── file_type_circleci.svg │ │ ├── file_type_shell.svg │ │ ├── file_type_t4tt.svg │ │ ├── file_type_bazel.svg │ │ ├── file_type_idris.svg │ │ ├── file_type_light_circleci.svg │ │ ├── file_type_eslint2.svg │ │ ├── file_type_openHAB.svg │ │ ├── folder_type_plugin.svg │ │ ├── file_type_gamemaker.svg │ │ ├── file_type_wasm.svg │ │ ├── file_type_light_openHAB.svg │ │ ├── file_type_erlang.svg │ │ ├── file_type_angular.svg │ │ ├── file_type_raml.svg │ │ ├── default_root_folder_opened.svg │ │ ├── file_type_sln.svg │ │ ├── file_type_elm.svg │ │ ├── file_type_image.svg │ │ ├── file_type_karma.svg │ │ ├── file_type_typo3.svg │ │ ├── folder_type_vscode_opened.svg │ │ ├── file_type_crystal.svg │ │ ├── file_type_fsharp2.svg │ │ ├── folder_type_circleci.svg │ │ ├── folder_type_vscode_test_opened.svg │ │ ├── file_type_light_crystal.svg │ │ ├── file_type_racket.svg │ │ ├── file_type_view.svg │ │ ├── file_type_light_mlang.svg │ │ ├── file_type_audio.svg │ │ ├── file_type_autoit.svg │ │ ├── file_type_drone.svg │ │ ├── file_type_mlang.svg │ │ ├── file_type_edge.svg │ │ ├── file_type_light_drone.svg │ │ ├── file_type_sbt.svg │ │ ├── file_type_vb.svg │ │ ├── file_type_eslint.svg │ │ ├── file_type_freemarker.svg │ │ ├── file_type_markdown.svg │ │ ├── file_type_vhdl.svg │ │ ├── file_type_buckbuild.svg │ │ ├── file_type_terraform.svg │ │ ├── folder_type_private_opened.svg │ │ ├── file_type_ensime.svg │ │ ├── file_type_haskell.svg │ │ ├── folder_type_images.svg │ │ ├── file_type_appveyor.svg │ │ ├── file_type_erlang2.svg │ │ ├── file_type_progress.svg │ │ ├── folder_type_plugin_opened.svg │ │ ├── file_type_silverstripe.svg │ │ ├── file_type_applescript.svg │ │ ├── file_type_light_purescript.svg │ │ ├── folder_type_vs.svg │ │ ├── folder_type_vscode2.svg │ │ ├── file_type_text.svg │ │ ├── file_type_q.svg │ │ ├── folder_type_vscode_test2.svg │ │ ├── file_type_edge2.svg │ │ ├── file_type_light_todo.svg │ │ ├── file_type_solidity.svg │ │ ├── file_type_todo.svg │ │ ├── folder_type_circleci_opened.svg │ │ ├── file_type_codekit.svg │ │ ├── folder_type_audio.svg │ │ ├── folder_type_temp.svg │ │ ├── file_type_reason.svg │ │ ├── file_type_slice.svg │ │ ├── file_type_git2.svg │ │ ├── file_type_nim.svg │ │ ├── file_type_django.svg │ │ ├── file_type_favicon.svg │ │ ├── file_type_haskell2.svg │ │ ├── file_type_registry.svg │ │ ├── file_type_git.svg │ │ ├── file_type_js.svg │ │ ├── file_type_light_io.svg │ │ ├── file_type_jupyter.svg │ │ ├── file_type_protractor.svg │ │ ├── file_type_light_js.svg │ │ ├── folder_type_view.svg │ │ ├── file_type_c.svg │ │ ├── folder_type_images_opened.svg │ │ ├── folder_type_include.svg │ │ ├── file_type_io.svg │ │ ├── file_type_elm2.svg │ │ ├── file_type_storybook.svg │ │ ├── file_type_js_official.svg │ │ ├── file_type_csharp.svg │ │ ├── folder_type_vs_opened.svg │ │ ├── file_type_purescript.svg │ │ ├── file_type_wercker.svg │ │ ├── folder_type_temp_opened.svg │ │ ├── folder_type_vscode2_opened.svg │ │ ├── file_type_light_solidity.svg │ │ ├── file_type_elastic.svg │ │ ├── folder_type_vscode_test2_opened.svg │ │ ├── file_type_processinglang.svg │ │ ├── folder_type_audio_opened.svg │ │ ├── file_type_julia.svg │ │ ├── file_type_webpack.svg │ │ ├── file_type_cabal.svg │ │ ├── folder_type_js.svg │ │ ├── folder_type_git.svg │ │ ├── file_type_coveralls.svg │ │ ├── file_type_gitlab.svg │ │ ├── file_type_al.svg │ │ ├── file_type_dal.svg │ │ ├── file_type_jshint.svg │ │ ├── file_type_light_cabal.svg │ │ ├── file_type_cakephp.svg │ │ ├── file_type_ai.svg │ │ ├── file_type_galen.svg │ │ ├── folder_type_view_opened.svg │ │ ├── file_type_haxe.svg │ │ ├── file_type_kitchenci.svg │ │ ├── file_type_lisp.svg │ │ ├── folder_type_include_opened.svg │ │ ├── file_type_layout.svg │ │ ├── file_type_livescript.svg │ │ ├── folder_type_gitlab.svg │ │ ├── file_type_velocity.svg │ │ ├── folder_type_public.svg │ │ ├── file_type_light_codacy.svg │ │ ├── file_type_floobits.svg │ │ ├── file_type_kotlin.svg │ │ ├── file_type_sketch.svg │ │ ├── file_type_flash.svg │ │ ├── file_type_swift.svg │ │ ├── file_type_cppheader.svg │ │ ├── file_type_nginx.svg │ │ ├── file_type_map.svg │ │ ├── file_type_prometheus.svg │ │ ├── folder_type_webpack.svg │ │ ├── file_type_ng_pipe_js.svg │ │ ├── file_type_ng_guard_js.svg │ │ ├── file_type_ng_module_js.svg │ │ ├── file_type_ng_routing_js.svg │ │ ├── file_type_ng_service_js.svg │ │ ├── file_type_qsharp.svg │ │ ├── file_type_ng_component_js.svg │ │ ├── file_type_ng_directive_js.svg │ │ ├── folder_type_js_opened.svg │ │ ├── file_type_cpp.svg │ │ ├── file_type_ejs.svg │ │ ├── file_type_gradle.svg │ │ ├── file_type_ng_interceptor_js.svg │ │ ├── folder_type_git_opened.svg │ │ ├── folder_type_github.svg │ │ ├── file_type_dependencies.svg │ │ ├── file_type_fbx.svg │ │ ├── file_type_qlikview.svg │ │ ├── file_type_ini.svg │ │ ├── file_type_kos.svg │ │ ├── file_type_meteor.svg │ │ ├── folder_type_nginx.svg │ │ ├── file_type_config.svg │ │ ├── file_type_outlook.svg │ │ ├── file_type_saltstack.svg │ │ ├── file_type_light_ini.svg │ │ ├── file_type_light_rubocop.svg │ │ ├── file_type_nodemon.svg │ │ ├── file_type_stata.svg │ │ ├── file_type_light_config.svg │ │ ├── folder_type_template.svg │ │ ├── file_type_tfs.svg │ │ ├── folder_type_gitlab_opened.svg │ │ ├── file_type_textile.svg │ │ └── file_type_elasticbeanstalk.svg │ ├── project-icons │ │ └── more.svg │ └── vercel.svg ├── vercel.json ├── postcss.config.js ├── lib │ ├── colors.ts │ ├── api │ │ ├── types.ts │ │ └── utils.ts │ ├── tiers.ts │ └── data │ │ └── index.ts ├── .env.example ├── components │ ├── project │ │ ├── project-wrapper.tsx │ │ └── live │ │ │ └── room.tsx │ └── ui │ │ ├── skeleton.tsx │ │ ├── theme-provider.tsx │ │ ├── stats-item.tsx │ │ ├── submit-button.tsx │ │ ├── textarea.tsx │ │ ├── logo.tsx │ │ ├── label.tsx │ │ ├── input.tsx │ │ └── progress.tsx ├── components.json ├── assets │ └── x.svg ├── server │ ├── index.ts │ └── client.ts ├── middleware.ts └── tsconfig.json ├── .vscode ├── extensions.json └── settings.json ├── db ├── drizzle-production │ ├── 0001_spicy_vertigo.sql │ ├── 0002_glamorous_starfox.sql │ └── meta │ │ └── _journal.json ├── index.ts ├── constants.ts ├── package.json └── drizzle.config.ts ├── ai ├── src │ ├── index.ts │ └── utils │ │ └── index.ts ├── tsconfig.json └── package.json ├── .prettierrc ├── lib ├── utils │ ├── constants.ts │ ├── lock.ts │ └── ratelimit.ts └── services │ └── ConnectionManager.ts ├── tests ├── .env.example ├── tsconfig.json ├── utils │ ├── env.ts │ └── api.ts └── package.json ├── .gitignore ├── .env.example └── .github └── ISSUE_TEMPLATE └── bug_report.md /server/.env.example: -------------------------------------------------------------------------------- 1 | PORT=4000 -------------------------------------------------------------------------------- /templates/vanillajs/.static: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/.gitignore: -------------------------------------------------------------------------------- 1 | .vercel 2 | -------------------------------------------------------------------------------- /templates/vanillajs/script.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /templates/vanillajs/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /server/.dockerignore: -------------------------------------------------------------------------------- 1 | .env 2 | node_modules 3 | projects -------------------------------------------------------------------------------- /web/app/opengraph-image.alt.txt: -------------------------------------------------------------------------------- 1 | About Sandbox by Gitwit -------------------------------------------------------------------------------- /templates/streamlit/requirements.txt: -------------------------------------------------------------------------------- 1 | streamlit 2 | altair 3 | -------------------------------------------------------------------------------- /templates/reactjs/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /templates/streamlit/Procfile: -------------------------------------------------------------------------------- 1 | web: streamlit run main.py --server.port=$PORT 2 | -------------------------------------------------------------------------------- /templates/vanillajs/.buildpacks: -------------------------------------------------------------------------------- 1 | https://github.com/dokku/buildpack-nginx.git 2 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["esbenp.prettier-vscode"] 3 | } 4 | -------------------------------------------------------------------------------- /templates/streamlit/.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__ 2 | *.pyc 3 | *.pyo 4 | *.pyd 5 | .env 6 | -------------------------------------------------------------------------------- /templates/nextjs/cache/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "telemetry": { 3 | "enabled": false 4 | } 5 | } -------------------------------------------------------------------------------- /db/drizzle-production/0001_spicy_vertigo.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE "sandbox" ADD COLUMN "lastCommit" text; -------------------------------------------------------------------------------- /templates/php/.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /web/app/opengraph-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamesmurdza/gitwit/HEAD/web/app/opengraph-image.png -------------------------------------------------------------------------------- /db/drizzle-production/0002_glamorous_starfox.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE "user" ADD COLUMN "apiKeys" json DEFAULT '{}'::json NOT NULL; -------------------------------------------------------------------------------- /templates/nextjs/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamesmurdza/gitwit/HEAD/templates/nextjs/public/favicon.ico -------------------------------------------------------------------------------- /web/public/icons/file_type_matlab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamesmurdza/gitwit/HEAD/web/public/icons/file_type_matlab.png -------------------------------------------------------------------------------- /ai/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./client" 2 | export * from "./providers" 3 | export * from "./types" 4 | export * from "./utils" 5 | -------------------------------------------------------------------------------- /templates/nextjs/next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = {} 3 | 4 | module.exports = nextConfig 5 | -------------------------------------------------------------------------------- /templates/reactjs/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /web/app/(app)/code/page.tsx: -------------------------------------------------------------------------------- 1 | import { redirect } from "next/navigation" 2 | 3 | export default function Page() { 4 | redirect("/") 5 | } 6 | -------------------------------------------------------------------------------- /web/app/page.tsx: -------------------------------------------------------------------------------- 1 | import { redirect } from "next/navigation" 2 | 3 | export default async function Home() { 4 | redirect("/dashboard") 5 | } 6 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 2, 3 | "semi": false, 4 | "singleQuote": false, 5 | "insertFinalNewline": true, 6 | "useTabs": false 7 | } 8 | -------------------------------------------------------------------------------- /lib/utils/constants.ts: -------------------------------------------------------------------------------- 1 | // The amount of time in ms that a container will stay alive without a hearbeat. 2 | export const CONTAINER_TIMEOUT = 3 * 60_000 3 | -------------------------------------------------------------------------------- /server/nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "watch": [ 3 | "src" 4 | ], 5 | "ext": "ts", 6 | "exec": "concurrently \"npx tsc --watch\" \"ts-node src/index.ts\"" 7 | } -------------------------------------------------------------------------------- /web/vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "buildCommand": "cd .. && npm run build:web", 3 | "installCommand": "cd .. && npm install", 4 | "outputDirectory": ".next" 5 | } 6 | -------------------------------------------------------------------------------- /templates/vanillajs/.dockerignore: -------------------------------------------------------------------------------- 1 | # Ignore git files 2 | .git 3 | 4 | # Ignore E2B files 5 | e2b* 6 | 7 | # Ignore environment-specific node_modules 8 | node_modules -------------------------------------------------------------------------------- /tests/.env.example: -------------------------------------------------------------------------------- 1 | CLERK_SECRET_KEY=sk_text_xxxxxxxxxxxxxxxxxxxxxxxxxx 2 | CLERK_TEST_USER_ID=user_xxxxxxxxxxxxxxxxxxxxxxxx 3 | GITHUB_PAT=ghp_xxxxxxxxxxxxxxxxxxxxxxx -------------------------------------------------------------------------------- /templates/nextjs/.dockerignore: -------------------------------------------------------------------------------- 1 | # Ignore Git and system files 2 | .* 3 | 4 | # Ignore E2B files 5 | e2b* 6 | 7 | # Ignore environment-specific node_modules 8 | node_modules -------------------------------------------------------------------------------- /templates/php/.dockerignore: -------------------------------------------------------------------------------- 1 | # Ignore Git and system files 2 | .* 3 | 4 | # Ignore E2B files 5 | e2b* 6 | 7 | # Ignore environment-specific node_modules 8 | node_modules -------------------------------------------------------------------------------- /templates/reactjs/.dockerignore: -------------------------------------------------------------------------------- 1 | # Ignore Git and system files 2 | .* 3 | 4 | # Ignore E2B files 5 | e2b* 6 | 7 | # Ignore environment-specific node_modules 8 | node_modules -------------------------------------------------------------------------------- /web/public/icons/file_type_wallaby.svg: -------------------------------------------------------------------------------- 1 | file_type_wallaby -------------------------------------------------------------------------------- /templates/streamlit/.dockerignore: -------------------------------------------------------------------------------- 1 | # Ignore Git and system files 2 | .* 3 | 4 | # Ignore E2B files 5 | e2b* 6 | build-template.sh 7 | 8 | # Ignore environment-specific node_modules 9 | node_modules -------------------------------------------------------------------------------- /ai/src/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./aider-diff-merger" 2 | export * from "./error-handler" 3 | export * from "./logger" 4 | export * from "./prompt-builder" 5 | export * from "./stream-handler" 6 | -------------------------------------------------------------------------------- /templates/streamlit/main.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | 3 | st.title("Streamlit example") 4 | 5 | st.write(""" 6 | 7 | Learn about Streamlit [here](https://docs.streamlit.io/). 8 | 9 | """) 10 | -------------------------------------------------------------------------------- /web/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [ 3 | "postcss-import", 4 | "tailwindcss/nesting", 5 | "postcss-nesting", 6 | "autoprefixer", 7 | "tailwindcss", 8 | ], 9 | } 10 | -------------------------------------------------------------------------------- /web/public/icons/default_file.svg: -------------------------------------------------------------------------------- 1 | default_file -------------------------------------------------------------------------------- /templates/deploy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ "$1" ]; then 4 | cd "$1" && e2b template build 5 | else 6 | for dir in */; do 7 | [ -f "$dir/e2b.toml" ] && (cd "$dir" && e2b template build) 8 | done 9 | fi -------------------------------------------------------------------------------- /templates/reactjs/src/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 | -------------------------------------------------------------------------------- /web/lib/colors.ts: -------------------------------------------------------------------------------- 1 | export const colors = { 2 | red: "#dc2626", 3 | orange: "#ea580c", 4 | yellow: "#ca8a04", 5 | green: "#16a34a", 6 | blue: "#0284c7", 7 | purple: "#7c3aed", 8 | pink: "#db2777", 9 | } 10 | -------------------------------------------------------------------------------- /web/public/icons/default_folder.svg: -------------------------------------------------------------------------------- 1 | default_folder -------------------------------------------------------------------------------- /web/public/icons/file_type_c2.svg: -------------------------------------------------------------------------------- 1 | file_type_c2 -------------------------------------------------------------------------------- /web/public/icons/file_type_erb.svg: -------------------------------------------------------------------------------- 1 | file_type_erb -------------------------------------------------------------------------------- /web/public/icons/file_type_volt.svg: -------------------------------------------------------------------------------- 1 | file_type_volt -------------------------------------------------------------------------------- /db/index.ts: -------------------------------------------------------------------------------- 1 | import { drizzle } from "drizzle-orm/node-postgres" // Import drizzle for PostgreSQL 2 | import { env } from "./env" 3 | import * as schema from "./schema" 4 | 5 | export const db = drizzle(env.DATABASE_URL as string, { schema }) 6 | export { schema } 7 | -------------------------------------------------------------------------------- /db/constants.ts: -------------------------------------------------------------------------------- 1 | export const KNOWN_PLATFORMS = [ 2 | "github", 3 | "twitter", 4 | "instagram", 5 | "bluesky", 6 | "linkedin", 7 | "youtube", 8 | "twitch", 9 | "discord", 10 | "mastodon", 11 | "threads", 12 | "gitlab", 13 | "generic", 14 | ] as const 15 | -------------------------------------------------------------------------------- /templates/nextjs/pages/_app.tsx: -------------------------------------------------------------------------------- 1 | import '../styles/globals.css' 2 | import type { AppProps } from 'next/app' 3 | import React from 'react'; 4 | 5 | function MyApp({ Component, pageProps }: AppProps) { 6 | return 7 | } 8 | 9 | export default MyApp 10 | -------------------------------------------------------------------------------- /web/app/(auth)/layout.tsx: -------------------------------------------------------------------------------- 1 | export default function AuthLayout({ 2 | children, 3 | }: { 4 | children: React.ReactNode 5 | }) { 6 | return ( 7 |
8 | {children} 9 |
10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /web/public/project-icons/more.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/.env.example: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_APP_URL=http://localhost:3000 2 | NEXT_PUBLIC_SERVER_URL=http://localhost:4000 3 | 4 | NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in 5 | NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up 6 | NEXT_PUBLIC_CLERK_AFTER_SIGN_IN_URL=/dashboard 7 | NEXT_PUBLIC_CLERK_AFTER_SIGN_UP_URL=/dashboard -------------------------------------------------------------------------------- /web/public/icons/file_type_bolt.svg: -------------------------------------------------------------------------------- 1 | file_type_bolt -------------------------------------------------------------------------------- /templates/vanillajs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "my-project", 3 | "private": true, 4 | "version": "0.0.0", 5 | "scripts": { 6 | "dev": "vite", 7 | "build": "vite build", 8 | "preview": "vite preview", 9 | }, 10 | "dependencies": { 11 | "vite": "^5.0.12" 12 | } 13 | } -------------------------------------------------------------------------------- /templates/vanillajs/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | 3 | // https://vitejs.dev/config/ 4 | export default defineConfig({ 5 | plugins: [], 6 | server: { 7 | host: '0.0.0.0', 8 | hmr: true, // Change this line to false disable auto-refreshing. 9 | } 10 | }) 11 | -------------------------------------------------------------------------------- /web/app/loading/page.tsx: -------------------------------------------------------------------------------- 1 | import { Loader2 } from "lucide-react" 2 | 3 | export default function LoadingPage() { 4 | return ( 5 |
6 | 7 |
8 | ) 9 | } 10 | -------------------------------------------------------------------------------- /templates/reactjs/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { "path": "./tsconfig.app.json" }, 5 | { "path": "./tsconfig.node.json" } 6 | ], 7 | "compilerOptions": { 8 | "baseUrl": ".", 9 | "paths": { 10 | "@/*": ["./src/*"] 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /web/public/icons/file_type_vscode.svg: -------------------------------------------------------------------------------- 1 | file_type_vscode -------------------------------------------------------------------------------- /web/lib/api/types.ts: -------------------------------------------------------------------------------- 1 | import { User } from "@clerk/backend" 2 | import type { Hono } from "hono" 3 | import type { BlankSchema } from "hono/types" 4 | export interface AppBindings { 5 | Variables: { 6 | user: User 7 | } 8 | } 9 | 10 | export type AppOpenAPI = Hono 11 | -------------------------------------------------------------------------------- /web/public/icons/file_type_diff.svg: -------------------------------------------------------------------------------- 1 | file_type_diff -------------------------------------------------------------------------------- /templates/reactjs/src/index.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom/client"; 3 | import App from "./App"; 4 | import "./index.css"; 5 | 6 | ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /web/app/api/[[...route]]/route.ts: -------------------------------------------------------------------------------- 1 | import app from "@/server"; 2 | import { handle } from "hono/vercel"; 3 | 4 | export const runtime = "nodejs"; 5 | 6 | export const GET = handle(app); 7 | export const POST = handle(app); 8 | export const PUT = handle(app); 9 | export const PATCH = handle(app); 10 | export const DELETE = handle(app); -------------------------------------------------------------------------------- /templates/php/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "php-vite-template", 3 | "version": "1.0.0", 4 | "type": "module", 5 | "scripts": { 6 | "dev": "vite", 7 | "build": "vite build", 8 | "preview": "vite preview" 9 | }, 10 | "devDependencies": { 11 | "vite": "^5.0.0", 12 | "vite-plugin-php": "^1.0.0" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /web/public/icons/file_type_puppet.svg: -------------------------------------------------------------------------------- 1 | file_type_puppet -------------------------------------------------------------------------------- /web/public/icons/default_folder_opened.svg: -------------------------------------------------------------------------------- 1 | default_folder_opened -------------------------------------------------------------------------------- /web/public/icons/file_type_kite.svg: -------------------------------------------------------------------------------- 1 | file_type_kite -------------------------------------------------------------------------------- /web/public/icons/file_type_vsix.svg: -------------------------------------------------------------------------------- 1 | file_type_vsix -------------------------------------------------------------------------------- /web/components/project/project-wrapper.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import dynamic from "next/dynamic" 4 | import Loading from "./loading" 5 | 6 | // Dynamically import the CodeEditor with no SSR 7 | const ProjectWrapper = dynamic(() => import("./index"), { 8 | ssr: false, 9 | loading: () => , 10 | }) 11 | 12 | export { ProjectWrapper } 13 | -------------------------------------------------------------------------------- /web/public/icons/file_type_vscode2.svg: -------------------------------------------------------------------------------- 1 | file_type_vscode2 -------------------------------------------------------------------------------- /web/components/ui/skeleton.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from "@/lib/utils" 2 | 3 | function Skeleton({ 4 | className, 5 | ...props 6 | }: React.HTMLAttributes) { 7 | return ( 8 |
12 | ) 13 | } 14 | 15 | export { Skeleton } 16 | -------------------------------------------------------------------------------- /web/public/icons/file_type_fsharp.svg: -------------------------------------------------------------------------------- 1 | file_type_fsharp -------------------------------------------------------------------------------- /web/public/icons/file_type_light_kite.svg: -------------------------------------------------------------------------------- 1 | file_type_light_kite -------------------------------------------------------------------------------- /web/public/icons/file_type_light_vsix.svg: -------------------------------------------------------------------------------- 1 | file_type_light_vsix -------------------------------------------------------------------------------- /web/public/icons/file_type_riot.svg: -------------------------------------------------------------------------------- 1 | file_type_riot -------------------------------------------------------------------------------- /web/components/ui/theme-provider.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as React from "react" 4 | import { ThemeProvider as NextThemesProvider } from "next-themes" 5 | 6 | export function ThemeProvider({ 7 | children, 8 | ...props 9 | }: React.ComponentProps) { 10 | return {children} 11 | } 12 | -------------------------------------------------------------------------------- /templates/nextjs/e2b.Dockerfile: -------------------------------------------------------------------------------- 1 | # Use Node.js as the base image 2 | FROM node:20 3 | 4 | # Ensure the /home/user/project directory exists 5 | RUN mkdir -p /home/user/project 6 | 7 | # Copy everything from the current directory into /home/user/project 8 | COPY . /home/user/project 9 | 10 | # Run npm install in the project directory 11 | RUN npm install --prefix /home/user/project -------------------------------------------------------------------------------- /templates/nextjs/styles/globals.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | padding: 0; 4 | margin: 0; 5 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 6 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 7 | } 8 | 9 | a { 10 | color: inherit; 11 | text-decoration: none; 12 | } 13 | 14 | * { 15 | box-sizing: border-box; 16 | } 17 | -------------------------------------------------------------------------------- /templates/reactjs/e2b.Dockerfile: -------------------------------------------------------------------------------- 1 | # Use Node.js as the base image 2 | FROM node:20 3 | 4 | # Ensure the /home/user/project directory exists 5 | RUN mkdir -p /home/user/project 6 | 7 | # Copy everything from the current directory into /home/user/project 8 | COPY . /home/user/project 9 | 10 | # Run npm install in the project directory 11 | RUN npm install --prefix /home/user/project -------------------------------------------------------------------------------- /templates/vanillajs/e2b.Dockerfile: -------------------------------------------------------------------------------- 1 | # Use Node.js as the base image 2 | FROM node:20 3 | 4 | # Ensure the /home/user/project directory exists 5 | RUN mkdir -p /home/user/project 6 | 7 | # Copy everything from the current directory into /home/user/project 8 | COPY . /home/user/project 9 | 10 | # Run npm install in the project directory 11 | RUN npm install --prefix /home/user/project -------------------------------------------------------------------------------- /web/public/icons/file_type_tailwind.svg: -------------------------------------------------------------------------------- 1 | file_type_tailwind -------------------------------------------------------------------------------- /web/public/icons/file_type_vue.svg: -------------------------------------------------------------------------------- 1 | file_type_vue -------------------------------------------------------------------------------- /web/public/icons/file_type_cpp2.svg: -------------------------------------------------------------------------------- 1 | file_type_cpp2 -------------------------------------------------------------------------------- /web/public/icons/file_type_light_gamemaker2.svg: -------------------------------------------------------------------------------- 1 | file_type_light_gamemaker2 -------------------------------------------------------------------------------- /web/public/icons/file_type_nuxt.svg: -------------------------------------------------------------------------------- 1 | file_type_nuxt -------------------------------------------------------------------------------- /templates/nextjs/pages/api/hello.ts: -------------------------------------------------------------------------------- 1 | // Next.js API route support: https://nextjs.org/docs/api-routes/introduction 2 | import type { NextApiRequest, NextApiResponse } from 'next' 3 | 4 | type Data = { 5 | name: string 6 | } 7 | 8 | export default function handler( 9 | req: NextApiRequest, 10 | res: NextApiResponse 11 | ) { 12 | res.status(200).json({ name: 'John Doe' }) 13 | } 14 | -------------------------------------------------------------------------------- /web/public/icons/default_root_folder.svg: -------------------------------------------------------------------------------- 1 | default_root_folder -------------------------------------------------------------------------------- /web/public/icons/file_type_light_codeclimate.svg: -------------------------------------------------------------------------------- 1 | file_type_light_codeclimate -------------------------------------------------------------------------------- /web/public/icons/file_type_gamemaker2.svg: -------------------------------------------------------------------------------- 1 | file_type_gamemaker2 -------------------------------------------------------------------------------- /web/public/icons/file_type_xml.svg: -------------------------------------------------------------------------------- 1 | file_type_xml -------------------------------------------------------------------------------- /web/public/icons/file_type_xsl.svg: -------------------------------------------------------------------------------- 1 | file_type_xsl -------------------------------------------------------------------------------- /templates/php/vite.config.js: -------------------------------------------------------------------------------- 1 | import path from "path" 2 | import { defineConfig } from "vite" 3 | import php from "vite-plugin-php" 4 | export default defineConfig({ 5 | plugins: [php()], 6 | server: { 7 | host: "0.0.0.0", 8 | allowedHosts: true, // Allow all hosts 9 | }, 10 | resolve: { 11 | alias: { 12 | "@": path.resolve(__dirname, "./src"), 13 | }, 14 | }, 15 | }) 16 | -------------------------------------------------------------------------------- /web/public/icons/file_type_npm.svg: -------------------------------------------------------------------------------- 1 | file_type_npm -------------------------------------------------------------------------------- /web/public/icons/file_type_procfile.svg: -------------------------------------------------------------------------------- 1 | file_type_procfile -------------------------------------------------------------------------------- /web/public/icons/folder_type_vscode.svg: -------------------------------------------------------------------------------- 1 | folder_type_vscode -------------------------------------------------------------------------------- /templates/reactjs/vite.config.js: -------------------------------------------------------------------------------- 1 | import path from "path"; 2 | import { defineConfig } from "vite"; 3 | import react from "@vitejs/plugin-react"; 4 | 5 | // https://vitejs.dev/config/ 6 | export default defineConfig({ 7 | plugins: [react()], 8 | server: { 9 | host: "0.0.0.0", 10 | }, 11 | resolve: { 12 | alias: { 13 | "@": path.resolve(__dirname, "./src"), 14 | }, 15 | }, 16 | }); 17 | -------------------------------------------------------------------------------- /web/lib/tiers.ts: -------------------------------------------------------------------------------- 1 | export const TIERS = { 2 | FREE: { 3 | generations: 1000, 4 | maxTokens: 4096, 5 | model: "claude-sonnet-4-20250514", 6 | }, 7 | PRO: { 8 | generations: 1000, 9 | maxTokens: 4096, 10 | model: "claude-sonnet-4-20250514", 11 | }, 12 | ENTERPRISE: { 13 | generations: 1000, 14 | maxTokens: 4096, 15 | model: "claude-sonnet-4-20250514", 16 | }, 17 | } 18 | -------------------------------------------------------------------------------- /web/public/icons/folder_type_vscode_test.svg: -------------------------------------------------------------------------------- 1 | folder_type_vscode_test -------------------------------------------------------------------------------- /web/public/icons/file_type_ionic.svg: -------------------------------------------------------------------------------- 1 | file_type_ionic -------------------------------------------------------------------------------- /web/components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "new-york", 4 | "rsc": true, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.ts", 8 | "css": "app/globals.css", 9 | "baseColor": "neutral", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib/utils" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /web/public/icons/file_type_codeclimate.svg: -------------------------------------------------------------------------------- 1 | file_type_codeclimate -------------------------------------------------------------------------------- /web/assets/x.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/icons/folder_type_private.svg: -------------------------------------------------------------------------------- 1 | folder_type_private -------------------------------------------------------------------------------- /tests/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "module": "ESNext", 5 | "moduleResolution": "bundler", 6 | "strict": true, 7 | "esModuleInterop": true, 8 | "skipLibCheck": true, 9 | "forceConsistentCasingInFileNames": true, 10 | "outDir": "./dist", 11 | "paths": { 12 | "@/*": ["./*"] 13 | } 14 | }, 15 | "include": ["**/*.ts"], 16 | "exclude": ["node_modules"] 17 | } 18 | -------------------------------------------------------------------------------- /web/public/icons/file_type_shaderlab.svg: -------------------------------------------------------------------------------- 1 | file_type_shaderlab -------------------------------------------------------------------------------- /templates/reactjs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | React + TypeScript 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /web/public/icons/file_type_cheader.svg: -------------------------------------------------------------------------------- 1 | file_type_cheader -------------------------------------------------------------------------------- /web/public/icons/file_type_light_shaderlab.svg: -------------------------------------------------------------------------------- 1 | file_type_light_shaderlab -------------------------------------------------------------------------------- /web/public/icons/file_type_circleci.svg: -------------------------------------------------------------------------------- 1 | file_type_circleci -------------------------------------------------------------------------------- /web/public/icons/file_type_shell.svg: -------------------------------------------------------------------------------- 1 | file_type_shell -------------------------------------------------------------------------------- /web/public/icons/file_type_t4tt.svg: -------------------------------------------------------------------------------- 1 | file_type_t4tt -------------------------------------------------------------------------------- /web/components/ui/stats-item.tsx: -------------------------------------------------------------------------------- 1 | import { LucideIcon } from "lucide-react" 2 | 3 | export interface StatsItemProps { 4 | icon: LucideIcon 5 | label: string 6 | } 7 | 8 | export default function StatsItem({ icon: Icon, label }: StatsItemProps) { 9 | return ( 10 |
11 | 12 | {label} 13 |
14 | ) 15 | } 16 | -------------------------------------------------------------------------------- /web/public/icons/file_type_bazel.svg: -------------------------------------------------------------------------------- 1 | file_type_bazel -------------------------------------------------------------------------------- /web/public/icons/file_type_idris.svg: -------------------------------------------------------------------------------- 1 | file_type_idris -------------------------------------------------------------------------------- /web/public/icons/file_type_light_circleci.svg: -------------------------------------------------------------------------------- 1 | file_type_light_circleci -------------------------------------------------------------------------------- /web/public/icons/file_type_eslint2.svg: -------------------------------------------------------------------------------- 1 | file_type_eslint2 -------------------------------------------------------------------------------- /web/public/icons/file_type_openHAB.svg: -------------------------------------------------------------------------------- 1 | file_type_openHAB -------------------------------------------------------------------------------- /web/public/icons/folder_type_plugin.svg: -------------------------------------------------------------------------------- 1 | folder_type_plugin -------------------------------------------------------------------------------- /web/public/icons/file_type_gamemaker.svg: -------------------------------------------------------------------------------- 1 | file_type_gamemaker -------------------------------------------------------------------------------- /web/public/icons/file_type_wasm.svg: -------------------------------------------------------------------------------- 1 | file_type_wasm -------------------------------------------------------------------------------- /web/public/icons/file_type_light_openHAB.svg: -------------------------------------------------------------------------------- 1 | file_type_light_openHAB -------------------------------------------------------------------------------- /web/public/icons/file_type_erlang.svg: -------------------------------------------------------------------------------- 1 | file_type_erlang -------------------------------------------------------------------------------- /web/public/icons/file_type_angular.svg: -------------------------------------------------------------------------------- 1 | file_type_angular -------------------------------------------------------------------------------- /web/public/icons/file_type_raml.svg: -------------------------------------------------------------------------------- 1 | file_type_raml -------------------------------------------------------------------------------- /web/public/icons/default_root_folder_opened.svg: -------------------------------------------------------------------------------- 1 | default_root_folder_opened -------------------------------------------------------------------------------- /web/public/icons/file_type_sln.svg: -------------------------------------------------------------------------------- 1 | file_type_sln -------------------------------------------------------------------------------- /templates/reactjs/components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "new-york", 4 | "rsc": false, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.js", 8 | "css": "src/index.css", 9 | "baseColor": "zinc", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib/utils", 16 | "ui": "@/components/ui", 17 | "lib": "@/lib", 18 | "hooks": "@/hooks" 19 | } 20 | } -------------------------------------------------------------------------------- /web/public/icons/file_type_elm.svg: -------------------------------------------------------------------------------- 1 | file_type_elm -------------------------------------------------------------------------------- /web/public/icons/file_type_image.svg: -------------------------------------------------------------------------------- 1 | file_type_image -------------------------------------------------------------------------------- /web/public/icons/file_type_karma.svg: -------------------------------------------------------------------------------- 1 | file_type_karma -------------------------------------------------------------------------------- /web/public/icons/file_type_typo3.svg: -------------------------------------------------------------------------------- 1 | file_type_typo3 -------------------------------------------------------------------------------- /web/public/icons/folder_type_vscode_opened.svg: -------------------------------------------------------------------------------- 1 | folder_type_vscode_opened -------------------------------------------------------------------------------- /web/public/icons/file_type_crystal.svg: -------------------------------------------------------------------------------- 1 | file_type_crystal -------------------------------------------------------------------------------- /web/components/project/live/room.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { RoomProvider } from "@/liveblocks.config" 4 | 5 | export function Room({ 6 | id, 7 | children, 8 | }: { 9 | id: string 10 | children: React.ReactNode 11 | }) { 12 | return ( 13 | 19 | {/* }> */} 20 | {children} 21 | {/* */} 22 | 23 | ) 24 | } 25 | -------------------------------------------------------------------------------- /web/public/icons/file_type_fsharp2.svg: -------------------------------------------------------------------------------- 1 | file_type_fsharp2 -------------------------------------------------------------------------------- /web/public/icons/folder_type_circleci.svg: -------------------------------------------------------------------------------- 1 | folder_type_circleci -------------------------------------------------------------------------------- /web/public/icons/folder_type_vscode_test_opened.svg: -------------------------------------------------------------------------------- 1 | folder_type_vscode_test_opened -------------------------------------------------------------------------------- /web/public/icons/file_type_light_crystal.svg: -------------------------------------------------------------------------------- 1 | file_type_light_crystal -------------------------------------------------------------------------------- /web/public/icons/file_type_racket.svg: -------------------------------------------------------------------------------- 1 | file_type_racket -------------------------------------------------------------------------------- /web/public/icons/file_type_view.svg: -------------------------------------------------------------------------------- 1 | file_type_view -------------------------------------------------------------------------------- /web/public/icons/file_type_light_mlang.svg: -------------------------------------------------------------------------------- 1 | file_type_light_mlang -------------------------------------------------------------------------------- /web/public/icons/file_type_audio.svg: -------------------------------------------------------------------------------- 1 | file_type_audio -------------------------------------------------------------------------------- /web/public/icons/file_type_autoit.svg: -------------------------------------------------------------------------------- 1 | file_type_autoit -------------------------------------------------------------------------------- /web/public/icons/file_type_drone.svg: -------------------------------------------------------------------------------- 1 | file_type_drone -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.formatOnSave": true, 3 | "editor.formatOnSaveMode": "file", 4 | "editor.codeActionsOnSave": { 5 | "source.fixAll": "explicit", 6 | "source.organizeImports": "explicit" 7 | }, 8 | "tailwindCSS.experimental.classRegex": [ 9 | ["cva\\(([^)]*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]"], 10 | ["cx\\(([^)]*)\\)", "(?:'|\"|`)([^']*)(?:'|\"|`)"] 11 | ], 12 | "editor.defaultFormatter": "esbenp.prettier-vscode", 13 | "[typescript]": { 14 | "editor.defaultFormatter": "esbenp.prettier-vscode" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /templates/reactjs/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2022", 4 | "lib": ["ES2023"], 5 | "module": "ESNext", 6 | "skipLibCheck": true, 7 | 8 | "moduleResolution": "bundler", 9 | "allowImportingTsExtensions": true, 10 | "isolatedModules": true, 11 | "moduleDetection": "force", 12 | "noEmit": true, 13 | 14 | "strict": true, 15 | "noUnusedLocals": true, 16 | "noUnusedParameters": true, 17 | "noFallthroughCasesInSwitch": true 18 | }, 19 | "include": ["vite.config.ts"] 20 | } 21 | -------------------------------------------------------------------------------- /web/public/icons/file_type_mlang.svg: -------------------------------------------------------------------------------- 1 | file_type_mlang -------------------------------------------------------------------------------- /web/public/icons/file_type_edge.svg: -------------------------------------------------------------------------------- 1 | file_type_edge -------------------------------------------------------------------------------- /web/public/icons/file_type_light_drone.svg: -------------------------------------------------------------------------------- 1 | file_type_light_drone -------------------------------------------------------------------------------- /web/public/icons/file_type_sbt.svg: -------------------------------------------------------------------------------- 1 | file_type_sbt -------------------------------------------------------------------------------- /web/public/icons/file_type_vb.svg: -------------------------------------------------------------------------------- 1 | file_type_vb -------------------------------------------------------------------------------- /web/public/icons/file_type_eslint.svg: -------------------------------------------------------------------------------- 1 | file_type_eslint -------------------------------------------------------------------------------- /web/public/icons/file_type_freemarker.svg: -------------------------------------------------------------------------------- 1 | file_type_freemarker -------------------------------------------------------------------------------- /web/public/icons/file_type_markdown.svg: -------------------------------------------------------------------------------- 1 | file_type_markdown -------------------------------------------------------------------------------- /templates/streamlit/e2b.Dockerfile: -------------------------------------------------------------------------------- 1 | # Use Python 3.10 as the base image 2 | FROM python:3.10 3 | 4 | # Ensure the /home/user/project directory exists 5 | RUN mkdir -p /home/user/project 6 | 7 | # Set the working directory 8 | WORKDIR /home/user/project 9 | 10 | # Copy everything from the current directory into /home/user/project 11 | COPY . . 12 | 13 | # Create a virtual environment for Python packages 14 | RUN python3 -m venv venv 15 | 16 | # Activate the virtual environment and install Streamlit dependencies 17 | RUN ./venv/bin/pip install --no-cache-dir -r requirements.txt -------------------------------------------------------------------------------- /web/public/icons/file_type_vhdl.svg: -------------------------------------------------------------------------------- 1 | file_type_vhdl -------------------------------------------------------------------------------- /web/public/icons/file_type_buckbuild.svg: -------------------------------------------------------------------------------- 1 | file_type_buckbuild -------------------------------------------------------------------------------- /web/public/icons/file_type_terraform.svg: -------------------------------------------------------------------------------- 1 | file_type_terraform -------------------------------------------------------------------------------- /web/public/icons/folder_type_private_opened.svg: -------------------------------------------------------------------------------- 1 | folder_type_private_opened -------------------------------------------------------------------------------- /web/public/icons/file_type_ensime.svg: -------------------------------------------------------------------------------- 1 | file_type_ensime -------------------------------------------------------------------------------- /web/public/icons/file_type_haskell.svg: -------------------------------------------------------------------------------- 1 | file_type_haskell -------------------------------------------------------------------------------- /ai/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2022", 4 | "module": "node16", 5 | "lib": ["ES2022"], 6 | "outDir": "./dist", 7 | "rootDir": "./src", 8 | "strict": true, 9 | "esModuleInterop": true, 10 | "skipLibCheck": true, 11 | "forceConsistentCasingInFileNames": true, 12 | "declaration": true, 13 | "declarationMap": true, 14 | "sourceMap": true, 15 | "resolveJsonModule": true, 16 | "moduleResolution": "node16" 17 | }, 18 | "include": ["src/**/*"], 19 | "exclude": ["node_modules", "dist", "**/*.test.ts"] 20 | } 21 | -------------------------------------------------------------------------------- /web/public/icons/folder_type_images.svg: -------------------------------------------------------------------------------- 1 | folder_type_images -------------------------------------------------------------------------------- /templates/nextjs/e2b.toml: -------------------------------------------------------------------------------- 1 | # This is a config for E2B sandbox template. 2 | # You can use 'template_id' (kvvj9mobrcwbz6ykzmqg) or 'template_name (gitwit-nextjs) from this config to spawn a sandbox: 3 | 4 | # Python SDK 5 | # from e2b import Sandbox 6 | # sandbox = Sandbox(template='gitwit-nextjs') 7 | 8 | # JS SDK 9 | # import { Sandbox } from 'e2b' 10 | # const sandbox = await Sandbox.create({ template: 'gitwit-nextjs' }) 11 | 12 | team_id = "34eab90a-97dc-4be5-87e3-a17b6e6e8bc6" 13 | dockerfile = "e2b.Dockerfile" 14 | template_name = "gitwit-nextjs" 15 | template_id = "kvvj9mobrcwbz6ykzmqg" 16 | -------------------------------------------------------------------------------- /templates/reactjs/e2b.toml: -------------------------------------------------------------------------------- 1 | # This is a config for E2B sandbox template. 2 | # You can use 'template_id' (9wd4o5v55nc2edgak6vv) or 'template_name (gitwit-reactjs) from this config to spawn a sandbox: 3 | 4 | # Python SDK 5 | # from e2b import Sandbox 6 | # sandbox = Sandbox(template='gitwit-reactjs') 7 | 8 | # JS SDK 9 | # import { Sandbox } from 'e2b' 10 | # const sandbox = await Sandbox.create({ template: 'gitwit-reactjs' }) 11 | 12 | team_id = "34eab90a-97dc-4be5-87e3-a17b6e6e8bc6" 13 | dockerfile = "e2b.Dockerfile" 14 | template_name = "gitwit-reactjs" 15 | template_id = "9wd4o5v55nc2edgak6vv" 16 | -------------------------------------------------------------------------------- /web/lib/api/utils.ts: -------------------------------------------------------------------------------- 1 | import type { z } from "zod"; 2 | 3 | import { resolver } from "hono-openapi/zod"; 4 | 5 | // eslint-disable-next-line ts/ban-ts-comment 6 | // @ts-expect-error 7 | export type ZodSchema = z.ZodUnion | z.AnyZodObject | z.ZodArray; 8 | function jsonContent< 9 | T extends ZodSchema, 10 | >(schema: T, description: string) { 11 | return { 12 | content: { 13 | "application/json": { 14 | schema: resolver(schema), 15 | }, 16 | }, 17 | description, 18 | }; 19 | } 20 | 21 | export default jsonContent; -------------------------------------------------------------------------------- /web/public/icons/file_type_appveyor.svg: -------------------------------------------------------------------------------- 1 | file_type_appveyor -------------------------------------------------------------------------------- /web/public/icons/file_type_erlang2.svg: -------------------------------------------------------------------------------- 1 | file_type_erlang 2 | -------------------------------------------------------------------------------- /web/public/icons/file_type_progress.svg: -------------------------------------------------------------------------------- 1 | file_type_progress -------------------------------------------------------------------------------- /web/public/icons/folder_type_plugin_opened.svg: -------------------------------------------------------------------------------- 1 | folder_type_plugin_opened -------------------------------------------------------------------------------- /templates/streamlit/e2b.toml: -------------------------------------------------------------------------------- 1 | # This is a config for E2B sandbox template. 2 | # You can use 'template_id' (h2uk89oim5lyy7sc0pou) or 'template_name (gitwit-streamlit) from this config to spawn a sandbox: 3 | 4 | # Python SDK 5 | # from e2b import Sandbox 6 | # sandbox = Sandbox(template='gitwit-streamlit') 7 | 8 | # JS SDK 9 | # import { Sandbox } from 'e2b' 10 | # const sandbox = await Sandbox.create({ template: 'gitwit-streamlit' }) 11 | 12 | team_id = "34eab90a-97dc-4be5-87e3-a17b6e6e8bc6" 13 | dockerfile = "e2b.Dockerfile" 14 | template_name = "gitwit-streamlit" 15 | template_id = "h2uk89oim5lyy7sc0pou" 16 | -------------------------------------------------------------------------------- /templates/vanillajs/e2b.toml: -------------------------------------------------------------------------------- 1 | # This is a config for E2B sandbox template. 2 | # You can use 'template_id' (kdktilyyom02o74ogqvg) or 'template_name (gitwit-vanillajs) from this config to spawn a sandbox: 3 | 4 | # Python SDK 5 | # from e2b import Sandbox 6 | # sandbox = Sandbox(template='gitwit-vanillajs') 7 | 8 | # JS SDK 9 | # import { Sandbox } from 'e2b' 10 | # const sandbox = await Sandbox.create({ template: 'gitwit-vanillajs' }) 11 | 12 | team_id = "34eab90a-97dc-4be5-87e3-a17b6e6e8bc6" 13 | dockerfile = "e2b.Dockerfile" 14 | template_name = "gitwit-vanillajs" 15 | template_id = "kdktilyyom02o74ogqvg" 16 | -------------------------------------------------------------------------------- /web/public/icons/file_type_silverstripe.svg: -------------------------------------------------------------------------------- 1 | file_type_silverstripe -------------------------------------------------------------------------------- /server/dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20 2 | 3 | # Security: Drop all capabilities 4 | USER root 5 | RUN apt-get update && apt-get install -y libcap2-bin 6 | RUN setcap cap_net_bind_service=+ep /usr/local/bin/node 7 | 8 | WORKDIR /code 9 | 10 | COPY package*.json ./ 11 | 12 | RUN npm install 13 | 14 | COPY . . 15 | 16 | RUN npm run build 17 | 18 | # Security: Create non-root user and assign ownership 19 | RUN useradd -m appuser 20 | RUN mkdir projects && chown -R appuser:appuser projects 21 | USER appuser 22 | 23 | # todo user namespace mapping 24 | 25 | EXPOSE 5173 26 | EXPOSE 4000 27 | 28 | CMD [ "node", "dist/index.js" ] -------------------------------------------------------------------------------- /templates/php/e2b.toml: -------------------------------------------------------------------------------- 1 | # This is a config for E2B sandbox template. 2 | # You can use template ID (8zr0kth5jzu5pdfq9afh) or template name (gitwit-php) to create a sandbox: 3 | 4 | # Python SDK 5 | # from e2b import Sandbox, AsyncSandbox 6 | # sandbox = Sandbox("gitwit-php") # Sync sandbox 7 | # sandbox = await AsyncSandbox.create("gitwit-php") # Async sandbox 8 | 9 | # JS SDK 10 | # import { Sandbox } from 'e2b' 11 | # const sandbox = await Sandbox.create('gitwit-php') 12 | 13 | team_id = "34eab90a-97dc-4be5-87e3-a17b6e6e8bc6" 14 | dockerfile = "e2b.Dockerfile" 15 | template_name = "gitwit-php" 16 | template_id = " " 17 | -------------------------------------------------------------------------------- /web/public/icons/file_type_applescript.svg: -------------------------------------------------------------------------------- 1 | file_type_applescript -------------------------------------------------------------------------------- /templates/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "module": "commonjs", 5 | "lib": ["ES2020"], 6 | "declaration": true, 7 | "outDir": "./dist", 8 | "rootDir": "./", 9 | "strict": true, 10 | "esModuleInterop": true, 11 | "skipLibCheck": true, 12 | "forceConsistentCasingInFileNames": true, 13 | "moduleResolution": "node", 14 | "resolveJsonModule": true 15 | }, 16 | "include": ["index.ts"], 17 | "exclude": [ 18 | "node_modules", 19 | "dist", 20 | "nextjs", 21 | "reactjs", 22 | "streamlit", 23 | "vanillajs" 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /web/public/icons/file_type_light_purescript.svg: -------------------------------------------------------------------------------- 1 | file_type_light_purescript -------------------------------------------------------------------------------- /web/public/icons/folder_type_vs.svg: -------------------------------------------------------------------------------- 1 | folder_type_vs -------------------------------------------------------------------------------- /tests/utils/env.ts: -------------------------------------------------------------------------------- 1 | import { createEnv } from "@t3-oss/env-core" 2 | import dotenv from "dotenv" 3 | import path from "path" 4 | import { z } from "zod" 5 | 6 | dotenv.config({ path: path.resolve(__dirname, "../.env") }) 7 | dotenv.config({ path: path.resolve(__dirname, "../../.env") }) 8 | 9 | export const env = createEnv({ 10 | server: { 11 | CLERK_SECRET_KEY: z.string().min(1), 12 | CLERK_TEST_USER_ID: z.string().min(1), 13 | BACKEND_URL: z.string().min(1).default("http://localhost:3000"), 14 | GITHUB_PAT: z.string().min(1), 15 | }, 16 | runtimeEnv: process.env, 17 | emptyStringAsUndefined: true, 18 | }) 19 | -------------------------------------------------------------------------------- /web/public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/public/icons/folder_type_vscode2.svg: -------------------------------------------------------------------------------- 1 | folder_type_vscode2 -------------------------------------------------------------------------------- /db/drizzle-production/meta/_journal.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "7", 3 | "dialect": "postgresql", 4 | "entries": [ 5 | { 6 | "idx": 0, 7 | "version": "7", 8 | "when": 1753623789275, 9 | "tag": "0000_calm_pyro", 10 | "breakpoints": true 11 | }, 12 | { 13 | "idx": 1, 14 | "version": "7", 15 | "when": 1753624289753, 16 | "tag": "0001_spicy_vertigo", 17 | "breakpoints": true 18 | }, 19 | { 20 | "idx": 2, 21 | "version": "7", 22 | "when": 1760414397081, 23 | "tag": "0002_glamorous_starfox", 24 | "breakpoints": true 25 | } 26 | ] 27 | } -------------------------------------------------------------------------------- /tests/utils/api.ts: -------------------------------------------------------------------------------- 1 | import axios from "axios" 2 | import { getCachedToken } from "./auth" 3 | import { env } from "./env" 4 | 5 | 6 | export const apiClient = axios.create({ 7 | baseURL: `${env.BACKEND_URL}/api`, 8 | validateStatus: () => true, // Accept all status codes 9 | adapter: "fetch", 10 | }) 11 | // Add request interceptor 12 | apiClient.interceptors.request.use(async (config) => { 13 | const token = await getCachedToken() 14 | config.headers.Authorization = `Bearer ${token}` 15 | config.headers["Content-Type"] = "application/json" 16 | config.headers["Accept"] = "application/json" 17 | return config 18 | }) 19 | 20 | -------------------------------------------------------------------------------- /web/public/icons/file_type_text.svg: -------------------------------------------------------------------------------- 1 | file_type_text -------------------------------------------------------------------------------- /lib/utils/lock.ts: -------------------------------------------------------------------------------- 1 | export class LockManager { 2 | private locks: { [key: string]: Promise } 3 | 4 | constructor() { 5 | this.locks = {} 6 | } 7 | 8 | async acquireLock(key: string, task: () => Promise): Promise { 9 | if (!this.locks[key]) { 10 | this.locks[key] = new Promise(async (resolve, reject) => { 11 | try { 12 | const result = await task() 13 | resolve(result) 14 | } catch (error) { 15 | reject(error) 16 | } finally { 17 | delete this.locks[key] 18 | } 19 | }) 20 | } 21 | return await this.locks[key] 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /web/public/icons/file_type_q.svg: -------------------------------------------------------------------------------- 1 | file_type_q -------------------------------------------------------------------------------- /web/public/icons/folder_type_vscode_test2.svg: -------------------------------------------------------------------------------- 1 | folder_type_vscode_test2 -------------------------------------------------------------------------------- /web/server/index.ts: -------------------------------------------------------------------------------- 1 | import createApp from "@/lib/api/create-app" 2 | import { clerkAuth } from "./middlewares/clerkAuth" 3 | import { fileRouter } from "./routes/file" 4 | import { githubRouter } from "./routes/github" 5 | import { projectRouter } from "./routes/project" 6 | import { openUserRouter, userRouter } from "./routes/user" 7 | 8 | const app = createApp() 9 | .route("/user", openUserRouter) 10 | .use(clerkAuth) 11 | .route("/user", userRouter) 12 | .route("/project", projectRouter) 13 | .route("/file", fileRouter) 14 | .route("/github", githubRouter) 15 | 16 | export type AppType = typeof app 17 | 18 | export default app 19 | -------------------------------------------------------------------------------- /web/public/icons/file_type_edge2.svg: -------------------------------------------------------------------------------- 1 | file_type_edge2 -------------------------------------------------------------------------------- /templates/nextjs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "my-app", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint", 10 | }, 11 | "dependencies": { 12 | "next": "^14.1.0", 13 | "react": "^18.2.0", 14 | "react-dom": "18.2.0", 15 | "tailwindcss": "^3.4.1" 16 | }, 17 | "devDependencies": { 18 | "@types/node": "^20.11.6", 19 | "@types/react": "^18.2.48", 20 | "@types/react-dom": "^18.2.18", 21 | "eslint": "^8.56.0", 22 | "eslint-config-next": "^14.1.0", 23 | "typescript": "^5.3.3" 24 | } 25 | } -------------------------------------------------------------------------------- /web/public/icons/file_type_light_todo.svg: -------------------------------------------------------------------------------- 1 | file_type_light_todo -------------------------------------------------------------------------------- /web/public/icons/file_type_solidity.svg: -------------------------------------------------------------------------------- 1 | file_type_solidity -------------------------------------------------------------------------------- /web/public/icons/file_type_todo.svg: -------------------------------------------------------------------------------- 1 | file_type_todo -------------------------------------------------------------------------------- /web/public/icons/folder_type_circleci_opened.svg: -------------------------------------------------------------------------------- 1 | folder_type_circleci_opened -------------------------------------------------------------------------------- /web/public/icons/file_type_codekit.svg: -------------------------------------------------------------------------------- 1 | file_type_codekit -------------------------------------------------------------------------------- /web/public/icons/folder_type_audio.svg: -------------------------------------------------------------------------------- 1 | folder_type_audio -------------------------------------------------------------------------------- /web/public/icons/folder_type_temp.svg: -------------------------------------------------------------------------------- 1 | folder_type_temp -------------------------------------------------------------------------------- /web/public/icons/file_type_reason.svg: -------------------------------------------------------------------------------- 1 | file_type_reason -------------------------------------------------------------------------------- /web/public/icons/file_type_slice.svg: -------------------------------------------------------------------------------- 1 | file_type_slice -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | node_modules 5 | .pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | coverage 11 | 12 | # next.js 13 | .next/ 14 | out/ 15 | 16 | # production 17 | build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # env files 29 | .env* 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | 38 | wrangler.toml 39 | 40 | dist 41 | backend/server/projects 42 | 43 | app.yaml 44 | ingressController.yaml 45 | 46 | drizzle -------------------------------------------------------------------------------- /templates/nextjs/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": [ 4 | "dom", 5 | "dom.iterable", 6 | "esnext" 7 | ], 8 | "allowJs": true, 9 | "skipLibCheck": true, 10 | "strict": false, 11 | "noEmit": true, 12 | "incremental": true, 13 | "esModuleInterop": true, 14 | "module": "esnext", 15 | "moduleResolution": "node", 16 | "resolveJsonModule": true, 17 | "isolatedModules": true, 18 | "jsx": "preserve" 19 | }, 20 | "include": [ 21 | "next-env.d.ts", 22 | "**/*.ts", 23 | "**/*.tsx", 24 | ".next/types/**/*.ts" 25 | ], 26 | "exclude": [ 27 | "node_modules" 28 | ] 29 | } 30 | -------------------------------------------------------------------------------- /templates/reactjs/Dockerfile: -------------------------------------------------------------------------------- 1 | # Use Node.js for the build stage 2 | FROM node:20 AS build 3 | 4 | # Set the working directory 5 | WORKDIR /app 6 | 7 | # Copy package.json and package-lock.json 8 | COPY package*.json ./ 9 | 10 | # Install dependencies 11 | RUN npm install 12 | 13 | # Copy the rest of the application code 14 | COPY . . 15 | 16 | # Build the project 17 | RUN npm run build 18 | 19 | # Use Nginx to serve the built files 20 | FROM nginx:alpine 21 | 22 | # Copy the built files from the build stage 23 | COPY --from=build /app/dist /usr/share/nginx/html 24 | 25 | # Expose port 80 26 | EXPOSE 80 27 | 28 | # Start Nginx 29 | CMD ["nginx", "-g", "daemon off;"] 30 | -------------------------------------------------------------------------------- /web/public/icons/file_type_git2.svg: -------------------------------------------------------------------------------- 1 | file_type_git2 -------------------------------------------------------------------------------- /web/public/icons/file_type_nim.svg: -------------------------------------------------------------------------------- 1 | file_type_nim -------------------------------------------------------------------------------- /web/public/icons/file_type_django.svg: -------------------------------------------------------------------------------- 1 | file_type_django -------------------------------------------------------------------------------- /web/public/icons/file_type_favicon.svg: -------------------------------------------------------------------------------- 1 | file_type_favicon -------------------------------------------------------------------------------- /web/public/icons/file_type_haskell2.svg: -------------------------------------------------------------------------------- 1 | file_type_haskell2 -------------------------------------------------------------------------------- /web/public/icons/file_type_registry.svg: -------------------------------------------------------------------------------- 1 | file_type_registry -------------------------------------------------------------------------------- /web/public/icons/file_type_git.svg: -------------------------------------------------------------------------------- 1 | file_type_git -------------------------------------------------------------------------------- /web/public/icons/file_type_js.svg: -------------------------------------------------------------------------------- 1 | file_type_js -------------------------------------------------------------------------------- /web/public/icons/file_type_light_io.svg: -------------------------------------------------------------------------------- 1 | file_type_light_io -------------------------------------------------------------------------------- /db/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@gitwit/db", 3 | "version": "1.0.0", 4 | "main": "./dist/index.js", 5 | "scripts": { 6 | "build": "tsc", 7 | "dev": "tsc --watch", 8 | "migrate": "npx drizzle-kit migrate", 9 | "generate": "npx drizzle-kit generate", 10 | "studio": "npx drizzle-kit studio" 11 | }, 12 | "dependencies": { 13 | "@paralleldrive/cuid2": "^2.2.2", 14 | "dotenv": "^16.4.5", 15 | "drizzle-kit": "^0.31.4", 16 | "drizzle-orm": "^0.44.2", 17 | "drizzle-zod": "^0.7.1", 18 | "zod": "^3.25.76", 19 | "zod-openapi": "^4.2.4" 20 | }, 21 | "devDependencies": { 22 | "@types/node": "^20.19.1", 23 | "typescript": "^5.8.3" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /web/middleware.ts: -------------------------------------------------------------------------------- 1 | import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server' 2 | 3 | const isProtectedRoute = createRouteMatcher([ 4 | '/dashboard(.*)', 5 | '/code(.*)', 6 | '/api/ai(.*)' 7 | ]) 8 | 9 | export default clerkMiddleware(async (auth, req) => { 10 | if (isProtectedRoute(req)) { 11 | await auth.protect() 12 | } 13 | }) 14 | 15 | export const config = { 16 | matcher: [ 17 | // Skip Next.js internals and all static files, unless found in search params 18 | '/((?!_next|[^?]*\\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)', 19 | // Always run for API routes 20 | '/(api|trpc)(.*)', 21 | ], 22 | } -------------------------------------------------------------------------------- /web/public/icons/file_type_jupyter.svg: -------------------------------------------------------------------------------- 1 | file_type_jupyter -------------------------------------------------------------------------------- /web/public/icons/file_type_protractor.svg: -------------------------------------------------------------------------------- 1 | file_type_protractor -------------------------------------------------------------------------------- /web/public/icons/file_type_light_js.svg: -------------------------------------------------------------------------------- 1 | file_type_light_js -------------------------------------------------------------------------------- /web/server/client.ts: -------------------------------------------------------------------------------- 1 | import { env } from "@/lib/env" 2 | import { hc } from "hono/client" 3 | import type { AppType } from "." 4 | 5 | /** 6 | * Hono client for making API requests to the server. 7 | * 8 | * Note: This can be used on both server and client. 9 | */ 10 | export const apiClient = hc(env.NEXT_PUBLIC_APP_URL, { 11 | async headers() { 12 | if (typeof window === "undefined") { 13 | const { cookies } = require("next/headers") 14 | const cookieString = (await cookies()).toString() 15 | return { 16 | Cookie: cookieString, 17 | } 18 | } 19 | return { 20 | Cookie: document.cookie, 21 | } as Record 22 | }, 23 | }).api 24 | -------------------------------------------------------------------------------- /web/public/icons/folder_type_view.svg: -------------------------------------------------------------------------------- 1 | folder_type_view -------------------------------------------------------------------------------- /web/public/icons/file_type_c.svg: -------------------------------------------------------------------------------- 1 | file_type_c -------------------------------------------------------------------------------- /web/public/icons/folder_type_images_opened.svg: -------------------------------------------------------------------------------- 1 | folder_type_images_opened -------------------------------------------------------------------------------- /web/public/icons/folder_type_include.svg: -------------------------------------------------------------------------------- 1 | folder_type_include -------------------------------------------------------------------------------- /web/public/icons/file_type_io.svg: -------------------------------------------------------------------------------- 1 | file_type_io -------------------------------------------------------------------------------- /templates/reactjs/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | "moduleResolution": "bundler", 10 | "allowImportingTsExtensions": true, 11 | "isolatedModules": true, 12 | "moduleDetection": "force", 13 | "noEmit": true, 14 | "jsx": "react-jsx", 15 | 16 | "strict": true, 17 | "noUnusedLocals": true, 18 | "noUnusedParameters": true, 19 | "noFallthroughCasesInSwitch": true, 20 | 21 | "baseUrl": ".", 22 | "paths": { 23 | "@/*": ["./src/*"] 24 | } 25 | }, 26 | "include": ["src"] 27 | } 28 | -------------------------------------------------------------------------------- /web/components/ui/submit-button.tsx: -------------------------------------------------------------------------------- 1 | import { Loader2 } from "lucide-react" 2 | import { useFormStatus } from "react-dom" 3 | import { Button } from "./button" 4 | 5 | export default function SubmitButton({ 6 | isPending, 7 | disabled = false, 8 | }: { 9 | isPending: boolean 10 | disabled?: boolean 11 | }) { 12 | const formStatus = useFormStatus() 13 | const { pending } = formStatus 14 | const pend = pending || isPending 15 | 16 | return ( 17 | 26 | ) 27 | } 28 | -------------------------------------------------------------------------------- /web/public/icons/file_type_elm2.svg: -------------------------------------------------------------------------------- 1 | file_type_elm2 -------------------------------------------------------------------------------- /web/public/icons/file_type_storybook.svg: -------------------------------------------------------------------------------- 1 | file_type_storybook -------------------------------------------------------------------------------- /web/lib/data/index.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AtSign, 3 | Github, 4 | GitlabIcon as GitlabLogo, 5 | Globe, 6 | Instagram, 7 | Link, 8 | Linkedin, 9 | MessageCircle, 10 | Twitch, 11 | Twitter, 12 | Youtube, 13 | } from "lucide-react" 14 | import { KnownPlatform } from "../types" 15 | 16 | export const socialIcons: Record< 17 | KnownPlatform | "website", 18 | React.ComponentType 19 | > = { 20 | github: Github, 21 | twitter: Twitter, 22 | instagram: Instagram, 23 | bluesky: AtSign, 24 | linkedin: Linkedin, 25 | youtube: Youtube, 26 | twitch: Twitch, 27 | discord: MessageCircle, 28 | mastodon: AtSign, 29 | threads: AtSign, 30 | gitlab: GitlabLogo, 31 | generic: Link, 32 | website: Globe, 33 | } 34 | -------------------------------------------------------------------------------- /web/public/icons/file_type_js_official.svg: -------------------------------------------------------------------------------- 1 | file_type_js_official -------------------------------------------------------------------------------- /web/public/icons/file_type_csharp.svg: -------------------------------------------------------------------------------- 1 | file_type_csharp -------------------------------------------------------------------------------- /web/public/icons/folder_type_vs_opened.svg: -------------------------------------------------------------------------------- 1 | folder_type_vs_opened -------------------------------------------------------------------------------- /web/public/icons/file_type_purescript.svg: -------------------------------------------------------------------------------- 1 | file_type_purescript -------------------------------------------------------------------------------- /web/public/icons/file_type_wercker.svg: -------------------------------------------------------------------------------- 1 | file_type_wercker -------------------------------------------------------------------------------- /web/public/icons/folder_type_temp_opened.svg: -------------------------------------------------------------------------------- 1 | folder_type_temp_opened -------------------------------------------------------------------------------- /web/public/icons/folder_type_vscode2_opened.svg: -------------------------------------------------------------------------------- 1 | folder_type_vscode2_opened -------------------------------------------------------------------------------- /web/public/icons/file_type_light_solidity.svg: -------------------------------------------------------------------------------- 1 | file_type_light_solidity -------------------------------------------------------------------------------- /web/components/ui/textarea.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | import { cn } from "@/lib/utils" 4 | 5 | const Textarea = React.forwardRef< 6 | HTMLTextAreaElement, 7 | React.ComponentProps<"textarea"> 8 | >(({ className, ...props }, ref) => { 9 | return ( 10 |