├── src ├── api │ ├── .gitkeep │ ├── todo │ │ ├── routes │ │ │ └── todo.ts │ │ ├── services │ │ │ └── todo.ts │ │ ├── controllers │ │ │ └── todo.ts │ │ └── content-types │ │ │ └── todo │ │ │ └── schema.json │ └── todo-list-page │ │ ├── routes │ │ └── todo-list-page.ts │ │ ├── services │ │ └── todo-list-page.ts │ │ ├── controllers │ │ └── todo-list-page.ts │ │ └── content-types │ │ └── todo-list-page │ │ └── schema.json ├── extensions │ └── .gitkeep ├── admin │ ├── webpack.config.example.ts │ ├── tsconfig.json │ └── app.example.tsx ├── components │ └── general │ │ └── link.json ├── _seed │ ├── todo-list-page.ts │ ├── user.ts │ ├── index.ts │ ├── todo.ts │ └── helpers.ts └── index.ts ├── public ├── uploads │ └── .gitkeep ├── todo.jpeg └── robots.txt ├── .env.example ├── favicon.ico ├── config ├── api.ts ├── admin.ts ├── server.ts ├── middlewares.ts └── database.ts ├── .editorconfig ├── tsconfig.json ├── package.json ├── .gitignore └── README.md /src/api/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/uploads/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/extensions/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | HOST=0.0.0.0 2 | PORT=1337 3 | APP_KEYS="toBeModified1,toBeModified2" -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriishupta/strapi-generate-seed-data/HEAD/favicon.ico -------------------------------------------------------------------------------- /public/todo.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriishupta/strapi-generate-seed-data/HEAD/public/todo.jpeg -------------------------------------------------------------------------------- /config/api.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | rest: { 3 | defaultLimit: 25, 4 | maxLimit: 100, 5 | withCount: true, 6 | }, 7 | }; 8 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # To prevent search engines from seeing the site altogether, uncomment the next two lines: 2 | # User-Agent: * 3 | # Disallow: / 4 | -------------------------------------------------------------------------------- /config/admin.ts: -------------------------------------------------------------------------------- 1 | export default ({ env }) => ({ 2 | auth: { 3 | secret: env('ADMIN_JWT_SECRET', '7397aac2b264b067a86b9d385a97375f'), 4 | }, 5 | }); 6 | -------------------------------------------------------------------------------- /src/api/todo/routes/todo.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * todo router. 3 | */ 4 | 5 | import { factories } from '@strapi/strapi'; 6 | 7 | export default factories.createCoreRouter('api::todo.todo'); 8 | -------------------------------------------------------------------------------- /config/server.ts: -------------------------------------------------------------------------------- 1 | export default ({ env }) => ({ 2 | host: env('HOST', '0.0.0.0'), 3 | port: env.int('PORT', 1337), 4 | app: { 5 | keys: env.array('APP_KEYS'), 6 | }, 7 | }); 8 | -------------------------------------------------------------------------------- /src/api/todo/services/todo.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * todo service. 3 | */ 4 | 5 | import { factories } from '@strapi/strapi'; 6 | 7 | export default factories.createCoreService('api::todo.todo'); 8 | -------------------------------------------------------------------------------- /src/api/todo/controllers/todo.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * todo controller 3 | */ 4 | 5 | import { factories } from '@strapi/strapi' 6 | 7 | export default factories.createCoreController('api::todo.todo'); 8 | -------------------------------------------------------------------------------- /src/api/todo-list-page/routes/todo-list-page.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * todo-list-page router. 3 | */ 4 | 5 | import { factories } from '@strapi/strapi'; 6 | 7 | export default factories.createCoreRouter('api::todo-list-page.todo-list-page'); 8 | -------------------------------------------------------------------------------- /src/api/todo-list-page/services/todo-list-page.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * todo-list-page service. 3 | */ 4 | 5 | import { factories } from '@strapi/strapi'; 6 | 7 | export default factories.createCoreService('api::todo-list-page.todo-list-page'); 8 | -------------------------------------------------------------------------------- /src/api/todo-list-page/controllers/todo-list-page.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * todo-list-page controller 3 | */ 4 | 5 | import { factories } from '@strapi/strapi' 6 | 7 | export default factories.createCoreController('api::todo-list-page.todo-list-page'); 8 | -------------------------------------------------------------------------------- /src/admin/webpack.config.example.ts: -------------------------------------------------------------------------------- 1 | export default (config, webpack) => { 2 | // Note: we provide webpack above so you should not `require` it 3 | // Perform customizations to webpack config 4 | // Important: return the modified config 5 | return config; 6 | }; 7 | -------------------------------------------------------------------------------- /src/admin/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@strapi/typescript-utils/tsconfigs/admin", 3 | "include": [ 4 | "../plugins/**/admin/src/**/*", 5 | "./" 6 | ], 7 | "exclude": [ 8 | "node_modules/", 9 | "build/", 10 | "dist/", 11 | "**/*.test.ts" 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /config/middlewares.ts: -------------------------------------------------------------------------------- 1 | export default [ 2 | 'strapi::errors', 3 | 'strapi::security', 4 | 'strapi::cors', 5 | 'strapi::poweredBy', 6 | 'strapi::logger', 7 | 'strapi::query', 8 | 'strapi::body', 9 | 'strapi::session', 10 | 'strapi::favicon', 11 | 'strapi::public', 12 | ]; 13 | -------------------------------------------------------------------------------- /config/database.ts: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | 3 | export default ({ env }) => ({ 4 | connection: { 5 | client: 'sqlite', 6 | connection: { 7 | filename: path.join(__dirname, '..', '..', env('DATABASE_FILENAME', '.tmp/data.db')), 8 | }, 9 | useNullAsDefault: true, 10 | }, 11 | }); 12 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [{package.json,*.yml}] 12 | indent_style = space 13 | indent_size = 2 14 | 15 | [*.md] 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /src/components/general/link.json: -------------------------------------------------------------------------------- 1 | { 2 | "collectionName": "components_general_links", 3 | "info": { 4 | "displayName": "Link", 5 | "description": "" 6 | }, 7 | "options": {}, 8 | "attributes": { 9 | "name": { 10 | "type": "string", 11 | "required": true 12 | }, 13 | "url": { 14 | "type": "text", 15 | "required": true 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@strapi/typescript-utils/tsconfigs/server", 3 | "compilerOptions": { 4 | "outDir": "dist", 5 | "rootDir": "." 6 | }, 7 | "include": [ 8 | "./", 9 | "src/**/*.json" 10 | ], 11 | "exclude": [ 12 | "node_modules/", 13 | "build/", 14 | "dist/", 15 | ".cache/", 16 | ".tmp/", 17 | "src/admin/", 18 | "**/*.test.ts", 19 | "src/plugins/**" 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /src/admin/app.example.tsx: -------------------------------------------------------------------------------- 1 | export default { 2 | config: { 3 | locales: [ 4 | // 'ar', 5 | // 'fr', 6 | // 'cs', 7 | // 'de', 8 | // 'dk', 9 | // 'es', 10 | // 'he', 11 | // 'id', 12 | // 'it', 13 | // 'ja', 14 | // 'ko', 15 | // 'ms', 16 | // 'nl', 17 | // 'no', 18 | // 'pl', 19 | // 'pt-BR', 20 | // 'pt', 21 | // 'ru', 22 | // 'sk', 23 | // 'sv', 24 | // 'th', 25 | // 'tr', 26 | // 'uk', 27 | // 'vi', 28 | // 'zh-Hans', 29 | // 'zh', 30 | ], 31 | }, 32 | bootstrap(app) { 33 | console.log(app); 34 | }, 35 | }; 36 | -------------------------------------------------------------------------------- /src/api/todo/content-types/todo/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "kind": "collectionType", 3 | "collectionName": "todos", 4 | "info": { 5 | "singularName": "todo", 6 | "pluralName": "todos", 7 | "displayName": "Todo", 8 | "description": "" 9 | }, 10 | "options": { 11 | "draftAndPublish": true 12 | }, 13 | "pluginOptions": {}, 14 | "attributes": { 15 | "title": { 16 | "type": "string" 17 | }, 18 | "description": { 19 | "type": "text" 20 | }, 21 | "finished": { 22 | "type": "boolean" 23 | }, 24 | "image": { 25 | "allowedTypes": [ 26 | "images" 27 | ], 28 | "type": "media", 29 | "multiple": false 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/api/todo-list-page/content-types/todo-list-page/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "kind": "singleType", 3 | "collectionName": "todo_list_pages", 4 | "info": { 5 | "singularName": "todo-list-page", 6 | "pluralName": "todo-list-pages", 7 | "displayName": "Todo List Page", 8 | "description": "" 9 | }, 10 | "options": { 11 | "draftAndPublish": true 12 | }, 13 | "pluginOptions": {}, 14 | "attributes": { 15 | "title": { 16 | "type": "string" 17 | }, 18 | "todos": { 19 | "type": "relation", 20 | "relation": "oneToMany", 21 | "target": "api::todo.todo" 22 | }, 23 | "other_links": { 24 | "type": "component", 25 | "repeatable": true, 26 | "component": "general.link" 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "strapi-generate-seed-data", 3 | "private": true, 4 | "version": "0.1.0", 5 | "description": "A Strapi application", 6 | "scripts": { 7 | "develop": "strapi develop", 8 | "start": "strapi start", 9 | "build": "strapi build", 10 | "strapi": "strapi", 11 | "seed": "FORCE_APP_BOOTSTRAP_ONLY=true strapi start" 12 | }, 13 | "devDependencies": { 14 | "@faker-js/faker": "^7.3.0" 15 | }, 16 | "dependencies": { 17 | "@strapi/plugin-i18n": "4.3.2", 18 | "@strapi/plugin-users-permissions": "4.3.2", 19 | "@strapi/strapi": "4.3.2", 20 | "better-sqlite3": "7.4.6" 21 | }, 22 | "author": { 23 | "name": "A Strapi developer" 24 | }, 25 | "strapi": { 26 | "uuid": "1ec39e4a-fa2c-4f12-9c36-3a51a8cf7a38" 27 | }, 28 | "engines": { 29 | "node": ">=12.x.x <=16.x.x", 30 | "npm": ">=6.0.0" 31 | }, 32 | "license": "MIT" 33 | } 34 | -------------------------------------------------------------------------------- /src/_seed/todo-list-page.ts: -------------------------------------------------------------------------------- 1 | export const fillTodoListPage = async (strapi: Strapi.Strapi) => { 2 | console.log('filling todo list page...') 3 | 4 | let todoListPageObject = await strapi.entityService.findMany('api::todo-list-page.todo-list-page', {}) 5 | 6 | if (!todoListPageObject) { 7 | todoListPageObject = await strapi.entityService.create('api::todo-list-page.todo-list-page', { 8 | data: { 9 | publishedAt: new Date().toISOString() 10 | } 11 | }) 12 | } 13 | 14 | const todos = (await strapi.entityService.findMany('api::todo.todo', { 15 | limit: 5 16 | })).map(todo => todo.id) 17 | 18 | await strapi.entityService.update('api::todo-list-page.todo-list-page', todoListPageObject.id, { 19 | data: { 20 | title: 'The Todo List', 21 | todos, 22 | other_links: [{ 23 | name: 'generate-dummy-data-in-strapi', 24 | url: 'https://strapi.io/video-library/generate-dummy-data-in-strapi', 25 | }], 26 | } 27 | }) 28 | 29 | console.log('todo list page has been filled successfully!') 30 | } 31 | 32 | -------------------------------------------------------------------------------- /src/_seed/user.ts: -------------------------------------------------------------------------------- 1 | export const SEED_USERNAME = 'seed_user' 2 | 3 | /** 4 | * Using Users collection as main indicator if we have generated seed data before 5 | */ 6 | export const seedUserExists = async (strapi: Strapi.Strapi) => { 7 | const [seedUser] = await strapi.entityService.findMany('plugin::users-permissions.user', { 8 | filters: { 9 | username: SEED_USERNAME 10 | } 11 | }) 12 | return !!seedUser 13 | } 14 | 15 | /** 16 | * Creating user that will be an indicator for method `seedUserExists` 17 | * 18 | * cannot be used for login, such as lacks full functionality with JWT 19 | * for more info how to create valid user via API, checkout the source-code: 20 | * https://github.com/strapi/strapi/blob/master/packages/plugins/users-permissions/server/controllers/auth.js#L239 21 | */ 22 | export const createSeedUser = async (strapi: Strapi.Strapi) => { 23 | const now = Date.now() 24 | 25 | await strapi.entityService.create('plugin::users-permissions.user', { 26 | data: { 27 | username: SEED_USERNAME, 28 | password: `${ SEED_USERNAME }-${ now }`, 29 | email: `${ SEED_USERNAME }@test.com`, 30 | confirmed: true 31 | } 32 | }) 33 | } 34 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { generateSeedData } from './_seed'; 2 | 3 | export default { 4 | /** 5 | * An asynchronous register function that runs before 6 | * your application is initialized. 7 | * 8 | * This gives you an opportunity to extend code. 9 | */ 10 | register(/*{ strapi }*/) {}, 11 | 12 | /** 13 | * An asynchronous bootstrap function that runs before 14 | * your application gets started. 15 | * 16 | * This gives you an opportunity to set up your data model, 17 | * run jobs, or perform some special logic. 18 | */ 19 | async bootstrap({ strapi }: { strapi: Strapi.Strapi }) { 20 | console.log('running App bootstrap...') 21 | if (process.env.NODE_ENV === 'development') { 22 | console.log('the App is in the development mode!') 23 | console.log('running the development bootstrap...') 24 | 25 | await generateSeedData(strapi) 26 | 27 | // other DEVELOPMENT bootstrap functions 28 | } 29 | 30 | // general bootstrap functions 31 | 32 | console.log('bootstrap function has finished successfully!') 33 | 34 | if (process.env.FORCE_APP_BOOTSTRAP_ONLY === 'true') { 35 | console.log('FORCE_APP_BOOTSTRAP_ONLY mode has been activated - exiting process prematurely.') 36 | process.exit(0) 37 | } 38 | }, 39 | }; 40 | -------------------------------------------------------------------------------- /src/_seed/index.ts: -------------------------------------------------------------------------------- 1 | import {seedUserExists, createSeedUser } from './user' 2 | import { clearData } from './helpers'; 3 | import { generateTodoData } from './todo'; 4 | import { fillTodoListPage } from './todo-list-page'; 5 | 6 | export const generateSeedData = async (strapi: Strapi.Strapi) => { 7 | const dataExists = await seedUserExists(strapi) 8 | const forceBootstrap = process.env.FORCE_APP_BOOTSTRAP_ONLY === 'true' 9 | 10 | const skipGeneration = dataExists && !forceBootstrap 11 | 12 | if (skipGeneration) { 13 | console.log('skipping seed data generation...') 14 | return 15 | } 16 | 17 | if (forceBootstrap) { 18 | console.log('forcing seed data re-creation...') 19 | await clearData(strapi) 20 | console.log('existing data has been cleaned!') 21 | } 22 | 23 | console.log('generating seed data...') 24 | 25 | await Promise.all([ 26 | generateTodoData(strapi), 27 | createSeedUser(strapi), 28 | ]).catch(e => { 29 | console.error('error during generating seed data! Stopping the application...') 30 | throw new Error(e) 31 | }) 32 | 33 | // Pages 34 | await Promise.all([ 35 | fillTodoListPage(strapi), 36 | ]).catch(e => { 37 | console.error('error during generating page data! Stopping the application...') 38 | throw new Error(e) 39 | }) 40 | 41 | console.log('generating seed data has been finished successfully!') 42 | } 43 | -------------------------------------------------------------------------------- /src/_seed/todo.ts: -------------------------------------------------------------------------------- 1 | import { faker } from '@faker-js/faker' 2 | import { randomBoolean, uploadFile } from './helpers' 3 | import { join } from 'path' 4 | 5 | export const generateTodoData = async (strapi: Strapi.Strapi) => { 6 | console.log('generating todos') 7 | 8 | const { DEV_SEED_DATA_TODOS } = process.env 9 | const todosSize = DEV_SEED_DATA_TODOS ? parseInt(DEV_SEED_DATA_TODOS) : 5 10 | 11 | const uploadedTodoMedia = await uploadFile(strapi, { 12 | data: { 13 | refId: Date.now().toString(), 14 | ref: 'api::todo.todo', 15 | field: 'image', 16 | }, 17 | file: { 18 | path: join(__dirname, '../../../public/todo.jpeg'), 19 | name: 'todo.jpeg', 20 | type: 'image/jpeg' 21 | }, 22 | }) 23 | 24 | const bulkTodoPromises = [] 25 | const randomTodosData = new Array(todosSize).fill(null).map(_randomTodo) 26 | 27 | for (const randomTodoData of randomTodosData) { 28 | const randomTodoPromise = strapi.entityService.create('api::todo.todo', { 29 | data: { 30 | ...randomTodoData, 31 | image: uploadedTodoMedia.id 32 | } 33 | }) 34 | bulkTodoPromises.push(randomTodoPromise) 35 | } 36 | 37 | await Promise.all(bulkTodoPromises) 38 | } 39 | 40 | const _randomTodo = () => { 41 | return { 42 | title: faker.company.bsBuzz(), 43 | description: faker.lorem.paragraph(5), 44 | finished: randomBoolean(), 45 | publishedAt: randomBoolean() ? new Date().toISOString() : null 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ############################ 2 | # OS X 3 | ############################ 4 | 5 | .DS_Store 6 | .AppleDouble 7 | .LSOverride 8 | Icon 9 | .Spotlight-V100 10 | .Trashes 11 | ._* 12 | 13 | 14 | ############################ 15 | # Linux 16 | ############################ 17 | 18 | *~ 19 | 20 | 21 | ############################ 22 | # Windows 23 | ############################ 24 | 25 | Thumbs.db 26 | ehthumbs.db 27 | Desktop.ini 28 | $RECYCLE.BIN/ 29 | *.cab 30 | *.msi 31 | *.msm 32 | *.msp 33 | 34 | 35 | ############################ 36 | # Packages 37 | ############################ 38 | 39 | *.7z 40 | *.csv 41 | *.dat 42 | *.dmg 43 | *.gz 44 | *.iso 45 | *.jar 46 | *.rar 47 | *.tar 48 | *.zip 49 | *.com 50 | *.class 51 | *.dll 52 | *.exe 53 | *.o 54 | *.seed 55 | *.so 56 | *.swo 57 | *.swp 58 | *.swn 59 | *.swm 60 | *.out 61 | *.pid 62 | 63 | 64 | ############################ 65 | # Logs and databases 66 | ############################ 67 | 68 | .tmp 69 | *.log 70 | *.sql 71 | *.sqlite 72 | *.sqlite3 73 | 74 | 75 | ############################ 76 | # Misc. 77 | ############################ 78 | 79 | *# 80 | ssl 81 | .idea 82 | nbproject 83 | public/uploads/* 84 | !public/uploads/.gitkeep 85 | 86 | ############################ 87 | # Node.js 88 | ############################ 89 | 90 | lib-cov 91 | lcov.info 92 | pids 93 | logs 94 | results 95 | node_modules 96 | .node_history 97 | 98 | ############################ 99 | # Tests 100 | ############################ 101 | 102 | testApp 103 | coverage 104 | 105 | ############################ 106 | # Strapi 107 | ############################ 108 | 109 | .env 110 | license.txt 111 | exports 112 | *.cache 113 | build 114 | .strapi-updater.json 115 | dist 116 | -------------------------------------------------------------------------------- /src/_seed/helpers.ts: -------------------------------------------------------------------------------- 1 | import { statSync } from 'fs' 2 | 3 | export const randomBoolean = () => Math.random() < 0.5 4 | 5 | const ensureSQLite = (strapi: Strapi.Strapi) => { 6 | console.log('verifying db as local SQLite') 7 | const db: { config: { connection: { client: string } } } = strapi.db as any // from debugging 8 | 9 | if (db.config.connection.client !== 'sqlite') { 10 | throw new Error('strapi is NOT using local SQLite! Please, verify usage of SQLite before clearing data') 11 | } 12 | } 13 | 14 | export const clearData = async (strapi: Strapi.Strapi) => { 15 | ensureSQLite(strapi) 16 | 17 | const collectionTypeUids = ['api::todo.todo', 'plugin::users-permissions.user'] 18 | const bulkClears = [] 19 | 20 | for (const collectionTypeUid of collectionTypeUids) { 21 | const collectionClear = strapi.query(collectionTypeUid).deleteMany({ 22 | where: { 23 | id: { 24 | $notNull: true, 25 | }, 26 | }, 27 | }); 28 | 29 | bulkClears.push(collectionClear) 30 | } 31 | 32 | await Promise.all(bulkClears) 33 | } 34 | 35 | type UploadFile = { 36 | data: UploadFileData, 37 | file: UploadFileFile, 38 | } 39 | 40 | type UploadFileData = { 41 | ref: string 42 | refId: string 43 | field: string 44 | } 45 | 46 | type UploadFileFile = { 47 | name: string 48 | path: string 49 | type: string 50 | } 51 | 52 | export const uploadFile = async (strapi: Strapi.Strapi, { 53 | data, 54 | file, 55 | }: UploadFile) => { 56 | const { refId, ref, field } = data 57 | const { name, path, type } = file 58 | 59 | const fileStat = statSync(path); 60 | 61 | const [uploadedFile] = await strapi.plugins.upload.services.upload.upload({ 62 | data: { 63 | refId, 64 | ref, 65 | field 66 | }, 67 | files: { 68 | path, 69 | name, 70 | type, 71 | size: fileStat.size, 72 | }, 73 | }); 74 | 75 | return uploadedFile 76 | } 77 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🧑‍💻 Generate Dummy Data with Strapi 2 | This is an example repository that has the example of how to seed your CMS 3 | with initial data for development purposes. 4 | 5 | To seed data: 6 | - follow Strapi's "getting started" 7 | - data would be automatically generated 8 | - run `yarn seed` to regenerate 9 | 10 | # 🚀 Getting started with Strapi 11 | 12 | Strapi comes with a full featured [Command Line Interface](https://docs.strapi.io/developer-docs/latest/developer-resources/cli/CLI.html) (CLI) which lets you scaffold and manage your project in seconds. 13 | 14 | ### `develop` 15 | 16 | Start your Strapi application with autoReload enabled. [Learn more](https://docs.strapi.io/developer-docs/latest/developer-resources/cli/CLI.html#strapi-develop) 17 | 18 | ``` 19 | npm run develop 20 | # or 21 | yarn develop 22 | ``` 23 | 24 | ### `start` 25 | 26 | Start your Strapi application with autoReload disabled. [Learn more](https://docs.strapi.io/developer-docs/latest/developer-resources/cli/CLI.html#strapi-start) 27 | 28 | ``` 29 | npm run start 30 | # or 31 | yarn start 32 | ``` 33 | 34 | ### `build` 35 | 36 | Build your admin panel. [Learn more](https://docs.strapi.io/developer-docs/latest/developer-resources/cli/CLI.html#strapi-build) 37 | 38 | ``` 39 | npm run build 40 | # or 41 | yarn build 42 | ``` 43 | 44 | ## ⚙️ Deployment 45 | 46 | Strapi gives you many possible deployment options for your project. Find the one that suits you on the [deployment section of the documentation](https://docs.strapi.io/developer-docs/latest/setup-deployment-guides/deployment.html). 47 | 48 | ## 📚 Learn more 49 | 50 | - [Resource center](https://strapi.io/resource-center) - Strapi resource center. 51 | - [Strapi documentation](https://docs.strapi.io) - Official Strapi documentation. 52 | - [Strapi tutorials](https://strapi.io/tutorials) - List of tutorials made by the core team and the community. 53 | - [Strapi blog](https://docs.strapi.io) - Official Strapi blog containing articles made by the Strapi team and the community. 54 | - [Changelog](https://strapi.io/changelog) - Find out about the Strapi product updates, new features and general improvements. 55 | 56 | Feel free to check out the [Strapi GitHub repository](https://github.com/strapi/strapi). Your feedback and contributions are welcome! 57 | 58 | ## ✨ Community 59 | 60 | - [Discord](https://discord.strapi.io) - Come chat with the Strapi community including the core team. 61 | - [Forum](https://forum.strapi.io/) - Place to discuss, ask questions and find answers, show your Strapi project and get feedback or just talk with other Community members. 62 | - [Awesome Strapi](https://github.com/strapi/awesome-strapi) - A curated list of awesome things related to Strapi. 63 | 64 | --- 65 | 66 | 🤫 Psst! [Strapi is hiring](https://strapi.io/careers). 67 | --------------------------------------------------------------------------------