bkend-cookbook
Skill69 starsChanged 8 months agoApache-2.0View on GitHub
bkend.ai cookbook with step-by-step tutorials and example projects. Build a todo app, blog, e-commerce store, and more with bkend.ai BaaS. Triggers: bkend cookbook, bkend tutorial, bkend example, todo app, blog app, bkend 쿡북, bkend 튜토리얼, 예제 프로젝트, bkendクックブック, チュートリアル, bkend教程, 示例项目, tutorial bkend, tutoriel bkend, bkend-Tutorial, ricettario Do NOT use for: initial setup (use $bkend-quickstart), specific features (use $bkend-data/auth/storage).
- Installs packages
We split this skill into the rules it gives an agent
1 rule. About 0 are common, 0 are distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈0
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 201
Create auth store (stores/auth-store.ts)
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
bkend.ai Cookbook
Step-by-step tutorials and ready-to-use project templates.
Actions
| Action | Description | Example |
list | List all recipes | $bkend-cookbook list |
todo | Build a todo app | $bkend-cookbook todo |
blog | Build a blog | $bkend-cookbook blog |
Available Recipes
| Recipe | Difficulty | Features Used |
| Todo App | Beginner | Data CRUD |
| Blog | Beginner | Data + Auth |
| User Dashboard | Intermediate | Auth + Data + Storage |
| E-commerce | Intermediate | All features |
| SaaS MVP | Advanced | All + RBAC |
Recipe 1: Todo App (15 minutes)
Schema
Table: todos
- title (string, required)
- completed (boolean, default: false)
- user_id (reference to users)
- created_at (datetime, auto)Frontend
// hooks/useTodos.ts
export function useTodos() {
return useQuery({
queryKey: ['todos'],
queryFn: () => bkend.data.list('todos', { sort: '-created_at' }),
});
}
export function useCreateTodo() {
const qc = useQueryClient();
return useMutation({
mutationFn: (title: string) => bkend.data.create('todos', { title, completed: false }),
onSuccess: () => qc.invalidateQueries({ queryKey: ['todos'] }),
});
}
export function useToggleTodo() {
const qc = useQueryClient();
return useMutation({
mutationFn: ({ id, completed }: { id: string; completed: boolean }) =>
bkend.data.update('todos', id, { completed: !completed }),
onSuccess: () => qc.invalidateQueries({ queryKey: ['todos'] }),
});
}
export function useDeleteTodo() {
const qc = useQueryClient();
return useMutation({
mutationFn: (id: string) => bkend.data.delete('todos', id),
onSuccess: () => qc.invalidateQueries({ queryKey: ['todos'] }),
});
}// components/TodoList.tsx
'use client';
import { useTodos, useCreateTodo, useToggleTodo, useDeleteTodo } from '@/hooks/useTodos';
import { useState } from 'react';
export function TodoList() {
const [newTitle, setNewTitle] = useState('');
const { data: todos, isLoading } = useTodos();
const createTodo = useCreateTodo();
const toggleTodo = useToggleTodo();
const deleteTodo = useDeleteTodo();
const handleAdd = (e: React.FormEvent) => {
e.preventDefault();
if (!newTitle.trim()) return;
createTodo.mutate(newTitle);
setNewTitle('');
};
if (isLoading) return <p>Loading...</p>;
return (
<div className="max-w-md mx-auto p-4">
<h1 className="text-2xl font-bold mb-4">Todo App</h1>
<form onSubmit={handleAdd} className="flex gap-2 mb-4">
<input value={newTitle} onChange={(e) => setNewTitle(e.target.value)}
placeholder="Add a todo..." className="flex-1 border rounded px-3 py-2" />
<button type="submit" className="bg-blue-500 text-white px-4 py-2 rounded">Add</button>
</form>
<ul className="space-y-2">
{todos?.map((todo: any) => (
<li key={todo.id} className="flex items-center gap-2 p-2 border rounded">
<input type="checkbox" checked={todo.completed}
onChange={() => toggleTodo.mutate({ id: todo.id, completed: todo.completed })} />
<span className={todo.completed ? 'line-through text-gray-400 flex-1' : 'flex-1'}>
{todo.title}
</span>
<button onClick={() => deleteTodo.mutate(todo.id)}
className="text-red-500 text-sm">Delete</button>
</li>
))}
</ul>
</div>
);
}Recipe 2: Blog with Authentication
Schema
Table: users (built-in via bkend auth)
Table: posts
- title (string, required)
- slug (string, unique)
- body (text, required)
- status (enum: draft/published, default: draft)
- author_id (reference to users)
- created_at (datetime, auto)
- updated_at (datetime, auto)
Table: comments
- body (text, required)
- post_id (reference to posts)
- author_id (reference to users)
- created_at (datetime, auto)Key Patterns
// Create post with auth
const { user } = useAuth();
await bkend.data.create('posts', {
title, slug: title.toLowerCase().replace(/\s+/g, '-'),
body, status: 'draft', author_id: user.id,
});
// List published posts (public)
const posts = await bkend.data.list('posts', { status: 'published', sort: '-created_at' });
// Get post with comments
const post = await bkend.data.get('posts', postId);
const comments = await bkend.data.list('comments', { post_id: postId, sort: 'created_at' });Recipe 3: User Dashboard with File Upload
Key Patterns
// Profile with avatar upload
async function updateAvatar(file: File) {
const { url } = await bkend.storage.upload(file, 'avatars');
await bkend.data.update('users', user.id, { avatar_url: url });
}
// Dashboard stats
async function getDashboardStats(userId: string) {
const [posts, comments] = await Promise.all([
bkend.data.list('posts', { author_id: userId }),
bkend.data.list('comments', { author_id: userId }),
]);
return { postCount: posts.length, commentCount: comments.length };
}Project Template
For any recipe, start with:
npx create-next-app@latest my-app --typescript --tailwind --app
cd my-app
npm install @tanstack/react-query zustandThen:
- Set up bkend client (
lib/bkend.ts) - Create auth store (
stores/auth-store.ts) - Add QueryClientProvider
- Build features following recipe patterns
Reference
See references/bkend-patterns.md for complete API client and pattern reference.
Other versions3 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 3
- popup-studio-ai/bkit-claude-code★ 601same name
- ww-w-ai/bkit-claude-code★ 599same name
- ww-w-ai/bkit-gemini★ 66same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository27 other files it gives its agents.
- AGENTS.mdAGENTS.md
- bkend-authSkill
- bkend-dataSkill
- bkend-quickstartSkill
- bkend-storageSkill
- bkit-rulesSkill
- bkit-templatesSkill
- code-reviewSkill
- codex-learningSkill
- desktop-appSkill
- development-pipelineSkill
- dynamicSkill
- enterpriseSkill
- mobile-appSkill
- pdcaSkill
- phase-1-schemaSkill
- phase-2-conventionSkill
- phase-3-mockupSkill
- phase-4-apiSkill
- phase-5-design-systemSkill
- phase-6-ui-integrationSkill
- phase-7-seo-securitySkill
- phase-8-reviewSkill
- phase-9-deploymentSkill
- plan-plusSkill
- starterSkill
- zero-script-qaSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

