├── 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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_c2.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_erb.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_volt.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/web/public/icons/default_folder_opened.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_kite.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_vsix.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_light_kite.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_light_vsix.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_riot.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_vue.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_cpp2.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_light_gamemaker2.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_nuxt.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_light_codeclimate.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_gamemaker2.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_xml.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_xsl.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_procfile.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_vscode.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_ionic.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/web/assets/x.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_private.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_light_shaderlab.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_circleci.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_shell.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_t4tt.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_idris.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_light_circleci.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_eslint2.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_openHAB.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_plugin.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_gamemaker.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_wasm.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_light_openHAB.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_erlang.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_angular.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_raml.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/default_root_folder_opened.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_sln.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_image.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_karma.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_typo3.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_vscode_opened.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_crystal.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_circleci.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_vscode_test_opened.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_light_crystal.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_racket.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_view.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_light_mlang.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_audio.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_autoit.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_drone.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.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 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_edge.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_light_drone.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_sbt.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_vb.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_eslint.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_freemarker.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_markdown.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_buckbuild.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_terraform.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_private_opened.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_ensime.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_haskell.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_erlang2.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_progress.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_plugin_opened.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_vs.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_vscode_test2.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_solidity.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_todo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_circleci_opened.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_codekit.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_audio.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_temp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_reason.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_slice.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.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 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_nim.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_django.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_favicon.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_haskell2.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_registry.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_git.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_js.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_light_io.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_protractor.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_light_js.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_c.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_images_opened.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_include.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_io.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_storybook.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_csharp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_vs_opened.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_purescript.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_wercker.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_temp_opened.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_vscode2_opened.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_light_solidity.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
18 | )
19 | })
20 | Textarea.displayName = "Textarea"
21 |
22 | export { Textarea }
23 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_elastic.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_vscode_test2_opened.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lib/utils/ratelimit.ts:
--------------------------------------------------------------------------------
1 | import { RateLimiterMemory } from "rate-limiter-flexible"
2 |
3 | export const saveFileRL = new RateLimiterMemory({
4 | points: 2,
5 | duration: 1,
6 | })
7 |
8 | export const MAX_BODY_SIZE = 5 * 1024 * 1024
9 |
10 | export const createFileRL = new RateLimiterMemory({
11 | points: 1,
12 | duration: 2,
13 | })
14 |
15 | export const createFolderRL = new RateLimiterMemory({
16 | points: 1,
17 | duration: 2,
18 | })
19 |
20 | export const renameFileRL = new RateLimiterMemory({
21 | points: 1,
22 | duration: 2,
23 | })
24 |
25 | export const deleteFileRL = new RateLimiterMemory({
26 | points: 1,
27 | duration: 2,
28 | })
29 |
30 | export const deleteFolderRL = new RateLimiterMemory({
31 | points: 1,
32 | duration: 2,
33 | })
34 |
--------------------------------------------------------------------------------
/templates/reactjs/src/App.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { Button } from "@/components/ui/button";
3 |
4 |
5 | export default function App() {
6 | const [count, setCount] = React.useState(0);
7 |
8 | return (
9 |
10 |
11 |
12 | Welcome to my ⚛️ React app built with ⚡ Vite!
13 |
14 |
This is a tailwind template.
15 |
18 |
19 |
20 | );
21 | }
22 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_processinglang.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_audio_opened.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_julia.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/db/drizzle.config.ts:
--------------------------------------------------------------------------------
1 | import dotenv from "dotenv"
2 | import type { Config } from "drizzle-kit"
3 | import { defineConfig } from "drizzle-kit"
4 | import path from "path"
5 | import "zod-openapi/extend" // For extending the Zod schema with OpenAPI properties
6 |
7 | // Load environment variables
8 | if (process.env.NODE_ENV === "production")
9 | dotenv.config({ path: path.resolve(__dirname, "../.env.production") })
10 | dotenv.config({ path: path.resolve(__dirname, "../.env") })
11 |
12 | export default defineConfig({
13 | out:
14 | process.env.NODE_ENV === "production"
15 | ? "./drizzle-production"
16 | : "./drizzle",
17 | schema: "./schema.ts",
18 | dialect: "postgresql",
19 | dbCredentials: {
20 | url: process.env.DATABASE_URL!,
21 | },
22 | }) satisfies Config
23 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_webpack.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_cabal.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_js.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_git.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/components/ui/logo.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import DarkLogo from "@/assets/logo-dark.svg"
4 | import LightLogo from "@/assets/logo-light.svg"
5 | import Image from "next/image"
6 |
7 | interface LogoProps extends React.HTMLAttributes {
8 | size?: number
9 | }
10 |
11 | export function Logo({ size = 36, ...props }: LogoProps) {
12 | return (
13 |
14 |
21 |
28 |
29 | )
30 | }
31 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_coveralls.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_gitlab.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/templates/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@gitwit/templates",
3 | "version": "1.0.0",
4 | "description": "Reusable project templates for GitWit",
5 | "main": "dist/index.js",
6 | "types": "dist/index.d.ts",
7 | "scripts": {
8 | "build": "tsc",
9 | "dev": "tsc --watch",
10 | "deploy": "node deploy.js"
11 | },
12 | "exports": {
13 | ".": "./dist/index.js",
14 | "./configs": "./dist/index.js",
15 | "./nextjs": "./nextjs",
16 | "./reactjs": "./reactjs",
17 | "./streamlit": "./streamlit",
18 | "./vanillajs": "./vanillajs",
19 | "./php": "./php"
20 | },
21 | "files": [
22 | "dist",
23 | "nextjs",
24 | "reactjs",
25 | "streamlit",
26 | "vanillajs",
27 | "php"
28 | ],
29 | "devDependencies": {
30 | "typescript": "^5.8.3"
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_al.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_dal.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_jshint.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_light_cabal.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_cakephp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_ai.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_galen.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_view_opened.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_haxe.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_kitchenci.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_lisp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_include_opened.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.env.example:
--------------------------------------------------------------------------------
1 | # Connection string for a Postgres database
2 | DATABASE_URL=
3 |
4 | # API key for E2B, obtainable at https://e2b.dev/
5 | E2B_API_KEY=
6 |
7 | # API key and publishable key for Clerk, obtainable at https://clerk.com/
8 | CLERK_SECRET_KEY=
9 | NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=
10 |
11 | # API key for OpenAI, obtainable at https://openai.com/api/
12 | OPENAI_API_KEY=
13 |
14 | # API key for Anthropic, obtainable at https://console.anthropic.com/api
15 | ANTHROPIC_API_KEY=
16 |
17 | # Optional: As an alternative to Anthropic, you can use AWS Bedrock
18 | AWS_ACCESS_KEY_ID=
19 | AWS_SECRET_ACCESS_KEY=
20 | AWS_REGION=us-east-1
21 | AWS_MODEL_ID=qwen.qwen3-32b-v1:0
22 | # AWS_MODEL_ID=qwen.qwen3-coder-30b-a3b-v1:0
23 |
24 | # Optional: Dokku credentials for deployments
25 | DOKKU_HOST=
26 | DOKKU_USERNAME=
27 | DOKKU_KEY=
28 |
29 |
--------------------------------------------------------------------------------
/lib/services/ConnectionManager.ts:
--------------------------------------------------------------------------------
1 | import { Socket } from "socket.io"
2 |
3 | // Owner Connection Management
4 | export class ConnectionManager {
5 | // Stores all sockets connected to a given sandbox
6 | private sockets: Record> = {}
7 |
8 | // Adds a connection for a sandbox
9 | addConnectionForProject(socket: Socket, projectId: string) {
10 | this.sockets[projectId] ??= new Set()
11 | this.sockets[projectId].add(socket)
12 | }
13 |
14 | // Removes a connection for a sandbox
15 | removeConnectionForProject(socket: Socket, projectId: string) {
16 | this.sockets[projectId]?.delete(socket)
17 | }
18 |
19 | // Returns the set of sockets connected to a given sandbox
20 | connectionsForProject(projectId: string): Set {
21 | return this.sockets[projectId] ?? new Set()
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/tests/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "socket-io-test",
3 | "version": "1.0.0",
4 | "description": "A test script for socket.io-client using ES6 modules and TypeScript",
5 | "main": "dist/index.js",
6 | "type": "module",
7 | "scripts": {
8 | "dev": "vitest dev --testTimeout=30000",
9 | "dev:hi": "vitest dev github.test.ts --testTimeout=30000",
10 | "test": "vitest run"
11 | },
12 | "author": "Your Name",
13 | "license": "ISC",
14 | "dependencies": {
15 | "@t3-oss/env-core": "^0.13.4",
16 | "axios": "^1.9.0",
17 | "dotenv": "^16.4.5",
18 | "socket.io-client": "^4.7.5",
19 | "supertest": "^7.1.1",
20 | "zod": "^3.25.24"
21 | },
22 | "devDependencies": {
23 | "@types/supertest": "^6.0.3",
24 | "ts-node": "^10.9.2",
25 | "typescript": "^5.0.0",
26 | "vitest": "^3.1.4"
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/web/components/ui/label.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as LabelPrimitive from "@radix-ui/react-label"
4 | import { cva, type VariantProps } from "class-variance-authority"
5 | import * as React from "react"
6 |
7 | import { cn } from "@/lib/utils"
8 |
9 | const labelVariants = cva(
10 | "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
11 | )
12 |
13 | const Label = React.forwardRef<
14 | React.ElementRef,
15 | React.ComponentPropsWithoutRef &
16 | VariantProps
17 | >(({ className, ...props }, ref) => (
18 |
23 | ))
24 | Label.displayName = LabelPrimitive.Root.displayName
25 |
26 | export { Label }
27 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_layout.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_livescript.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_gitlab.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_velocity.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_public.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_light_codacy.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_floobits.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_kotlin.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_sketch.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_flash.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_swift.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ai/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@gitwit/ai",
3 | "version": "1.0.0",
4 | "description": "Modular AI service package for GitWit",
5 | "main": "dist/index.js",
6 | "types": "dist/index.d.ts",
7 | "scripts": {
8 | "build": "tsc",
9 | "dev": "tsc --watch",
10 | "test": "jest"
11 | },
12 | "dependencies": {
13 | "@ai-sdk/anthropic": "^1.2.12",
14 | "@ai-sdk/openai": "^1.3.23",
15 | "@ai-sdk/amazon-bedrock": "^1.0.3",
16 | "ai": "^4.3.19",
17 | "chalk": "^4.1.2",
18 | "zod": "^3.24.1"
19 | },
20 | "devDependencies": {
21 | "jest": "^29.7.0",
22 | "typescript": "^5.8.3"
23 | },
24 | "exports": {
25 | ".": "./dist/index.js",
26 | "./client": "./dist/client/index.js",
27 | "./providers": "./dist/providers/index.js",
28 | "./types": "./dist/types/index.js",
29 | "./utils": "./dist/utils/index.js"
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_cppheader.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_nginx.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_map.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_prometheus.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_webpack.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "lib": [
4 | "dom",
5 | "dom.iterable",
6 | "esnext"
7 | ],
8 | "types": [
9 | "node"
10 | ],
11 | "allowJs": true,
12 | "skipLibCheck": true,
13 | "strict": true,
14 | "noEmit": true,
15 | "esModuleInterop": true,
16 | "module": "esnext",
17 | "moduleResolution": "bundler",
18 | "resolveJsonModule": true,
19 | "isolatedModules": true,
20 | "jsx": "preserve",
21 | "incremental": true,
22 | "plugins": [
23 | {
24 | "name": "next"
25 | }
26 | ],
27 | "paths": {
28 | "@/*": [
29 | "./*"
30 | ]
31 | },
32 | "target": "ES2017"
33 | },
34 | "include": [
35 | "next-env.d.ts",
36 | "**/*.ts",
37 | "**/*.tsx",
38 | ".next/types/**/*.ts"
39 | ],
40 | "exclude": [
41 | "node_modules"
42 | ]
43 | }
44 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help us improve
4 | title: "[Editor/AI Chat/Project/Dashboard/...] Bug description"
5 | labels: ""
6 | assignees: ""
7 | ---
8 |
9 | **Describe the bug**
10 | A clear and concise description of what the bug is.
11 |
12 | **To Reproduce**
13 | Steps to reproduce the behavior:
14 |
15 | 1. Go to '...'
16 | 2. Click on '....'
17 | 3. Scroll down to '....'
18 | 4. See error
19 |
20 | **Expected behavior**
21 | A clear and concise description of what you expected to happen.
22 |
23 | **Screenshots or Loom recording**
24 | If applicable, add screenshots to help explain your problem.
25 |
26 | **Browser (please complete the following information):**
27 |
28 | - OS: [e.g. macOS]
29 | - Browser [e.g. chrome, safari]
30 | - Version [e.g. 22]
31 |
32 | **Additional context**
33 | Add any other context about the problem here.
34 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_ng_pipe_js.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_ng_guard_js.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_ng_module_js.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_ng_routing_js.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_ng_service_js.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_qsharp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_ng_component_js.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_ng_directive_js.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_js_opened.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/components/ui/input.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 |
3 | import { cn } from "@/lib/utils"
4 |
5 | export interface InputProps
6 | extends React.InputHTMLAttributes {}
7 |
8 | const Input = React.forwardRef(
9 | ({ className, type, ...props }, ref) => {
10 | return (
11 |
20 | )
21 | }
22 | )
23 | Input.displayName = "Input"
24 |
25 | export { Input }
26 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_cpp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_ejs.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_gradle.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_ng_interceptor_js.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_git_opened.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_github.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_dependencies.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_fbx.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_qlikview.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_ini.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_kos.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_meteor.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_nginx.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/app/(app)/dashboard/page.tsx:
--------------------------------------------------------------------------------
1 | import Dashboard from "@/components/dashboard"
2 | import Navbar from "@/components/dashboard/navbar"
3 | import { apiClient } from "@/server/client"
4 | import { redirect } from "next/navigation"
5 |
6 | export default async function DashboardPage() {
7 | const [userRes, sharedRes] = await Promise.all([
8 | apiClient.user.$get({
9 | query: {},
10 | }),
11 | apiClient.project.share.$get(),
12 | ])
13 | if (!userRes.ok || !sharedRes.ok) {
14 | redirect("/")
15 | }
16 | const userData = (await userRes.json()).data
17 | const shared = (await sharedRes.json()).data
18 |
19 | return (
20 |
21 |
22 |
27 |
28 | )
29 | }
30 |
--------------------------------------------------------------------------------
/web/components/ui/progress.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as ProgressPrimitive from "@radix-ui/react-progress"
4 | import * as React from "react"
5 |
6 | import { cn } from "@/lib/utils"
7 |
8 | const Progress = React.forwardRef<
9 | React.ElementRef,
10 | React.ComponentPropsWithoutRef
11 | >(({ className, value, ...props }, ref) => (
12 |
20 |
24 |
25 | ))
26 | Progress.displayName = ProgressPrimitive.Root.displayName
27 |
28 | export { Progress }
29 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_config.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_outlook.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_saltstack.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_light_ini.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_light_rubocop.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_nodemon.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_stata.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_light_config.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_template.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_tfs.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/folder_type_gitlab_opened.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_textile.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/public/icons/file_type_elasticbeanstalk.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------