create-varity-app 2.0.0-beta.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/LICENSE +21 -0
- package/README.md +85 -0
- package/dist/create.js +141 -0
- package/dist/index.js +45 -0
- package/dist/utils.js +29 -0
- package/package.json +61 -0
- package/template/.env.example +17 -0
- package/template/KNOWN_ISSUES.md +69 -0
- package/template/LICENSE +21 -0
- package/template/README.md +241 -0
- package/template/gitignore +42 -0
- package/template/next-env.d.ts +6 -0
- package/template/next.config.js +21 -0
- package/template/package.json +39 -0
- package/template/postcss.config.js +6 -0
- package/template/public/logo.svg +4 -0
- package/template/public/robots.txt +4 -0
- package/template/public/sitemap.xml +4 -0
- package/template/src/app/dashboard/layout.tsx +298 -0
- package/template/src/app/dashboard/page.tsx +209 -0
- package/template/src/app/dashboard/projects/page.tsx +638 -0
- package/template/src/app/dashboard/settings/page.tsx +749 -0
- package/template/src/app/dashboard/tasks/page.tsx +301 -0
- package/template/src/app/dashboard/team/page.tsx +295 -0
- package/template/src/app/globals.css +177 -0
- package/template/src/app/icon.svg +4 -0
- package/template/src/app/layout.tsx +33 -0
- package/template/src/app/login/page.tsx +98 -0
- package/template/src/app/not-found.tsx +20 -0
- package/template/src/app/page.tsx +23 -0
- package/template/src/components/dashboard/DashboardStats.tsx +137 -0
- package/template/src/components/dashboard/RecentActivity.tsx +63 -0
- package/template/src/components/landing/CTA.tsx +42 -0
- package/template/src/components/landing/Features.tsx +116 -0
- package/template/src/components/landing/Hero.tsx +146 -0
- package/template/src/components/landing/HowItWorks.tsx +80 -0
- package/template/src/components/landing/Pricing.tsx +124 -0
- package/template/src/components/landing/Testimonials.tsx +78 -0
- package/template/src/components/providers.tsx +11 -0
- package/template/src/components/shared/Footer.tsx +71 -0
- package/template/src/components/shared/Navbar.tsx +87 -0
- package/template/src/lib/constants.ts +35 -0
- package/template/src/lib/database.ts +7 -0
- package/template/src/lib/hooks.ts +331 -0
- package/template/src/lib/utils.ts +68 -0
- package/template/src/lib/varity.ts +1 -0
- package/template/src/services/dashboardService.ts +589 -0
- package/template/src/types/index.ts +52 -0
- package/template/tailwind.config.js +27 -0
- package/template/tsconfig.json +23 -0
- package/template/varity.config.json +14 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Varity Labs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# create-varity-app
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/create-varity-app)
|
|
4
|
+
[](https://github.com/varity-labs/varity-sdk/blob/main/LICENSE)
|
|
5
|
+
|
|
6
|
+
Create production-ready apps with auth, database, and payments built in.
|
|
7
|
+
|
|
8
|
+
## Quick Start
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npx create-varity-app my-app
|
|
12
|
+
cd my-app
|
|
13
|
+
npm run dev
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Or with other package managers:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
pnpm create varity-app my-app
|
|
20
|
+
yarn create varity-app my-app
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## What You Get
|
|
24
|
+
|
|
25
|
+
- **Next.js 15** app with TypeScript and Tailwind CSS
|
|
26
|
+
- **Authentication** — email, social login, and more (zero config)
|
|
27
|
+
- **Database** — ready-to-use collections with typed queries
|
|
28
|
+
- **Dashboard** — professional layout with sidebar navigation
|
|
29
|
+
- **Landing page** — hero, features, pricing, testimonials
|
|
30
|
+
- **Settings** — profile, preferences, security, billing sections
|
|
31
|
+
- **6 pages** — dashboard, projects, tasks, team, settings, login
|
|
32
|
+
|
|
33
|
+
## Project Structure
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
my-app/
|
|
37
|
+
├── src/
|
|
38
|
+
│ └── app/
|
|
39
|
+
│ ├── (auth)/login/ # Login page
|
|
40
|
+
│ ├── (dashboard)/ # Protected dashboard pages
|
|
41
|
+
│ │ ├── dashboard/ # Overview with KPIs
|
|
42
|
+
│ │ ├── projects/ # Project management
|
|
43
|
+
│ │ ├── tasks/ # Task tracking
|
|
44
|
+
│ │ ├── team/ # Team members
|
|
45
|
+
│ │ └── settings/ # App settings (6 sections)
|
|
46
|
+
│ └── page.tsx # Landing page
|
|
47
|
+
├── tailwind.config.ts
|
|
48
|
+
├── next.config.js
|
|
49
|
+
└── package.json
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Deploy
|
|
53
|
+
|
|
54
|
+
When you're ready to go live:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
pip install varitykit
|
|
58
|
+
varitykit app deploy
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Your app will be live in under 60 seconds.
|
|
62
|
+
|
|
63
|
+
Or deploy from your AI editor with the [Varity MCP server](../../cli/varity-mcp/) (`@varity-labs/mcp`) — just ask "deploy this project".
|
|
64
|
+
|
|
65
|
+
## Related Packages
|
|
66
|
+
|
|
67
|
+
- **[@varity-labs/sdk](../../core/varity-sdk/)** — Core SDK (database, credentials)
|
|
68
|
+
- **[@varity-labs/ui-kit](../../ui/varity-ui-kit/)** — React UI components
|
|
69
|
+
- **[@varity-labs/mcp](../../cli/varity-mcp/)** — MCP server for AI editors (Cursor, Claude Code, VS Code)
|
|
70
|
+
|
|
71
|
+
## Learn More
|
|
72
|
+
|
|
73
|
+
- [Documentation](https://docs.varity.so)
|
|
74
|
+
- [GitHub](https://github.com/varity-labs/varity-sdk)
|
|
75
|
+
- [Discord](https://discord.gg/varity)
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
**Part of the [Varity SDK](https://github.com/varity-labs/varity-sdk)** — Build, deploy, and monetize apps 70% cheaper than AWS.
|
|
80
|
+
|
|
81
|
+
[Documentation](https://docs.varity.so) · [GitHub](https://github.com/varity-labs/varity-sdk) · [Discord](https://discord.gg/varity)
|
|
82
|
+
|
|
83
|
+
## License
|
|
84
|
+
|
|
85
|
+
MIT — [Varity Labs](https://varity.so)
|
package/dist/create.js
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import fs from "fs-extra";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
4
|
+
import { execSync } from "child_process";
|
|
5
|
+
import chalk from "chalk";
|
|
6
|
+
import ora from "ora";
|
|
7
|
+
import { getInstallCommand } from "./utils.js";
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = path.dirname(__filename);
|
|
10
|
+
const VARITY_PACKAGE_VERSION = "^2.0.0-alpha.1";
|
|
11
|
+
const WORKSPACE_DEPS = {
|
|
12
|
+
"@varity-labs/sdk": VARITY_PACKAGE_VERSION,
|
|
13
|
+
"@varity-labs/types": VARITY_PACKAGE_VERSION,
|
|
14
|
+
"@varity-labs/ui-kit": VARITY_PACKAGE_VERSION,
|
|
15
|
+
};
|
|
16
|
+
const EXCLUDED_FILES = new Set([
|
|
17
|
+
".env.local",
|
|
18
|
+
".env.development.local",
|
|
19
|
+
".env.production.local",
|
|
20
|
+
]);
|
|
21
|
+
function getTemplateDir() {
|
|
22
|
+
return path.resolve(__dirname, "..", "template");
|
|
23
|
+
}
|
|
24
|
+
function rewritePackageJson(content, projectName) {
|
|
25
|
+
const pkg = { ...content };
|
|
26
|
+
pkg.name = projectName;
|
|
27
|
+
pkg.version = "0.1.0";
|
|
28
|
+
// Convert workspace:^ deps to real versions
|
|
29
|
+
for (const depKey of ["dependencies", "devDependencies"]) {
|
|
30
|
+
const deps = pkg[depKey];
|
|
31
|
+
if (!deps)
|
|
32
|
+
continue;
|
|
33
|
+
for (const [name, version] of Object.entries(deps)) {
|
|
34
|
+
if (typeof version === "string" &&
|
|
35
|
+
version.startsWith("workspace:")) {
|
|
36
|
+
deps[name] = WORKSPACE_DEPS[name] || VARITY_PACKAGE_VERSION;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// Remove monorepo-specific scripts
|
|
41
|
+
const scripts = pkg.scripts;
|
|
42
|
+
if (scripts) {
|
|
43
|
+
delete scripts.prepare; // husky install — not needed outside monorepo
|
|
44
|
+
}
|
|
45
|
+
return pkg;
|
|
46
|
+
}
|
|
47
|
+
export async function createApp(projectName, packageManager) {
|
|
48
|
+
const targetDir = path.resolve(process.cwd(), projectName);
|
|
49
|
+
const templateDir = getTemplateDir();
|
|
50
|
+
// Check template exists
|
|
51
|
+
if (!fs.existsSync(templateDir)) {
|
|
52
|
+
console.error(chalk.red("Error: Template not found. This is a bug — please report it at https://github.com/varity-labs/varity-sdk/issues"));
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
// Check target doesn't already exist
|
|
56
|
+
if (fs.existsSync(targetDir)) {
|
|
57
|
+
console.error(chalk.red(`Error: Directory ${chalk.bold(projectName)} already exists.`));
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
console.log();
|
|
61
|
+
console.log(` Creating ${chalk.bold(projectName)}...`);
|
|
62
|
+
console.log();
|
|
63
|
+
// Copy template
|
|
64
|
+
const copySpinner = ora(" Copying template").start();
|
|
65
|
+
try {
|
|
66
|
+
await fs.copy(templateDir, targetDir, {
|
|
67
|
+
filter: (src) => {
|
|
68
|
+
const basename = path.basename(src);
|
|
69
|
+
if (EXCLUDED_FILES.has(basename))
|
|
70
|
+
return false;
|
|
71
|
+
if (basename === "node_modules")
|
|
72
|
+
return false;
|
|
73
|
+
if (basename === ".next")
|
|
74
|
+
return false;
|
|
75
|
+
return true;
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
// Rename gitignore → .gitignore (npm strips .gitignore from tarballs)
|
|
79
|
+
const gitignoreSrc = path.join(targetDir, "gitignore");
|
|
80
|
+
const gitignoreDst = path.join(targetDir, ".gitignore");
|
|
81
|
+
if (fs.existsSync(gitignoreSrc) && !fs.existsSync(gitignoreDst)) {
|
|
82
|
+
await fs.rename(gitignoreSrc, gitignoreDst);
|
|
83
|
+
}
|
|
84
|
+
// Rewrite package.json
|
|
85
|
+
const pkgPath = path.join(targetDir, "package.json");
|
|
86
|
+
if (fs.existsSync(pkgPath)) {
|
|
87
|
+
const pkgContent = await fs.readJson(pkgPath);
|
|
88
|
+
const rewritten = rewritePackageJson(pkgContent, projectName);
|
|
89
|
+
await fs.writeJson(pkgPath, rewritten, { spaces: 2 });
|
|
90
|
+
}
|
|
91
|
+
copySpinner.succeed(" Template copied");
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
copySpinner.fail(" Failed to copy template");
|
|
95
|
+
throw err;
|
|
96
|
+
}
|
|
97
|
+
// Install dependencies
|
|
98
|
+
const installCmd = getInstallCommand(packageManager);
|
|
99
|
+
const installSpinner = ora(` Installing dependencies (${packageManager})`).start();
|
|
100
|
+
try {
|
|
101
|
+
execSync(installCmd, {
|
|
102
|
+
cwd: targetDir,
|
|
103
|
+
stdio: "pipe",
|
|
104
|
+
env: { ...process.env, ADBLOCK: "1", DISABLE_OPENCOLLECTIVE: "1" },
|
|
105
|
+
});
|
|
106
|
+
installSpinner.succeed(" Dependencies installed");
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
installSpinner.warn(` Could not install dependencies. Run ${chalk.cyan(`cd ${projectName} && ${installCmd}`)} manually.`);
|
|
110
|
+
}
|
|
111
|
+
// Init git
|
|
112
|
+
try {
|
|
113
|
+
execSync("git init", { cwd: targetDir, stdio: "pipe" });
|
|
114
|
+
execSync("git add -A", { cwd: targetDir, stdio: "pipe" });
|
|
115
|
+
execSync('git commit -m "Initial commit from create-varity-app"', {
|
|
116
|
+
cwd: targetDir,
|
|
117
|
+
stdio: "pipe",
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// git not available or init failed — not critical
|
|
122
|
+
}
|
|
123
|
+
// Success output
|
|
124
|
+
console.log();
|
|
125
|
+
console.log(chalk.green(" Success!") + ` Created ${chalk.bold(projectName)}`);
|
|
126
|
+
console.log();
|
|
127
|
+
console.log(" Next steps:");
|
|
128
|
+
console.log();
|
|
129
|
+
console.log(chalk.cyan(` cd ${projectName}`));
|
|
130
|
+
console.log(chalk.cyan(` ${packageManager === "npm" ? "npm run" : packageManager} dev`) + " Start development server");
|
|
131
|
+
console.log(chalk.cyan(` ${packageManager === "npm" ? "npm run" : packageManager} build`) + " Build for production");
|
|
132
|
+
console.log();
|
|
133
|
+
console.log(" Deploy when ready:");
|
|
134
|
+
console.log();
|
|
135
|
+
console.log(chalk.cyan(" pip install varitykit"));
|
|
136
|
+
console.log(chalk.cyan(" varitykit app deploy"));
|
|
137
|
+
console.log();
|
|
138
|
+
console.log(` Docs: ${chalk.underline("https://docs.varity.so")}`);
|
|
139
|
+
console.log(` Help: ${chalk.underline("https://discord.gg/varity")}`);
|
|
140
|
+
console.log();
|
|
141
|
+
}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import prompts from "prompts";
|
|
5
|
+
import { createApp } from "./create.js";
|
|
6
|
+
import { validateProjectName, detectPackageManager } from "./utils.js";
|
|
7
|
+
import fs from "fs";
|
|
8
|
+
const packageJson = JSON.parse(fs.readFileSync(new URL("../package.json", import.meta.url), "utf-8"));
|
|
9
|
+
const program = new Command();
|
|
10
|
+
program
|
|
11
|
+
.name("create-varity-app")
|
|
12
|
+
.description("Create a production-ready app with auth, database, and payments built in")
|
|
13
|
+
.version(packageJson.version)
|
|
14
|
+
.argument("[app-name]", "Name of the app to create")
|
|
15
|
+
.action(async (appName) => {
|
|
16
|
+
console.log();
|
|
17
|
+
console.log(chalk.bold(" create-varity-app"));
|
|
18
|
+
console.log();
|
|
19
|
+
let projectName = appName;
|
|
20
|
+
// Prompt for name if not provided
|
|
21
|
+
if (!projectName) {
|
|
22
|
+
const response = await prompts({
|
|
23
|
+
type: "text",
|
|
24
|
+
name: "name",
|
|
25
|
+
message: "What is your app named?",
|
|
26
|
+
initial: "my-app",
|
|
27
|
+
validate: (value) => {
|
|
28
|
+
const result = validateProjectName(value);
|
|
29
|
+
return result.valid ? true : result.error || "Invalid name";
|
|
30
|
+
},
|
|
31
|
+
}, { onCancel: () => process.exit(0) });
|
|
32
|
+
projectName = response.name;
|
|
33
|
+
if (!projectName)
|
|
34
|
+
process.exit(0);
|
|
35
|
+
}
|
|
36
|
+
// Validate the name
|
|
37
|
+
const validation = validateProjectName(projectName);
|
|
38
|
+
if (!validation.valid) {
|
|
39
|
+
console.error(chalk.red(` Invalid project name: ${validation.error}`));
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
const packageManager = detectPackageManager();
|
|
43
|
+
await createApp(projectName, packageManager);
|
|
44
|
+
});
|
|
45
|
+
program.parse();
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import validatePkgName from "validate-npm-package-name";
|
|
2
|
+
export function validateProjectName(name) {
|
|
3
|
+
const validation = validatePkgName(name);
|
|
4
|
+
if (!validation.validForNewPackages) {
|
|
5
|
+
const errors = [
|
|
6
|
+
...(validation.errors || []),
|
|
7
|
+
...(validation.warnings || []),
|
|
8
|
+
];
|
|
9
|
+
return { valid: false, error: errors.join(", ") };
|
|
10
|
+
}
|
|
11
|
+
if (name.length === 0) {
|
|
12
|
+
return { valid: false, error: "Project name cannot be empty" };
|
|
13
|
+
}
|
|
14
|
+
if (name.startsWith(".") || name.startsWith("_")) {
|
|
15
|
+
return { valid: false, error: "Project name cannot start with . or _" };
|
|
16
|
+
}
|
|
17
|
+
return { valid: true };
|
|
18
|
+
}
|
|
19
|
+
export function detectPackageManager() {
|
|
20
|
+
const agent = process.env.npm_config_user_agent || "";
|
|
21
|
+
if (agent.startsWith("pnpm"))
|
|
22
|
+
return "pnpm";
|
|
23
|
+
if (agent.startsWith("yarn"))
|
|
24
|
+
return "yarn";
|
|
25
|
+
return "npm";
|
|
26
|
+
}
|
|
27
|
+
export function getInstallCommand(pm) {
|
|
28
|
+
return pm === "yarn" ? "yarn" : `${pm} install`;
|
|
29
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "create-varity-app",
|
|
3
|
+
"version": "2.0.0-beta.1",
|
|
4
|
+
"description": "Create production-ready apps with auth, database, and payments built in",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/varity-labs/varity-sdk.git",
|
|
9
|
+
"directory": "packages/cli/create-varity-app"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://docs.varity.so",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/varity-labs/varity-sdk/issues"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"varity",
|
|
17
|
+
"create-app",
|
|
18
|
+
"saas",
|
|
19
|
+
"dashboard",
|
|
20
|
+
"nextjs",
|
|
21
|
+
"starter",
|
|
22
|
+
"template",
|
|
23
|
+
"react",
|
|
24
|
+
"deploy",
|
|
25
|
+
"auth",
|
|
26
|
+
"database",
|
|
27
|
+
"payments",
|
|
28
|
+
"developer-tools",
|
|
29
|
+
"fullstack"
|
|
30
|
+
],
|
|
31
|
+
"bin": {
|
|
32
|
+
"create-varity-app": "./dist/index.js"
|
|
33
|
+
},
|
|
34
|
+
"files": [
|
|
35
|
+
"dist",
|
|
36
|
+
"template",
|
|
37
|
+
"README.md",
|
|
38
|
+
"LICENSE"
|
|
39
|
+
],
|
|
40
|
+
"type": "module",
|
|
41
|
+
"scripts": {
|
|
42
|
+
"prebuild": "node scripts/copy-template.mjs",
|
|
43
|
+
"build": "tsc",
|
|
44
|
+
"clean": "rm -rf dist template"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"chalk": "^5.3.0",
|
|
48
|
+
"commander": "^12.1.0",
|
|
49
|
+
"fs-extra": "^11.2.0",
|
|
50
|
+
"ora": "^8.1.0",
|
|
51
|
+
"prompts": "^2.4.2",
|
|
52
|
+
"validate-npm-package-name": "^5.0.1"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@types/fs-extra": "^11.0.4",
|
|
56
|
+
"@types/node": "^20.0.0",
|
|
57
|
+
"@types/prompts": "^2.4.9",
|
|
58
|
+
"@types/validate-npm-package-name": "^4.0.2",
|
|
59
|
+
"typescript": "^5.5.0"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Varity App Configuration
|
|
2
|
+
#
|
|
3
|
+
# ZERO CONFIG: Leave everything blank! Auth and database work immediately
|
|
4
|
+
# using shared development credentials. No setup required.
|
|
5
|
+
#
|
|
6
|
+
# For production: `varitykit app deploy` injects all credentials automatically.
|
|
7
|
+
# You never need to manually set these values.
|
|
8
|
+
|
|
9
|
+
# Auth (optional — dev credentials used automatically when blank)
|
|
10
|
+
NEXT_PUBLIC_PRIVY_APP_ID=
|
|
11
|
+
NEXT_PUBLIC_THIRDWEB_CLIENT_ID=
|
|
12
|
+
|
|
13
|
+
# Database (optional — dev database used automatically when blank)
|
|
14
|
+
NEXT_PUBLIC_VARITY_APP_TOKEN=
|
|
15
|
+
|
|
16
|
+
# App ID (generated by `varitykit app deploy`)
|
|
17
|
+
NEXT_PUBLIC_VARITY_APP_ID=
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Known Issues — SaaS Starter Template
|
|
2
|
+
|
|
3
|
+
> **Last Updated:** February 14, 2026
|
|
4
|
+
> **Template:** `saas-starter` (TaskFlow)
|
|
5
|
+
> **Status:** All features functional, builds with 0 errors (8 routes + _not-found)
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## What Works
|
|
10
|
+
|
|
11
|
+
| Feature | Status | Notes |
|
|
12
|
+
|---------|--------|-------|
|
|
13
|
+
| Landing Page | Working | 6 sections, scroll animations, social proof, testimonials, dashboard mockup |
|
|
14
|
+
| Login | Working | Privy email/Google auth, zero-config with dev credentials, auto-redirect |
|
|
15
|
+
| Dashboard | Working | KPI cards, getting started checklist, recent activity feed |
|
|
16
|
+
| Projects CRUD | Working | Master-detail, nested tasks, CSV export, validation, optimistic updates |
|
|
17
|
+
| Tasks CRUD | Working | Status cycling (click to advance), filtering, CSV export, cross-references projects |
|
|
18
|
+
| Team CRUD | Working | Invite members, role management, email validation, role badges |
|
|
19
|
+
| Settings | Working | 4 tabs (General, Security, Billing, Account), backend persistence via DB Proxy, skeleton loading |
|
|
20
|
+
| Command Palette | Working | Cmd+K / Ctrl+K, searches pages and actions |
|
|
21
|
+
| Toast Notifications | Working | Success/error/info with progress bar, exit animation, max 3 stack |
|
|
22
|
+
| Protected Routes | Working | Automatic redirect for unauthenticated users |
|
|
23
|
+
| Color Themes | Working | 4 built-in presets (Blue, Purple, Green, Orange) via CSS variables |
|
|
24
|
+
| Static Export | Working | `output: 'export'` for IPFS deployment |
|
|
25
|
+
| Mobile Nav | Working | Hamburger menu with responsive sidebar |
|
|
26
|
+
| CSV Export | Working | One-click export for tasks and projects |
|
|
27
|
+
| SEO | Working | OpenGraph, Twitter cards, robots.txt, sitemap template |
|
|
28
|
+
|
|
29
|
+
## Known Issues
|
|
30
|
+
|
|
31
|
+
### 1. Navigation Flash (UI-Kit Limitation)
|
|
32
|
+
Brief "Initializing Dashboard" screen when navigating between dashboard pages. Caused by `PrivyReadyGate` in UI-Kit re-checking auth state on each route change. Resolves in <1 second. This is a UI-Kit issue, not template-side.
|
|
33
|
+
|
|
34
|
+
### 2. DashboardLayout Mobile Support
|
|
35
|
+
The `DashboardLayout` from `@varity-labs/ui-kit` does not include mobile navigation. The template provides its own responsive sidebar in `src/app/dashboard/layout.tsx` as a workaround. UI-Kit mobile improvements are planned post-MVP.
|
|
36
|
+
|
|
37
|
+
### 3. Billing Section is Mock
|
|
38
|
+
The Settings > Billing tab shows a mock UI (plan name, usage bars, payment method). Developers should wire their own billing provider (Stripe, etc.).
|
|
39
|
+
|
|
40
|
+
### 4. Sessions Are Mock
|
|
41
|
+
The Settings > Security tab shows active sessions with a "Revoke" button. Session data is client-side mock — real session management is handled by Privy (the auth provider).
|
|
42
|
+
|
|
43
|
+
### 5. Password & Profile Managed by Auth Provider
|
|
44
|
+
"Change password" and profile photo are managed by Privy (the auth provider). The Settings page shows informational dialogs explaining this.
|
|
45
|
+
|
|
46
|
+
### 6. No Server-Side Rendering
|
|
47
|
+
All pages are statically exported (`output: 'export'`). No server-side rendering, API routes, or middleware. Data fetching happens client-side via the SDK.
|
|
48
|
+
|
|
49
|
+
### 7. Team Email Invites
|
|
50
|
+
No SMTP integration — team members are added to the database only. No invitation email is sent. Developers should integrate their own email service.
|
|
51
|
+
|
|
52
|
+
## Environment
|
|
53
|
+
|
|
54
|
+
### Development (Zero Config)
|
|
55
|
+
```bash
|
|
56
|
+
npm install
|
|
57
|
+
npm run dev
|
|
58
|
+
```
|
|
59
|
+
No `.env` file, API keys, or accounts needed. Shared development credentials are built in.
|
|
60
|
+
|
|
61
|
+
### Production
|
|
62
|
+
```bash
|
|
63
|
+
varitykit app deploy
|
|
64
|
+
```
|
|
65
|
+
The CLI provisions a private database, injects production credentials, and deploys automatically.
|
|
66
|
+
|
|
67
|
+
## Reporting Issues
|
|
68
|
+
|
|
69
|
+
Please report issues at: https://github.com/varity-labs/varity-sdk/issues
|
package/template/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Varity Labs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|