create-githat-app 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -4
- package/dist/cli.js +757 -132
- package/package.json +26 -8
- package/templates/base/README.md.hbs +94 -0
- package/templates/nextjs/app/(auth)/reset-password/page.tsx.hbs +98 -0
- package/templates/nextjs/app/page.tsx.hbs +55 -0
- package/templates/nextjs/proxy.ts.hbs +10 -0
- package/templates/react-vite/src/pages/Home.tsx.hbs +55 -0
- package/templates/nextjs/middleware.ts.hbs +0 -10
package/package.json
CHANGED
|
@@ -1,35 +1,53 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-githat-app",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "GitHat CLI — scaffold apps and manage the skills marketplace",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
|
-
"create-githat-app": "./bin/index.js"
|
|
7
|
+
"create-githat-app": "./bin/index.js",
|
|
8
|
+
"githat": "./bin/index.js"
|
|
8
9
|
},
|
|
9
|
-
"files": [
|
|
10
|
+
"files": [
|
|
11
|
+
"bin",
|
|
12
|
+
"dist",
|
|
13
|
+
"templates"
|
|
14
|
+
],
|
|
10
15
|
"scripts": {
|
|
11
16
|
"build": "tsup",
|
|
12
17
|
"dev": "tsup --watch",
|
|
13
18
|
"test": "node bin/index.js --help"
|
|
14
19
|
},
|
|
15
20
|
"dependencies": {
|
|
16
|
-
"@clack/prompts": "^0.
|
|
21
|
+
"@clack/prompts": "^1.0.1",
|
|
17
22
|
"chalk": "^5.4.1",
|
|
18
|
-
"commander": "^
|
|
23
|
+
"commander": "^14.0.3",
|
|
19
24
|
"figlet": "^1.8.0",
|
|
20
25
|
"fs-extra": "^11.2.0",
|
|
21
26
|
"gradient-string": "^3.0.0",
|
|
22
27
|
"handlebars": "^4.7.8",
|
|
23
|
-
"ora": "^
|
|
28
|
+
"ora": "^9.3.0",
|
|
29
|
+
"unzipper": "^0.12.3"
|
|
24
30
|
},
|
|
25
31
|
"devDependencies": {
|
|
26
32
|
"@types/figlet": "^1.7.0",
|
|
27
33
|
"@types/fs-extra": "^11.0.4",
|
|
28
34
|
"@types/gradient-string": "^1.1.6",
|
|
35
|
+
"@types/unzipper": "^0.10.10",
|
|
29
36
|
"tsup": "^8.4.0",
|
|
30
37
|
"typescript": "^5.9.0"
|
|
31
38
|
},
|
|
32
|
-
"keywords": [
|
|
39
|
+
"keywords": [
|
|
40
|
+
"githat",
|
|
41
|
+
"nextjs",
|
|
42
|
+
"react",
|
|
43
|
+
"vite",
|
|
44
|
+
"create-app",
|
|
45
|
+
"cli",
|
|
46
|
+
"auth",
|
|
47
|
+
"identity",
|
|
48
|
+
"mcp",
|
|
49
|
+
"ai-agents"
|
|
50
|
+
],
|
|
33
51
|
"license": "SEE LICENSE IN LICENSE",
|
|
34
52
|
"publishConfig": {
|
|
35
53
|
"access": "public",
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# {{projectName}}
|
|
2
|
+
|
|
3
|
+
Built with [GitHat](https://githat.io) — your backend is already set up. Auth, teams, orgs, API keys, MCP verification, and AI agent identity are handled by GitHat's hosted platform.
|
|
4
|
+
|
|
5
|
+
## Getting Started
|
|
6
|
+
|
|
7
|
+
1. Install dependencies:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
{{#ifEquals packageManager "yarn"}}yarn{{else}}{{packageManager}} install{{/ifEquals}}
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
2. Add your GitHat publishable key to `{{#ifEquals framework "nextjs"}}.env.local{{else}}.env{{/ifEquals}}`:
|
|
14
|
+
|
|
15
|
+
```env
|
|
16
|
+
{{#ifEquals framework "nextjs"}}NEXT_PUBLIC_GITHAT_PUBLISHABLE_KEY{{else}}VITE_GITHAT_PUBLISHABLE_KEY{{/ifEquals}}=pk_live_your_key_here
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Get your key at [githat.io/dashboard/apps](https://githat.io/dashboard/apps).
|
|
20
|
+
|
|
21
|
+
3. Start the dev server:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
{{#ifEquals packageManager "npm"}}npm run dev{{else}}{{packageManager}} dev{{/ifEquals}}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
4. Open [http://localhost:{{#ifEquals framework "nextjs"}}3000{{else}}5173{{/ifEquals}}](http://localhost:{{#ifEquals framework "nextjs"}}3000{{else}}5173{{/ifEquals}})
|
|
28
|
+
|
|
29
|
+
## Your Backend
|
|
30
|
+
|
|
31
|
+
All API calls go to `api.githat.io`. Your data is stored in GitHat's database. **No backend to deploy.**
|
|
32
|
+
|
|
33
|
+
GitHat handles:
|
|
34
|
+
|
|
35
|
+
- User auth (sign-up, sign-in, email verification, password reset)
|
|
36
|
+
- Organizations (create, switch, branding)
|
|
37
|
+
- Team management (invite members, assign roles)
|
|
38
|
+
- API key management (publishable + secret keys)
|
|
39
|
+
{{#if includeMcpModule}}- MCP server registration and domain verification
|
|
40
|
+
{{/if}}{{#if includeAgentModule}}- AI agent registration and wallet verification
|
|
41
|
+
{{/if}}- Email delivery (verification, invitations, password resets)
|
|
42
|
+
|
|
43
|
+
The `githat/` folder in your project is a typed API client that talks to `api.githat.io`. You write frontend code, GitHat handles the rest.
|
|
44
|
+
|
|
45
|
+
Manage everything at [githat.io/dashboard](https://githat.io/dashboard).
|
|
46
|
+
|
|
47
|
+
## Pages
|
|
48
|
+
|
|
49
|
+
- `/sign-in` — Sign in
|
|
50
|
+
- `/sign-up` — Create account
|
|
51
|
+
{{#if includeForgotPassword}}- `/forgot-password` — Password recovery
|
|
52
|
+
{{/if}}{{#if includeDashboard}}- `/dashboard` — Protected dashboard
|
|
53
|
+
{{/if}}{{#if includeOrgManagement}}- `/dashboard/members` — Invite members, manage roles
|
|
54
|
+
{{/if}}
|
|
55
|
+
|
|
56
|
+
## GitHat SDK
|
|
57
|
+
|
|
58
|
+
This project uses [`@githat/nextjs`](https://www.npmjs.com/package/@githat/nextjs) for connecting to the GitHat platform:
|
|
59
|
+
|
|
60
|
+
```{{#if typescript}}tsx{{else}}jsx{{/if}}
|
|
61
|
+
import { useAuth, UserButton, OrgSwitcher } from '@githat/nextjs';
|
|
62
|
+
|
|
63
|
+
const { user, org, signIn, signUp, signOut } = useAuth();
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Deploy
|
|
67
|
+
|
|
68
|
+
{{#ifEquals framework "nextjs"}}### Vercel (recommended)
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
npx vercel
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Add `NEXT_PUBLIC_GITHAT_PUBLISHABLE_KEY` to your Vercel project environment variables.
|
|
75
|
+
{{else}}### Vercel
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
npx vercel
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Netlify
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
npx netlify deploy
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Add `VITE_GITHAT_PUBLISHABLE_KEY` to your hosting provider's environment variables.
|
|
88
|
+
{{/ifEquals}}
|
|
89
|
+
|
|
90
|
+
## Learn More
|
|
91
|
+
|
|
92
|
+
- [GitHat Documentation](https://githat.io/docs)
|
|
93
|
+
- [SDK Reference](https://www.npmjs.com/package/@githat/nextjs)
|
|
94
|
+
- [API Reference (42+ endpoints)](https://githat.io/docs/api)
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
{{#if includeForgotPassword}}
|
|
2
|
+
'use client';
|
|
3
|
+
|
|
4
|
+
import { useState } from 'react';
|
|
5
|
+
import { useSearchParams, useRouter } from 'next/navigation';
|
|
6
|
+
{{#if includeGithatFolder}}
|
|
7
|
+
import { authApi } from '../../../githat/api/auth{{#unless typescript}}.js{{/unless}}';
|
|
8
|
+
{{/if}}
|
|
9
|
+
|
|
10
|
+
export default function ResetPasswordPage() {
|
|
11
|
+
const searchParams = useSearchParams();
|
|
12
|
+
const router = useRouter();
|
|
13
|
+
const token = searchParams.get('token');
|
|
14
|
+
|
|
15
|
+
const [password, setPassword] = useState('');
|
|
16
|
+
const [confirm, setConfirm] = useState('');
|
|
17
|
+
const [error, setError] = useState('');
|
|
18
|
+
const [loading, setLoading] = useState(false);
|
|
19
|
+
|
|
20
|
+
const handleSubmit = async (e{{#if typescript}}: React.FormEvent{{/if}}) => {
|
|
21
|
+
e.preventDefault();
|
|
22
|
+
if (password !== confirm) {
|
|
23
|
+
setError('Passwords do not match');
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
setError('');
|
|
27
|
+
setLoading(true);
|
|
28
|
+
try {
|
|
29
|
+
{{#if includeGithatFolder}}
|
|
30
|
+
await authApi.resetPassword(token!, password);
|
|
31
|
+
{{else}}
|
|
32
|
+
const res = await fetch('{{apiUrl}}/auth/reset-password', {
|
|
33
|
+
method: 'POST',
|
|
34
|
+
headers: { 'Content-Type': 'application/json' },
|
|
35
|
+
body: JSON.stringify({ token, password }),
|
|
36
|
+
});
|
|
37
|
+
if (!res.ok) throw new Error('Reset failed');
|
|
38
|
+
{{/if}}
|
|
39
|
+
router.push('/sign-in?reset=success');
|
|
40
|
+
} catch (err) {
|
|
41
|
+
setError('Failed to reset password. The link may have expired.');
|
|
42
|
+
} finally {
|
|
43
|
+
setLoading(false);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
if (!token) {
|
|
48
|
+
return (
|
|
49
|
+
<main {{#if useTailwind}}className="flex items-center justify-center min-h-screen bg-[#09090b]"{{else}}style=\{{ display: 'flex', alignItems: 'center', justifyContent: 'center', minHeight: '100vh', background: '#09090b' }}{{/if}}>
|
|
50
|
+
<div style=\{{ textAlign: 'center' }}>
|
|
51
|
+
<h1 style=\{{ fontSize: '1.5rem', fontWeight: 600, color: '#fafafa', marginBottom: '0.5rem' }}>Invalid reset link</h1>
|
|
52
|
+
<p style=\{{ color: '#a1a1aa' }}>
|
|
53
|
+
<a href="/forgot-password" style=\{{ color: '#7c3aed' }}>Request a new one</a>
|
|
54
|
+
</p>
|
|
55
|
+
</div>
|
|
56
|
+
</main>
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return (
|
|
61
|
+
<main {{#if useTailwind}}className="flex items-center justify-center min-h-screen bg-[#09090b]"{{else}}style=\{{ display: 'flex', alignItems: 'center', justifyContent: 'center', minHeight: '100vh', background: '#09090b' }}{{/if}}>
|
|
62
|
+
<div style=\{{ width: '100%', maxWidth: '24rem', padding: '2rem' }}>
|
|
63
|
+
<h1 style=\{{ fontSize: '1.5rem', fontWeight: 600, color: '#fafafa', marginBottom: '0.5rem' }}>Reset password</h1>
|
|
64
|
+
<p style=\{{ color: '#a1a1aa', marginBottom: '1.5rem' }}>Enter your new password below.</p>
|
|
65
|
+
{error && <p style=\{{ color: '#ef4444', marginBottom: '1rem', fontSize: '0.875rem' }}>{error}</p>}
|
|
66
|
+
<form onSubmit={handleSubmit}>
|
|
67
|
+
<input
|
|
68
|
+
type="password"
|
|
69
|
+
value={password}
|
|
70
|
+
onChange={(e) => setPassword(e.target.value)}
|
|
71
|
+
placeholder="New password"
|
|
72
|
+
required
|
|
73
|
+
minLength={8}
|
|
74
|
+
disabled={loading}
|
|
75
|
+
style=\{{ width: '100%', padding: '0.625rem 0.75rem', background: '#111113', border: '1px solid #1e1e2e', borderRadius: '0.375rem', color: '#fafafa', marginBottom: '1rem', outline: 'none' }}
|
|
76
|
+
/>
|
|
77
|
+
<input
|
|
78
|
+
type="password"
|
|
79
|
+
value={confirm}
|
|
80
|
+
onChange={(e) => setConfirm(e.target.value)}
|
|
81
|
+
placeholder="Confirm password"
|
|
82
|
+
required
|
|
83
|
+
disabled={loading}
|
|
84
|
+
style=\{{ width: '100%', padding: '0.625rem 0.75rem', background: '#111113', border: '1px solid #1e1e2e', borderRadius: '0.375rem', color: '#fafafa', marginBottom: '1rem', outline: 'none' }}
|
|
85
|
+
/>
|
|
86
|
+
<button
|
|
87
|
+
type="submit"
|
|
88
|
+
disabled={loading}
|
|
89
|
+
style=\{{ width: '100%', padding: '0.625rem', background: '#7c3aed', color: '#fff', border: 'none', borderRadius: '0.375rem', fontWeight: 600, cursor: loading ? 'not-allowed' : 'pointer', opacity: loading ? 0.7 : 1 }}
|
|
90
|
+
>
|
|
91
|
+
{loading ? 'Resetting...' : 'Reset password'}
|
|
92
|
+
</button>
|
|
93
|
+
</form>
|
|
94
|
+
</div>
|
|
95
|
+
</main>
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
{{/if}}
|
|
@@ -1,6 +1,61 @@
|
|
|
1
1
|
import { SignInButton, SignUpButton } from '@githat/nextjs';
|
|
2
2
|
|
|
3
|
+
const hasKey = !!process.env.NEXT_PUBLIC_GITHAT_PUBLISHABLE_KEY;
|
|
4
|
+
|
|
5
|
+
function SetupGuide() {
|
|
6
|
+
return (
|
|
7
|
+
<main {{#if useTailwind}}className="flex flex-col items-center justify-center min-h-screen gap-8 bg-[#09090b] text-[#fafafa] px-6"{{else}}style=\{{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', minHeight: '100vh', gap: '2rem', background: '#09090b', color: '#fafafa', padding: '0 1.5rem' }}{{/if}}>
|
|
8
|
+
<div {{#if useTailwind}}className="text-center"{{else}}style=\{{ textAlign: 'center' }}{{/if}}>
|
|
9
|
+
<h1 {{#if useTailwind}}className="text-4xl font-bold mb-2"{{else}}style=\{{ fontSize: '2.5rem', fontWeight: 700, marginBottom: '0.5rem' }}{{/if}}>
|
|
10
|
+
{{businessName}}
|
|
11
|
+
</h1>
|
|
12
|
+
<p {{#if useTailwind}}className="text-zinc-400"{{else}}style=\{{ color: '#a1a1aa' }}{{/if}}>
|
|
13
|
+
Get started in 3 steps
|
|
14
|
+
</p>
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
<div {{#if useTailwind}}className="flex flex-col gap-4 max-w-md w-full"{{else}}style=\{{ display: 'flex', flexDirection: 'column', gap: '1rem', maxWidth: '28rem', width: '100%' }}{{/if}}>
|
|
18
|
+
<div {{#if useTailwind}}className="flex gap-4 items-start p-4 rounded-lg border border-zinc-800 bg-zinc-900"{{else}}style=\{{ display: 'flex', gap: '1rem', alignItems: 'flex-start', padding: '1rem', borderRadius: '0.5rem', border: '1px solid #27272a', background: '#18181b' }}{{/if}}>
|
|
19
|
+
<span {{#if useTailwind}}className="text-xl font-bold text-violet-400 shrink-0"{{else}}style=\{{ fontSize: '1.25rem', fontWeight: 700, color: '#a78bfa', flexShrink: 0 }}{{/if}}>1</span>
|
|
20
|
+
<div>
|
|
21
|
+
<p {{#if useTailwind}}className="font-semibold"{{else}}style=\{{ fontWeight: 600 }}{{/if}}>Sign up at GitHat</p>
|
|
22
|
+
<a href="https://githat.io/sign-up" target="_blank" rel="noopener noreferrer" {{#if useTailwind}}className="text-violet-400 hover:underline text-sm"{{else}}style=\{{ color: '#a78bfa', fontSize: '0.875rem' }}{{/if}}>
|
|
23
|
+
githat.io/sign-up →
|
|
24
|
+
</a>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
<div {{#if useTailwind}}className="flex gap-4 items-start p-4 rounded-lg border border-zinc-800 bg-zinc-900"{{else}}style=\{{ display: 'flex', gap: '1rem', alignItems: 'flex-start', padding: '1rem', borderRadius: '0.5rem', border: '1px solid #27272a', background: '#18181b' }}{{/if}}>
|
|
29
|
+
<span {{#if useTailwind}}className="text-xl font-bold text-violet-400 shrink-0"{{else}}style=\{{ fontSize: '1.25rem', fontWeight: 700, color: '#a78bfa', flexShrink: 0 }}{{/if}}>2</span>
|
|
30
|
+
<div>
|
|
31
|
+
<p {{#if useTailwind}}className="font-semibold"{{else}}style=\{{ fontWeight: 600 }}{{/if}}>Copy your publishable key</p>
|
|
32
|
+
<a href="https://githat.io/dashboard/apps" target="_blank" rel="noopener noreferrer" {{#if useTailwind}}className="text-violet-400 hover:underline text-sm"{{else}}style=\{{ color: '#a78bfa', fontSize: '0.875rem' }}{{/if}}>
|
|
33
|
+
Dashboard → Apps →
|
|
34
|
+
</a>
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
<div {{#if useTailwind}}className="flex gap-4 items-start p-4 rounded-lg border border-zinc-800 bg-zinc-900"{{else}}style=\{{ display: 'flex', gap: '1rem', alignItems: 'flex-start', padding: '1rem', borderRadius: '0.5rem', border: '1px solid #27272a', background: '#18181b' }}{{/if}}>
|
|
39
|
+
<span {{#if useTailwind}}className="text-xl font-bold text-violet-400 shrink-0"{{else}}style=\{{ fontSize: '1.25rem', fontWeight: 700, color: '#a78bfa', flexShrink: 0 }}{{/if}}>3</span>
|
|
40
|
+
<div>
|
|
41
|
+
<p {{#if useTailwind}}className="font-semibold"{{else}}style=\{{ fontWeight: 600 }}{{/if}}>Add to .env.local and restart</p>
|
|
42
|
+
<code {{#if useTailwind}}className="text-xs text-zinc-400 bg-zinc-800 px-2 py-1 rounded mt-1 block"{{else}}style=\{{ fontSize: '0.75rem', color: '#a1a1aa', background: '#27272a', padding: '0.25rem 0.5rem', borderRadius: '0.25rem', marginTop: '0.25rem', display: 'block' }}{{/if}}>
|
|
43
|
+
NEXT_PUBLIC_GITHAT_PUBLISHABLE_KEY=pk_live_...
|
|
44
|
+
</code>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
|
|
49
|
+
<a href="https://githat.io/docs/quickstart" target="_blank" rel="noopener noreferrer" {{#if useTailwind}}className="text-sm text-zinc-500 hover:text-zinc-300"{{else}}style=\{{ fontSize: '0.875rem', color: '#71717a' }}{{/if}}>
|
|
50
|
+
Read the docs →
|
|
51
|
+
</a>
|
|
52
|
+
</main>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
3
56
|
export default function Home() {
|
|
57
|
+
if (!hasKey) return <SetupGuide />;
|
|
58
|
+
|
|
4
59
|
return (
|
|
5
60
|
<main {{#if useTailwind}}className="flex flex-col items-center justify-center min-h-screen gap-6 bg-[#09090b] text-[#fafafa]"{{else}}style=\{{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', minHeight: '100vh', gap: '1.5rem', background: '#09090b', color: '#fafafa' }}{{/if}}>
|
|
6
61
|
<h1 {{#if useTailwind}}className="text-4xl font-bold"{{else}}style=\{{ fontSize: '2.5rem', fontWeight: 700 }}{{/if}}>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { authProxy } from '@githat/nextjs/proxy';
|
|
2
|
+
|
|
3
|
+
export const proxy = authProxy({
|
|
4
|
+
publicRoutes: ['/', '/sign-in', '/sign-up'{{#if includeForgotPassword}}, '/forgot-password', '/reset-password'{{/if}}{{#if includeEmailVerification}}, '/verify-email'{{/if}}],
|
|
5
|
+
signInUrl: '/sign-in',
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
export const config = {
|
|
9
|
+
matcher: ['/((?!_next|api|.*\\..*).*)'],
|
|
10
|
+
};
|
|
@@ -1,6 +1,61 @@
|
|
|
1
1
|
import { SignInButton, SignUpButton } from '@githat/nextjs';
|
|
2
2
|
|
|
3
|
+
const hasKey = !!import.meta.env.VITE_GITHAT_PUBLISHABLE_KEY;
|
|
4
|
+
|
|
5
|
+
function SetupGuide() {
|
|
6
|
+
return (
|
|
7
|
+
<main {{#if useTailwind}}className="flex flex-col items-center justify-center min-h-screen gap-8 bg-[#09090b] text-[#fafafa] px-6"{{else}}style=\{{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', minHeight: '100vh', gap: '2rem', background: '#09090b', color: '#fafafa', padding: '0 1.5rem' }}{{/if}}>
|
|
8
|
+
<div {{#if useTailwind}}className="text-center"{{else}}style=\{{ textAlign: 'center' }}{{/if}}>
|
|
9
|
+
<h1 {{#if useTailwind}}className="text-4xl font-bold mb-2"{{else}}style=\{{ fontSize: '2.5rem', fontWeight: 700, marginBottom: '0.5rem' }}{{/if}}>
|
|
10
|
+
{{businessName}}
|
|
11
|
+
</h1>
|
|
12
|
+
<p {{#if useTailwind}}className="text-zinc-400"{{else}}style=\{{ color: '#a1a1aa' }}{{/if}}>
|
|
13
|
+
Get started in 3 steps
|
|
14
|
+
</p>
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
<div {{#if useTailwind}}className="flex flex-col gap-4 max-w-md w-full"{{else}}style=\{{ display: 'flex', flexDirection: 'column', gap: '1rem', maxWidth: '28rem', width: '100%' }}{{/if}}>
|
|
18
|
+
<div {{#if useTailwind}}className="flex gap-4 items-start p-4 rounded-lg border border-zinc-800 bg-zinc-900"{{else}}style=\{{ display: 'flex', gap: '1rem', alignItems: 'flex-start', padding: '1rem', borderRadius: '0.5rem', border: '1px solid #27272a', background: '#18181b' }}{{/if}}>
|
|
19
|
+
<span {{#if useTailwind}}className="text-xl font-bold text-violet-400 shrink-0"{{else}}style=\{{ fontSize: '1.25rem', fontWeight: 700, color: '#a78bfa', flexShrink: 0 }}{{/if}}>1</span>
|
|
20
|
+
<div>
|
|
21
|
+
<p {{#if useTailwind}}className="font-semibold"{{else}}style=\{{ fontWeight: 600 }}{{/if}}>Sign up at GitHat</p>
|
|
22
|
+
<a href="https://githat.io/sign-up" target="_blank" rel="noopener noreferrer" {{#if useTailwind}}className="text-violet-400 hover:underline text-sm"{{else}}style=\{{ color: '#a78bfa', fontSize: '0.875rem' }}{{/if}}>
|
|
23
|
+
githat.io/sign-up →
|
|
24
|
+
</a>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
<div {{#if useTailwind}}className="flex gap-4 items-start p-4 rounded-lg border border-zinc-800 bg-zinc-900"{{else}}style=\{{ display: 'flex', gap: '1rem', alignItems: 'flex-start', padding: '1rem', borderRadius: '0.5rem', border: '1px solid #27272a', background: '#18181b' }}{{/if}}>
|
|
29
|
+
<span {{#if useTailwind}}className="text-xl font-bold text-violet-400 shrink-0"{{else}}style=\{{ fontSize: '1.25rem', fontWeight: 700, color: '#a78bfa', flexShrink: 0 }}{{/if}}>2</span>
|
|
30
|
+
<div>
|
|
31
|
+
<p {{#if useTailwind}}className="font-semibold"{{else}}style=\{{ fontWeight: 600 }}{{/if}}>Copy your publishable key</p>
|
|
32
|
+
<a href="https://githat.io/dashboard/apps" target="_blank" rel="noopener noreferrer" {{#if useTailwind}}className="text-violet-400 hover:underline text-sm"{{else}}style=\{{ color: '#a78bfa', fontSize: '0.875rem' }}{{/if}}>
|
|
33
|
+
Dashboard → Apps →
|
|
34
|
+
</a>
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
<div {{#if useTailwind}}className="flex gap-4 items-start p-4 rounded-lg border border-zinc-800 bg-zinc-900"{{else}}style=\{{ display: 'flex', gap: '1rem', alignItems: 'flex-start', padding: '1rem', borderRadius: '0.5rem', border: '1px solid #27272a', background: '#18181b' }}{{/if}}>
|
|
39
|
+
<span {{#if useTailwind}}className="text-xl font-bold text-violet-400 shrink-0"{{else}}style=\{{ fontSize: '1.25rem', fontWeight: 700, color: '#a78bfa', flexShrink: 0 }}{{/if}}>3</span>
|
|
40
|
+
<div>
|
|
41
|
+
<p {{#if useTailwind}}className="font-semibold"{{else}}style=\{{ fontWeight: 600 }}{{/if}}>Add to .env and restart</p>
|
|
42
|
+
<code {{#if useTailwind}}className="text-xs text-zinc-400 bg-zinc-800 px-2 py-1 rounded mt-1 block"{{else}}style=\{{ fontSize: '0.75rem', color: '#a1a1aa', background: '#27272a', padding: '0.25rem 0.5rem', borderRadius: '0.25rem', marginTop: '0.25rem', display: 'block' }}{{/if}}>
|
|
43
|
+
VITE_GITHAT_PUBLISHABLE_KEY=pk_live_...
|
|
44
|
+
</code>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
|
|
49
|
+
<a href="https://githat.io/docs/quickstart" target="_blank" rel="noopener noreferrer" {{#if useTailwind}}className="text-sm text-zinc-500 hover:text-zinc-300"{{else}}style=\{{ fontSize: '0.875rem', color: '#71717a' }}{{/if}}>
|
|
50
|
+
Read the docs →
|
|
51
|
+
</a>
|
|
52
|
+
</main>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
3
56
|
export default function Home() {
|
|
57
|
+
if (!hasKey) return <SetupGuide />;
|
|
58
|
+
|
|
4
59
|
return (
|
|
5
60
|
<main {{#if useTailwind}}className="flex flex-col items-center justify-center min-h-screen gap-6 bg-[#09090b] text-[#fafafa]"{{else}}style=\{{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', minHeight: '100vh', gap: '1.5rem', background: '#09090b', color: '#fafafa' }}{{/if}}>
|
|
6
61
|
<h1 {{#if useTailwind}}className="text-4xl font-bold"{{else}}style=\{{ fontSize: '2.5rem', fontWeight: 700 }}{{/if}}>
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { authMiddleware } from '@githat/nextjs/middleware';
|
|
2
|
-
|
|
3
|
-
export default authMiddleware({
|
|
4
|
-
publicRoutes: ['/', '/sign-in', '/sign-up'{{#if includeForgotPassword}}, '/forgot-password'{{/if}}{{#if includeEmailVerification}}, '/verify-email'{{/if}}],
|
|
5
|
-
signInUrl: '/sign-in',
|
|
6
|
-
});
|
|
7
|
-
|
|
8
|
-
export const config = {
|
|
9
|
-
matcher: ['/((?!_next|api|.*\\..*).*)'],
|
|
10
|
-
};
|