--- sidebar_position: 2 --- # Getting Started This guide will help you set up DebrosFramework and create your first decentralized application in just a few minutes. ## Prerequisites Before you begin, make sure you have: - **Node.js** (version 18.0 or above) - **npm** or **pnpm** package manager - Basic knowledge of **TypeScript** and **decorators** - Familiarity with **async/await** patterns ## Installation ### 1. Create a New Project ```bash mkdir my-debros-app cd my-debros-app npm init -y ``` ### 2. Install @debros/network ```bash npm install @debros/network npm install --save-dev typescript @types/node ``` ### 3. Set Up TypeScript Configuration Create a `tsconfig.json` file: ```json { "compilerOptions": { "target": "ES2020", "module": "commonjs", "lib": ["ES2020"], "experimentalDecorators": true, "emitDecoratorMetadata": true, "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, "declaration": true, "outDir": "./dist", "rootDir": "./src" }, "include": ["src/**/*"], "exclude": ["node_modules", "dist"] } ``` ### 4. Install OrbitDB and IPFS Dependencies DebrosFramework requires OrbitDB and IPFS services: ```bash npm install @orbitdb/core @helia/helia @helia/unixfs @libp2p/peer-id ``` ## Your First Application Let's create a simple social media application to demonstrate DebrosFramework's capabilities. ### 1. Create the Project Structure ``` src/ ├── models/ │ ├── User.ts │ ├── Post.ts │ └── index.ts ├── services/ │ ├── orbitdb.ts │ └── ipfs.ts └── index.ts ``` ### 2. Set Up IPFS Service Create `src/services/ipfs.ts`: ```typescript import { createHelia } from '@helia/helia'; import { createLibp2p } from 'libp2p'; // Add other necessary imports based on your setup export class IPFSService { private helia: any; private libp2p: any; async init(): Promise { // Initialize your IPFS/Helia instance // This is a simplified example - customize based on your needs this.libp2p = await createLibp2p({ // Your libp2p configuration }); this.helia = await createHelia({ libp2p: this.libp2p, }); } getHelia() { return this.helia; } getLibp2pInstance() { return this.libp2p; } async stop(): Promise { if (this.helia) { await this.helia.stop(); } } } ``` ### 3. Set Up OrbitDB Service Create `src/services/orbitdb.ts`: ```typescript import { createOrbitDB } from '@orbitdb/core'; export class OrbitDBService { private orbitdb: any; private ipfs: any; constructor(ipfsService: any) { this.ipfs = ipfsService; } async init(): Promise { this.orbitdb = await createOrbitDB({ ipfs: this.ipfs.getHelia(), // Add other OrbitDB configuration options }); } async openDB(name: string, type: string): Promise { return await this.orbitdb.open(name, { type }); } getOrbitDB() { return this.orbitdb; } async stop(): Promise { if (this.orbitdb) { await this.orbitdb.stop(); } } } ``` ### 4. Define Your First Model Create `src/models/User.ts`: ```typescript import { BaseModel, Model, Field, HasMany } from 'debros-framework'; import { Post } from './Post'; @Model({ scope: 'global', // Global model - shared across all users type: 'docstore', sharding: { strategy: 'hash', count: 4, key: 'id', }, }) export class User extends BaseModel { @Field({ type: 'string', required: true, unique: true, validate: (value: string) => value.length >= 3 && value.length <= 20, }) username: string; @Field({ type: 'string', required: true, unique: true, validate: (value: string) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value), }) email: string; @Field({ type: 'string', required: false }) bio?: string; @Field({ type: 'string', required: false }) profilePicture?: string; @Field({ type: 'boolean', required: false, default: true }) isActive: boolean; @Field({ type: 'number', required: false, default: () => Date.now() }) registeredAt: number; // Relationship: One user has many posts @HasMany(() => Post, 'userId') posts: Post[]; } ``` ### 5. Create a Post Model Create `src/models/Post.ts`: ```typescript import { BaseModel, Model, Field, BelongsTo } from 'debros-framework'; import { User } from './User'; @Model({ scope: 'user', // User-scoped model - each user has their own database type: 'docstore', sharding: { strategy: 'user', count: 2, key: 'userId', }, }) export class Post extends BaseModel { @Field({ type: 'string', required: true }) title: string; @Field({ type: 'string', required: true, validate: (value: string) => value.length <= 5000, }) content: string; @Field({ type: 'string', required: true }) userId: string; @Field({ type: 'array', required: false, default: [] }) tags: string[]; @Field({ type: 'boolean', required: false, default: true }) isPublic: boolean; @Field({ type: 'number', required: false, default: 0 }) likeCount: number; @Field({ type: 'number', required: false, default: () => Date.now() }) createdAt: number; @Field({ type: 'number', required: false, default: () => Date.now() }) updatedAt: number; // Relationship: Post belongs to a user @BelongsTo(() => User, 'userId') user: User; } ``` ### 6. Export Your Models Create `src/models/index.ts`: ```typescript export { User } from './User'; export { Post } from './Post'; ``` ### 7. Create the Main Application Create `src/index.ts`: ```typescript import { DebrosFramework } from 'debros-framework'; import { IPFSService } from './services/ipfs'; import { OrbitDBService } from './services/orbitdb'; import { User, Post } from './models'; async function main() { // Initialize services const ipfsService = new IPFSService(); await ipfsService.init(); const orbitDBService = new OrbitDBService(ipfsService); await orbitDBService.init(); // Initialize DebrosFramework const framework = new DebrosFramework(); await framework.initialize(orbitDBService, ipfsService); console.log('🚀 DebrosFramework initialized successfully!'); // Create a user const user = await User.create({ username: 'alice', email: 'alice@example.com', bio: 'Hello, I am Alice!', isActive: true, }); console.log('✅ Created user:', user.id); // Create a post for the user const post = await Post.create({ title: 'My First Post', content: 'This is my first post using DebrosFramework!', userId: user.id, tags: ['introduction', 'debros'], isPublic: true, }); console.log('✅ Created post:', post.id); // Query users with their posts const usersWithPosts = await User.query().where('isActive', true).with(['posts']).find(); console.log('📊 Users with posts:'); usersWithPosts.forEach((user) => { console.log(`- ${user.username}: ${user.posts.length} posts`); }); // Find posts by tags const taggedPosts = await Post.query() .where('tags', 'includes', 'debros') .with(['user']) .orderBy('createdAt', 'desc') .find(); console.log('🏷️ Posts tagged with "debros":'); taggedPosts.forEach((post) => { console.log(`- "${post.title}" by ${post.user.username}`); }); // Clean up await framework.stop(); console.log('👋 Framework stopped successfully'); } main().catch(console.error); ``` ### 8. Add Package.json Scripts Update your `package.json`: ```json { "scripts": { "build": "tsc", "start": "node dist/index.js", "dev": "ts-node src/index.ts" } } ``` ### 9. Install Additional Development Dependencies ```bash npm install --save-dev ts-node ``` ## Running Your Application ### 1. Build the Project ```bash npm run build ``` ### 2. Run the Application ```bash npm start ``` Or for development with hot reloading: ```bash npm run dev ``` You should see output similar to: ``` 🚀 DebrosFramework initialized successfully! ✅ Created user: user_abc123 ✅ Created post: post_def456 📊 Users with posts: - alice: 1 posts 🏷️ Posts tagged with "debros": - "My First Post" by alice 👋 Framework stopped successfully ``` ## What's Next? Congratulations! You've successfully created your first DebrosFramework application. Here's what you can explore next: ### Learn Core Concepts - [Architecture Overview](./core-concepts/architecture) - Understand how DebrosFramework works - [Models and Decorators](./core-concepts/models) - Deep dive into model definition - [Database Management](./core-concepts/database-management) - Learn about user-scoped vs global databases ### Explore Advanced Features - [Query System](./query-system/query-builder) - Build complex queries - [Relationships](./query-system/relationships) - Work with model relationships - [Automatic Pinning](./advanced/automatic-pinning) - Optimize data availability - [Migrations](./advanced/migrations) - Evolve your schema over time ### Check Out Examples - [Social Platform Example](./examples/social-platform) - Complete social media application - [Complex Queries](./examples/complex-queries) - Advanced query patterns - [Migration Examples](./examples/migrations) - Schema evolution patterns ## Common Issues ### TypeScript Decorator Errors Make sure you have `"experimentalDecorators": true` and `"emitDecoratorMetadata": true` in your `tsconfig.json`. ### IPFS/OrbitDB Connection Issues Ensure your IPFS and OrbitDB services are properly configured. Check the console for connection errors and verify your network configuration. ### Model Registration Issues Models are automatically registered when imported. Make sure you're importing your models before using DebrosFramework. ## Need Help? - 📖 Check our [comprehensive documentation](./core-concepts/architecture) - 💻 Browse [example code](https://github.com/debros/network/tree/main/examples) - 💬 Join our [Discord community](#) - 📧 Contact [support](#) Happy coding with DebrosFramework! 🎉