├── .bolt
└── config.json
├── src
├── vite-env.d.ts
├── main.ts
├── assets
│ └── vue.svg
├── components
│ ├── HelloWorld.vue
│ ├── PresetSelect.vue
│ ├── PresetModal.vue
│ ├── ImportModal.vue
│ ├── CaddyConfig.vue
│ └── HostForm.vue
├── style.css
├── types
│ └── caddy.ts
├── App.vue
└── presets.ts
├── tsconfig.node.tsbuildinfo
├── postcss.config.js
├── tsconfig.json
├── vite.config.ts
├── docker-compose.yml
├── Dockerfile
├── tsconfig.app.tsbuildinfo
├── .gitignore
├── index.html
├── public
├── favicon.svg
└── vite.svg
├── tsconfig.node.json
├── nginx.conf
├── tsconfig.app.json
├── package.json
├── .github
└── workflows
│ └── docker-publish.yml
├── tailwind.config.js
└── README.md
/.bolt/config.json:
--------------------------------------------------------------------------------
1 | {
2 | "template": "vite-vue-ts"
3 | }
4 |
--------------------------------------------------------------------------------
/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
15 | Edit
16 | components/HelloWorld.vue to test HMR
17 |
21 | Check out 22 | create-vue, the official Vue + Vite starter 25 |
26 |27 | Learn more about IDE Support for Vue in the 28 | Vue Docs Scaling up Guide. 33 |
34 |Click on the Vite and Vue logos to learn more
35 | 36 | 37 | 42 | -------------------------------------------------------------------------------- /public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/style.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | :root { 6 | --background: 224 71% 4%; 7 | --foreground: 213 31% 91%; 8 | --muted: 223 47% 11%; 9 | --muted-foreground: 215.4 16.3% 56.9%; 10 | --accent: 216 34% 17%; 11 | --accent-foreground: 210 40% 98%; 12 | --popover: 224 71% 4%; 13 | --popover-foreground: 215 20.2% 65.1%; 14 | --border: 216 34% 17%; 15 | --input: 216 34% 17%; 16 | --card: 224 71% 4%; 17 | --card-foreground: 213 31% 91%; 18 | --primary: 263 70% 50%; 19 | --primary-foreground: 210 40% 98%; 20 | --secondary: 215 25% 27%; 21 | --secondary-foreground: 210 40% 98%; 22 | --destructive: 0 62% 45%; 23 | --destructive-foreground: 210 40% 98%; 24 | --ring: 216 34% 17%; 25 | --radius: 0.5rem; 26 | } 27 | 28 | @layer base { 29 | * { 30 | @apply border-border; 31 | } 32 | body { 33 | @apply bg-background text-foreground; 34 | } 35 | } 36 | 37 | /* Custom scrollbar styles */ 38 | .scrollbar-thin { 39 | scrollbar-width: thin; 40 | scrollbar-color: hsl(var(--primary)/0.3) transparent; 41 | } 42 | 43 | .scrollbar-thin::-webkit-scrollbar { 44 | height: 6px; 45 | width: 6px; 46 | } 47 | 48 | .scrollbar-thin::-webkit-scrollbar-track { 49 | background: transparent; 50 | } 51 | 52 | .scrollbar-thin::-webkit-scrollbar-thumb { 53 | background-color: hsl(var(--primary)/0.3); 54 | border-radius: 3px; 55 | } 56 | 57 | .scrollbar-thin::-webkit-scrollbar-thumb:hover { 58 | background-color: hsl(var(--primary)/0.5); 59 | } 60 | -------------------------------------------------------------------------------- /src/types/caddy.ts: -------------------------------------------------------------------------------- 1 | export interface CaddyHost { 2 | id: string; 3 | domain: string; 4 | fileServer?: { 5 | root: string; 6 | browse: boolean; 7 | php: boolean; 8 | frankenphp: boolean; 9 | hide: string[]; 10 | }; 11 | presetName?: string; 12 | reverseProxy?: string; 13 | tls?: { 14 | email?: string; 15 | selfSigned?: boolean; 16 | certFile?: string; 17 | keyFile?: string; 18 | }; 19 | encode?: boolean; 20 | basicAuth?: { 21 | username: string; 22 | password: string; 23 | }[]; 24 | headers?: { 25 | name: string; 26 | value: string; 27 | }[]; 28 | cors?: { 29 | enabled: boolean; 30 | allowOrigins: string[]; 31 | allowMethods: string[]; 32 | allowHeaders: string[]; 33 | }; 34 | security?: { 35 | ipFilter: { 36 | enabled: boolean; 37 | allow: string[]; 38 | block: string[]; 39 | }; 40 | rateLimit: { 41 | enabled: boolean; 42 | requests: number; 43 | window: string; 44 | }; 45 | cspEnabled: boolean; 46 | csp: string; 47 | forwardAuth: { 48 | enabled: boolean; 49 | url: string; 50 | verifyHeader?: string; 51 | verifyValue?: string; 52 | }; 53 | }; 54 | performance?: { 55 | brotli: boolean; 56 | cacheControlEnabled: boolean; 57 | cacheControl: string; 58 | }; 59 | } 60 | 61 | export interface PresetConfig { 62 | name: string; 63 | port: number; 64 | description: string; 65 | category: 'Media & Streaming' | 'Downloaders & File Sharing' | 'Media Management & Automation' | 66 | 'Home Automation & IoT' | 'Development & Code Hosting' | 'Monitoring & Analytics' | 67 | 'Productivity & Collaboration' | 'Authentication & Identity' | 'Security & Networking' | 68 | 'Container & Server Management' | 'Password & Secrets Management' | 'Messaging & Communication'; 69 | webLink?: string; 70 | githubLink?: string; 71 | logo?: string; 72 | } 73 | -------------------------------------------------------------------------------- /src/components/PresetSelect.vue: -------------------------------------------------------------------------------- 1 | 39 | 40 | 41 |{{ caddyConfig }}
258 | No hosts configured yet. Add your first host to get started!
122 |