From c3dd790f7eab0faaf986aeaa44bd42b8fd01d3ba Mon Sep 17 00:00:00 2001 From: Nikhil <118773738+pablohashescobar@users.noreply.github.com> Date: Sat, 11 Oct 2025 20:55:48 +0530 Subject: [PATCH] [WEB-5058] feat: enhance workspace seeding with cycles, modules, and views creation (#7951) * feat: enhance workspace seeding with cycles, modules, and views creation - Added `create_cycles`, `create_modules`, and `create_views` functions to the workspace seeding process, enabling the creation of cycles, modules, and views based on new seed data. - Updated `create_project_issues` to associate issues with cycles and modules. - Introduced new seed files: `cycles.json`, `modules.json`, and `views.json` to provide initial data for cycles, modules, and views. - Integrated these new functionalities into the `workspace_seed` task for comprehensive workspace initialization. * feat: add project_id to page seed data for improved association - Added `project_id` field to the page with `id` 2 in `pages.json` to establish a clear link between pages and their respective projects. - This enhancement supports better organization and retrieval of page data within the project context. * feat: enhance workspace seed task with improved display properties and layout options - Updated the `create_project_and_member` function to include new display properties and layout configurations for better project visualization. - Modified display filters to group by state and added calendar layout options. - Enhanced the `create_modules` and `create_views` functions with improved formatting and structure for better readability and maintainability. * Update apps/api/plane/bgtasks/workspace_seed_task.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: correct project_id mapping in cycle and view creation functions - Updated the `create_cycles` function to use the correct `project_id` from the `project_map` for fetching the last cycle. - Removed redundant `view_id` extraction in the `create_views` function to streamline view creation process. * refactor: update create_cycles function to return project mapping - Changed the return type of the `create_cycles` function from `None` to `Dict[int, uuid.UUID]` to provide a mapping of project IDs after cycle creation. - This modification enhances the function's utility by allowing the caller to access the generated project mappings directly. * refactor: remove unused view_map variable in create_views function - Eliminated the `view_map` dictionary from the `create_views` function as it was not utilized, streamlining the code. - This change enhances code clarity and maintainability by removing unnecessary elements. * refactor: improve issue creation logic in create_project_issues function - Added comments to clarify the creation of issue labels, cycle issues, and module issues within the `create_project_issues` function. - Enhanced code readability and maintainability by structuring the issue creation process with clear conditional checks for cycles and modules. --------- Co-authored-by: sriram veeraghanta Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- apps/api/plane/bgtasks/workspace_seed_task.py | 178 +++++++++++++++++- apps/api/plane/seeds/data/cycles.json | 18 ++ apps/api/plane/seeds/data/issues.json | 44 +++-- apps/api/plane/seeds/data/modules.json | 26 +++ apps/api/plane/seeds/data/pages.json | 29 ++- apps/api/plane/seeds/data/views.json | 14 ++ 6 files changed, 281 insertions(+), 28 deletions(-) create mode 100644 apps/api/plane/seeds/data/cycles.json create mode 100644 apps/api/plane/seeds/data/modules.json create mode 100644 apps/api/plane/seeds/data/views.json diff --git a/apps/api/plane/bgtasks/workspace_seed_task.py b/apps/api/plane/bgtasks/workspace_seed_task.py index 6f342bb2a3..fb9980c3fd 100644 --- a/apps/api/plane/bgtasks/workspace_seed_task.py +++ b/apps/api/plane/bgtasks/workspace_seed_task.py @@ -5,9 +5,11 @@ import time import uuid from typing import Dict import logging +from datetime import timedelta # Django imports from django.conf import settings +from django.utils import timezone # Third party imports from celery import shared_task @@ -27,6 +29,11 @@ from plane.db.models import ( IssueActivity, Page, ProjectPage, + Cycle, + Module, + CycleIssue, + ModuleIssue, + IssueView, ) logger = logging.getLogger("plane.worker") @@ -118,13 +125,33 @@ def create_project_and_member(workspace: Workspace) -> Dict[int, uuid.UUID]: user_id=workspace_member["member_id"], workspace_id=workspace.id, display_filters={ - "group_by": None, - "order_by": "sort_order", - "type": None, - "sub_issue": True, - "show_empty_groups": True, "layout": "list", - "calendar_date_range": "", + "calendar": {"layout": "month", "show_weekends": False}, + "group_by": "state", + "order_by": "sort_order", + "sub_issue": True, + "sub_group_by": None, + "show_empty_groups": True, + }, + display_properties={ + "key": True, + "link": True, + "cycle": False, + "state": True, + "labels": False, + "modules": False, + "assignee": True, + "due_date": False, + "estimate": True, + "priority": True, + "created_on": True, + "issue_type": True, + "start_date": False, + "updated_on": True, + "customer_count": True, + "sub_issue_count": False, + "attachment_count": False, + "customer_request_count": True, }, created_by_id=workspace.created_by_id, ) @@ -207,6 +234,8 @@ def create_project_issues( project_map: Dict[int, uuid.UUID], states_map: Dict[int, uuid.UUID], labels_map: Dict[int, uuid.UUID], + cycles_map: Dict[int, uuid.UUID], + module_map: Dict[int, uuid.UUID], ) -> None: """Creates issues and their associated records for each project. @@ -236,6 +265,8 @@ def create_project_issues( labels = issue_seed.pop("labels") project_id = issue_seed.pop("project_id") state_id = issue_seed.pop("state_id") + cycle_id = issue_seed.pop("cycle_id") + module_ids = issue_seed.pop("module_ids") issue = Issue.objects.create( **issue_seed, @@ -261,6 +292,7 @@ def create_project_issues( epoch=time.time(), ) + # Create issue labels for label_id in labels: IssueLabel.objects.create( issue=issue, @@ -270,6 +302,27 @@ def create_project_issues( created_by_id=workspace.created_by_id, ) + # Create cycle issues + if cycle_id: + CycleIssue.objects.create( + issue=issue, + cycle_id=cycles_map[cycle_id], + project_id=project_map[project_id], + workspace_id=workspace.id, + created_by_id=workspace.created_by_id, + ) + + # Create module issues + if module_ids: + for module_id in module_ids: + ModuleIssue.objects.create( + issue=issue, + module_id=module_map[module_id], + project_id=project_map[project_id], + workspace_id=workspace.id, + created_by_id=workspace.created_by_id, + ) + logger.info(f"Task: workspace_seed_task -> Issue {issue_id} created") return @@ -292,6 +345,7 @@ def create_pages(workspace: Workspace, project_map: Dict[int, uuid.UUID]) -> Non page = Page.objects.create( workspace_id=workspace.id, is_global=False, + access=page_seed.get("access", Page.PUBLIC_ACCESS), name=page_seed.get("name"), description=page_seed.get("description", {}), description_html=page_seed.get("description_html", "

"), @@ -303,7 +357,7 @@ def create_pages(workspace: Workspace, project_map: Dict[int, uuid.UUID]) -> Non ) logger.info(f"Task: workspace_seed_task -> Page {page_id} created") - if page_seed.get("project_id") and page_seed.get("type") == "project": + if page_seed.get("project_id") and page_seed.get("type") == "PROJECT": ProjectPage.objects.create( workspace_id=workspace.id, project_id=project_map[page_seed.get("project_id")], @@ -315,6 +369,105 @@ def create_pages(workspace: Workspace, project_map: Dict[int, uuid.UUID]) -> Non logger.info(f"Task: workspace_seed_task -> Project Page {page_id} created") return + +def create_cycles(workspace: Workspace, project_map: Dict[int, uuid.UUID]) -> Dict[int, uuid.UUID]: + # Create cycles + cycle_seeds = read_seed_file("cycles.json") + if not cycle_seeds: + return + + cycle_map: Dict[int, uuid.UUID] = {} + + for cycle_seed in cycle_seeds: + cycle_id = cycle_seed.pop("id") + project_id = cycle_seed.pop("project_id") + type = cycle_seed.pop("type") + + if type == "CURRENT": + start_date = timezone.now() + end_date = start_date + timedelta(days=14) + + if type == "UPCOMING": + # Get the last cycle + last_cycle = Cycle.objects.filter(project_id=project_map[project_id]).order_by("-end_date").first() + if last_cycle: + start_date = last_cycle.end_date + timedelta(days=1) + end_date = start_date + timedelta(days=14) + else: + start_date = timezone.now() + timedelta(days=14) + end_date = start_date + timedelta(days=14) + + cycle = Cycle.objects.create( + **cycle_seed, + start_date=start_date, + end_date=end_date, + project_id=project_map[project_id], + workspace=workspace, + created_by_id=workspace.created_by_id, + owned_by_id=workspace.created_by_id, + ) + + cycle_map[cycle_id] = cycle.id + logger.info(f"Task: workspace_seed_task -> Cycle {cycle_id} created") + return cycle_map + + +def create_modules(workspace: Workspace, project_map: Dict[int, uuid.UUID]) -> None: + """Creates modules for each project in the workspace. + + Args: + workspace: The workspace containing the projects + project_map: Mapping of seed project IDs to actual project IDs + """ + module_seeds = read_seed_file("modules.json") + if not module_seeds: + return + + module_map: Dict[int, uuid.UUID] = {} + + for index, module_seed in enumerate(module_seeds): + module_id = module_seed.pop("id") + project_id = module_seed.pop("project_id") + + start_date = timezone.now() + timedelta(days=index * 2) + end_date = start_date + timedelta(days=14) + + module = Module.objects.create( + **module_seed, + start_date=start_date, + target_date=end_date, + project_id=project_map[project_id], + workspace=workspace, + created_by_id=workspace.created_by_id, + ) + module_map[module_id] = module.id + logger.info(f"Task: workspace_seed_task -> Module {module_id} created") + return module_map + + +def create_views(workspace: Workspace, project_map: Dict[int, uuid.UUID]) -> None: + """Creates views for each project in the workspace. + + Args: + workspace: The workspace containing the projects + project_map: Mapping of seed project IDs to actual project IDs + """ + + view_seeds = read_seed_file("views.json") + if not view_seeds: + return + + for view_seed in view_seeds: + project_id = view_seed.pop("project_id") + IssueView.objects.create( + **view_seed, + project_id=project_map[project_id], + workspace=workspace, + created_by_id=workspace.created_by_id, + owned_by_id=workspace.created_by_id, + ) + + @shared_task def workspace_seed(workspace_id: uuid.UUID) -> None: """Seeds a new workspace with initial project data. @@ -342,8 +495,17 @@ def workspace_seed(workspace_id: uuid.UUID) -> None: # Create project labels label_map = create_project_labels(workspace, project_map) + # Create project cycles + cycle_map = create_cycles(workspace, project_map) + + # Create project modules + module_map = create_modules(workspace, project_map) + # create project issues - create_project_issues(workspace, project_map, state_map, label_map) + create_project_issues(workspace, project_map, state_map, label_map, cycle_map, module_map) + + # create project views + create_views(workspace, project_map) # create project pages create_pages(workspace, project_map) diff --git a/apps/api/plane/seeds/data/cycles.json b/apps/api/plane/seeds/data/cycles.json new file mode 100644 index 0000000000..484508f702 --- /dev/null +++ b/apps/api/plane/seeds/data/cycles.json @@ -0,0 +1,18 @@ +[ + { + "id": 1, + "name": "Cycle 1: Getting Started with Plane", + "project_id": 1, + "sort_order": 1, + "timezone": "UTC", + "type": "CURRENT" + }, + { + "id": 2, + "name": "Cycle 2: Collaboration & Customization", + "project_id": 1, + "sort_order": 2, + "timezone": "UTC", + "type": "UPCOMING" + } +] \ No newline at end of file diff --git a/apps/api/plane/seeds/data/issues.json b/apps/api/plane/seeds/data/issues.json index ca341304b4..badd0e6115 100644 --- a/apps/api/plane/seeds/data/issues.json +++ b/apps/api/plane/seeds/data/issues.json @@ -6,10 +6,12 @@ "description_html": "

Hey there! This demo project is your playground to get hands-on with Plane. We've set this up so you can click around and see how everything works without worrying about breaking anything.

Each work item is designed to make you familiar with the basics of using Plane. Just follow along card by card at your own pace.

First thing to try

  1. Look in the Properties section below where it says State: Todo.

  2. Click on it and change it to Done from the dropdown. Alternatively, you can drag and drop the card to the Done column.

", "description_stripped": "Hey there! This demo project is your playground to get hands-on with Plane. We've set this up so you can click around and see how everything works without worrying about breaking anything.Each work item is designed to make you familiar with the basics of using Plane. Just follow along card by card at your own pace.First thing to tryLook in the Properties section below where it says State: Todo.Click on it and change it to Done from the dropdown. Alternatively, you can drag and drop the card to the Done column.", "sort_order": 1000, - "state_id": 3, + "state_id": 4, "labels": [], - "priority": "none", - "project_id": 1 + "priority": "urgent", + "project_id": 1, + "cycle_id": 1, + "module_ids": [1] }, { "id": 2, @@ -19,8 +21,10 @@ "sort_order": 2000, "state_id": 2, "labels": [2], - "priority": "none", - "project_id": 1 + "priority": "high", + "project_id": 1, + "cycle_id": 1, + "module_ids": [1] }, { "id": 3, @@ -31,8 +35,10 @@ "sort_order": 3000, "state_id": 1, "labels": [], - "priority": "none", - "project_id": 1 + "priority": "high", + "project_id": 1, + "cycle_id": 1, + "module_ids": [1, 2] }, { "id": 4, @@ -41,10 +47,12 @@ "description_html": "

A work item is the fundamental building block of your project. Think of these as the actionable tasks that move your project forward.

Ready to add something to your project's to-do list? Here's how:

  1. Click the Add work item button in the top-right corner of the Work Items page.

  2. Give your task a clear title and add any details in the description.

  3. Set up the essentials:

    • Assign it to a team member (or yourself!)

    • Choose a priority level

    • Add start and due dates if there's a timeline

Tip: Save time by using the keyboard shortcut C from anywhere in your project to quickly create a new work item!

Want to dive deeper into all the things you can do with work items? Check out our documentation.

", "description_stripped": "A work item is the fundamental building block of your project. Think of these as the actionable tasks that move your project forward.Ready to add something to your project's to-do list? Here's how:Click the Add work item button in the top-right corner of the Work Items page.Give your task a clear title and add any details in the description.Set up the essentials:Assign it to a team member (or yourself!)Choose a priority levelAdd start and due dates if there's a timelineTip: Save time by using the keyboard shortcut C from anywhere in your project to quickly create a new work item!Want to dive deeper into all the things you can do with work items? Check out our documentation.", "sort_order": 4000, - "state_id": 1, + "state_id": 3, "labels": [2], - "priority": "none", - "project_id": 1 + "priority": "high", + "project_id": 1, + "cycle_id": 1, + "module_ids": [1, 2] }, { "id": 5, @@ -53,10 +61,12 @@ "description_html": "

Plane offers multiple ways to look at your work items depending on what you need to see. Let's explore how to change views and customize them!

Switch between layouts

  1. Look at the top toolbar in your project. You'll see several layout icons.

  2. Click any of these icons to instantly switch between layouts.

Tip: Different layouts work best for different needs. Try Board view for tracking progress, Calendar for deadline management, and Gantt for timeline planning! See Layouts for more info.

Filter and display options

Need to focus on specific work?

  1. Click the Filters dropdown in the toolbar. Select criteria and choose which items to show.

  2. Click the Display dropdown to tailor how the information appears in your layout

  3. Created the perfect setup? Save it for later by clicking the the Save View button.

  4. Access saved views anytime from the Views section in your sidebar.

", "description_stripped": "Plane offers multiple ways to look at your work items depending on what you need to see. Let's explore how to change views and customize them!Switch between layoutsLook at the top toolbar in your project. You'll see several layout icons.Click any of these icons to instantly switch between layouts.Tip: Different layouts work best for different needs. Try Board view for tracking progress, Calendar for deadline management, and Gantt for timeline planning! See Layouts for more info.Filter and display optionsNeed to focus on specific work?Click the Filters dropdown in the toolbar. Select criteria and choose which items to show.Click the Display dropdown to tailor how the information appears in your layoutCreated the perfect setup? Save it for later by clicking the the Save View button.Access saved views anytime from the Views section in your sidebar.", "sort_order": 5000, - "state_id": 1, + "state_id": 3, "labels": [], "priority": "none", - "project_id": 1 + "project_id": 1, + "cycle_id": 2, + "module_ids": [2] }, { "id": 6, @@ -67,8 +77,10 @@ "sort_order": 6000, "state_id": 1, "labels": [2], - "priority": "none", - "project_id": 1 + "priority": "low", + "project_id": 1, + "cycle_id": 2, + "module_ids": [2, 3] }, { "id": 7, @@ -80,6 +92,8 @@ "state_id": 1, "labels": [], "priority": "none", - "project_id": 1 + "project_id": 1, + "cycle_id": 2, + "module_ids": [2, 3] } ] diff --git a/apps/api/plane/seeds/data/modules.json b/apps/api/plane/seeds/data/modules.json new file mode 100644 index 0000000000..f770276d75 --- /dev/null +++ b/apps/api/plane/seeds/data/modules.json @@ -0,0 +1,26 @@ +[ + { + "id": 1, + "name": "Core Workflow (System)", + "project_id": 1, + "sort_order": 1, + "status": "planned", + "description": "Manage, visualize, and track your work items across views." + }, + { + "id": 2, + "name": "Onboarding Flow (Feature)", + "project_id": 1, + "sort_order": 2, + "status": "backlog", + "description": "Everything about getting started - creating a project, inviting teammates." + }, + { + "id": 3, + "name": "Workspace Setup (Area)", + "project_id": 1, + "sort_order": 3, + "status": "in-progress", + "description": "The personalization layer - settings, labels, automations." + } +] \ No newline at end of file diff --git a/apps/api/plane/seeds/data/pages.json b/apps/api/plane/seeds/data/pages.json index 2cffeafe7c..d719220bfe 100644 --- a/apps/api/plane/seeds/data/pages.json +++ b/apps/api/plane/seeds/data/pages.json @@ -1,11 +1,30 @@ [ { "id": 1, - "name": "Pages Introduction", + "name": "Project Design Spec", "project_id": 1, - "description_stripped":"Bye, bye, Notion, Google Docs, Evernote, Keep, and Apple Notes. Plane Pages are here!What is Pages?Pages is exactly what it sounds like---just an open space for your thoughts, notes, and something more intentful.With Pages, you can now start jotting down meeting notes, create docs for issues, and format for presentation. You see a table of contents on the right when you use headings and you can lock the page so it’s not accidentally editable.How to get to PagesEasy. Just find pages under any project on the left nav of your Plane workspace, click Create page, give your new page a cool name, like I have for this page, and start clacking away.No flipping screens, no copy-pasting from anywhere else, no additional hoops.Like I said \"Easy\"What can I do with Pages ?Anything you want to write, you can write on Pages.Want to format something a quote? Easy.How about a to-do list ?How about another Item on the list ? How about I stop being stupid ? Bullets ? Yep. Netsted bullets ? We got you. Even more nesting in bullets? Sure.And Tab or Shift + Tab work, too.Ah, yes, there’s numbered lists, too. And they align nicely so you don’t have to battle with the screen.There's code snippets that can go as long or as short as you want and \ninclude API docs you want to reference. You can even copy code from \nsomewhere and paste it inside Plane to have it show up like this.There is a table tooYou can also color rowsdifferent from columnsOr color columns differentLet's upload an image and make this line a heading 3.Yep. Genius.Life is already great with Plane. but it gets a little better with Pages, right?Give it a spin, tell us we were right... Or wrong. We will work to make Pages work for you.", - "description_html": "

Bye, bye, Notion, Google Docs, Evernote, Keep, and Apple Notes. Plane Pages are here!

What is Pages?

Pages is exactly what it sounds like---just an open space for your thoughts, notes, and something more intentful.

With Pages, you can now start jotting down meeting notes, create docs for issues, and format for presentation. You see a table of contents on the right when you use headings and you can lock the page so it’s not accidentally editable.

How to get to Pages

Easy. Just find pages under any project on the left nav of your Plane workspace, click Create page, give your new page a cool name, like I have for this page, and start clacking away.No flipping screens, no copy-pasting from anywhere else, no additional hoops.

Like I said \"Easy\"

What can I do with Pages ?

Anything you want to write, you can write on Pages.

Want to format something a quote?
Easy.

  1. Ah, yes, there’s numbered lists, too.

  2. And they align nicely so you don’t have to battle with the screen.

There's code snippets that can go as long or as short as you want and \ninclude API docs you want to reference. You can even copy code from \nsomewhere and paste it inside Plane to have it show up like this.

There is a table too

You can also color rows
different from columns

Or color columns different

Let's upload an image and make this line a heading 3.

Yep. Genius.

Life is already great with Plane. but it gets a little better with Pages, right?

Give it a spin, tell us we were right... Or wrong. We will work to make Pages work for you.

", - "description": "{\"type\": \"doc\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Bye, bye, Notion, Google Docs, Evernote, Keep, and Apple Notes. Plane Pages are here!\", \"type\": \"text\"}]}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"text\": \"What is Pages?\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Pages is exactly what it sounds like---just an open space for your thoughts, notes, and something more intentful.\", \"type\": \"text\", \"marks\": [{\"type\": \"customColor\", \"attrs\": {\"color\": null, \"backgroundColor\": null}}]}, {\"type\": \"hardBreak\"}, {\"type\": \"hardBreak\"}, {\"text\": \"With Pages, you can now start jotting down meeting notes, create docs for issues, and format for presentation. You see a table of contents on the right when you use headings and you can lock the page so it’s not accidentally editable.\", \"type\": \"text\", \"marks\": [{\"type\": \"customColor\", \"attrs\": {\"color\": null, \"backgroundColor\": null}}]}]}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"text\": \"How to get to Pages\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Easy. Just find pages under any project on the left nav of your Plane workspace, click Create page, give your new page a cool name, like I have for this page, and start clacking away.No flipping screens, no copy-pasting from anywhere else, no additional hoops.\", \"type\": \"text\", \"marks\": [{\"type\": \"customColor\", \"attrs\": {\"color\": null, \"backgroundColor\": null}}]}]}, {\"type\": \"blockquote\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Like I said \\\"Easy\\\"\", \"type\": \"text\"}]}]}, {\"type\": \"heading\", \"attrs\": {\"level\": 3, \"textAlign\": null}, \"content\": [{\"text\": \"What can I do with Pages ?\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Anything you want to write, you can write on Pages.\", \"type\": \"text\"}]}, {\"type\": \"blockquote\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Want to format something a quote? \", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}, {\"type\": \"customColor\", \"attrs\": {\"color\": null, \"backgroundColor\": null}}]}, {\"type\": \"hardBreak\"}, {\"text\": \"Easy.\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}, {\"type\": \"customColor\", \"attrs\": {\"color\": null, \"backgroundColor\": null}}]}]}]}, {\"type\": \"taskList\", \"content\": [{\"type\": \"taskItem\", \"attrs\": {\"checked\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"How about a to-do list ?\", \"type\": \"text\"}]}]}, {\"type\": \"taskItem\", \"attrs\": {\"checked\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"How about another Item on the list ? \", \"type\": \"text\"}]}]}, {\"type\": \"taskItem\", \"attrs\": {\"checked\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"How about I stop being stupid ? \", \"type\": \"text\"}]}]}]}, {\"type\": \"bulletList\", \"content\": [{\"type\": \"listItem\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Bullets ? Yep. \", \"type\": \"text\"}]}, {\"type\": \"bulletList\", \"content\": [{\"type\": \"listItem\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Netsted bullets ? We got you. \", \"type\": \"text\"}]}, {\"type\": \"bulletList\", \"content\": [{\"type\": \"listItem\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Even more nesting in bullets? Sure.\", \"type\": \"text\"}]}]}]}]}]}]}, {\"type\": \"listItem\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"And Tab or Shift + Tab work, too.\", \"type\": \"text\"}]}]}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}}, {\"type\": \"orderedList\", \"attrs\": {\"type\": null, \"start\": 1}, \"content\": [{\"type\": \"listItem\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Ah, yes, there’s numbered lists, too. \", \"type\": \"text\", \"marks\": [{\"type\": \"customColor\", \"attrs\": {\"color\": null, \"backgroundColor\": null}}]}]}]}, {\"type\": \"listItem\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"And they align nicely so you don’t have to battle with the screen.\", \"type\": \"text\", \"marks\": [{\"type\": \"customColor\", \"attrs\": {\"color\": null, \"backgroundColor\": null}}]}]}]}]}, {\"type\": \"codeBlock\", \"attrs\": {\"language\": null}, \"content\": [{\"text\": \"There's code snippets that can go as long or as short as you want and \\ninclude API docs you want to reference. You can even copy code from \\nsomewhere and paste it inside Plane to have it show up like this.\", \"type\": \"text\"}]}, {\"type\": \"table\", \"content\": [{\"type\": \"tableRow\", \"attrs\": {\"textColor\": \"#171717\", \"background\": \"#D9E4FF\"}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [238], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"There is a table too\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [196], \"textColor\": \"#171717\", \"background\": \"#DCFCE7\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [285], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": \"#171717\", \"background\": \"#FEF3C7\"}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [238], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"You can also color rows\", \"type\": \"text\"}, {\"type\": \"hardBreak\"}, {\"text\": \"different from columns\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [196], \"textColor\": \"#171717\", \"background\": \"#DCFCE7\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [285], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [238], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [196], \"textColor\": \"#171717\", \"background\": \"#DCFCE7\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Or color columns different\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [285], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}}]}]}]}, {\"type\": \"heading\", \"attrs\": {\"level\": 3, \"textAlign\": null}, \"content\": [{\"text\": \"Let's upload an image and make this line a heading 3.\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Yep. Genius.\", \"type\": \"text\"}]}, {\"type\": \"horizontalRule\"}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Life is already great with Plane. but it gets a little better with Pages, right?\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Give it a spin, tell us we were right... Or wrong. We will work to make Pages work for you.\", \"type\": \"text\"}]}]}", - "type": "PROJECT" + "description_html": "

Welcome to your Project Pages — the documentation hub for this specific project.
Each project in Plane can have its own Wiki space where you track plans, specs, updates, and learnings — all connected to your issues and modules.

🧭 Project Summary

Field

Details

Project Name

Add your project name

Owner

Add project owner(s)

Status

🟢 Active / 🟡 In Progress / 🔴 Blocked

Start Date

Target Release

Linked Modules

Engineering, Security

Cycle(s)

Cycle 1, Cycle 2

🧩 Use tables to summarize key project metadata or links.

🎯 Goals & Objectives

🎯 Primary Goals

Success Metrics

Metric

Target

Owner

User adoption

100 active users

Growth

Performance

< 200ms latency

Backend

Design feedback

≥ 8/10 average rating

Design

📈 Define measurable outcomes and track progress alongside issues.

🧩 Scope & Deliverables

Deliverable

Owner

Status

Authentication flow

Backend

Done

Issue board UI

Frontend

🏗 In Progress

API integration

Backend

Pending

Documentation

PM

📝 Drafting

🧩 Use tables or checklists to track scope and ownership.

🧱 Architecture or System Design

Use this section for technical deep dives or diagrams.

Frontend → GraphQL → Backend → PostgreSQL\nRedis for caching | RabbitMQ for background jobs

", + "description": "{\"type\": \"doc\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Welcome to your \", \"type\": \"text\"}, {\"text\": \"Project Pages\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}, {\"text\": \" — the documentation hub for this specific project.\", \"type\": \"text\"}, {\"type\": \"hardBreak\"}, {\"text\": \"Each project in Plane can have its own Wiki space where you track \", \"type\": \"text\"}, {\"text\": \"plans, specs, updates, and learnings\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}, {\"text\": \" — all connected to your issues and modules.\", \"type\": \"text\"}]}, {\"type\": \"horizontalRule\"}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"compass\"}}, {\"text\": \" Project Summary\", \"type\": \"text\"}]}, {\"type\": \"table\", \"content\": [{\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Field\", \"type\": \"text\"}]}]}, {\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Details\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Project Name\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"pencil\"}}, {\"text\": \" Add your project name\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Owner\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Add project owner(s)\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Status\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"green_circle\"}}, {\"text\": \" Active / \", \"type\": \"text\"}, {\"type\": \"emoji\", \"attrs\": {\"name\": \"yellow_circle\"}}, {\"text\": \" In Progress / \", \"type\": \"text\"}, {\"type\": \"emoji\", \"attrs\": {\"name\": \"red_circle\"}}, {\"text\": \" Blocked\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Start Date\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"—\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Target Release\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"—\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Linked Modules\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Engineering, Security\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Cycle(s)\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Cycle 1, Cycle 2\", \"type\": \"text\"}]}]}]}]}, {\"type\": \"blockquote\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"jigsaw\"}}, {\"text\": \" Use tables to summarize key project metadata or links.\", \"type\": \"text\"}]}]}, {\"type\": \"horizontalRule\"}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"bullseye\"}}, {\"text\": \" Goals & Objectives\", \"type\": \"text\"}]}, {\"type\": \"heading\", \"attrs\": {\"level\": 3, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"bullseye\"}}, {\"text\": \" Primary Goals\", \"type\": \"text\"}]}, {\"type\": \"bulletList\", \"content\": [{\"type\": \"listItem\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Deliver MVP with all core features\", \"type\": \"text\"}]}]}, {\"type\": \"listItem\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Validate feature adoption with early users\", \"type\": \"text\"}]}]}, {\"type\": \"listItem\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Prepare launch plan for v1 release\", \"type\": \"text\"}]}]}]}, {\"type\": \"heading\", \"attrs\": {\"level\": 3, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"gear\"}}, {\"text\": \" Success Metrics\", \"type\": \"text\"}]}, {\"type\": \"table\", \"content\": [{\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Metric\", \"type\": \"text\"}]}]}, {\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Target\", \"type\": \"text\"}]}]}, {\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Owner\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"User adoption\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"100 active users\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Growth\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Performance\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"< 200ms latency\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Backend\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Design feedback\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"≥ 8/10 average rating\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Design\", \"type\": \"text\"}]}]}]}]}, {\"type\": \"blockquote\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"chart_increasing\"}}, {\"text\": \" Define measurable outcomes and track progress alongside issues.\", \"type\": \"text\"}]}]}, {\"type\": \"horizontalRule\"}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"jigsaw\"}}, {\"text\": \" Scope & Deliverables\", \"type\": \"text\"}]}, {\"type\": \"table\", \"content\": [{\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Deliverable\", \"type\": \"text\"}]}]}, {\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Owner\", \"type\": \"text\"}]}]}, {\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Status\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Authentication flow\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Backend\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"check_mark_button\"}}, {\"text\": \" Done\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Issue board UI\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Frontend\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"building_construction\"}}, {\"text\": \" In Progress\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"API integration\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Backend\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"hourglass_flowing_sand\"}}, {\"text\": \" Pending\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Documentation\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"PM\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"memo\"}}, {\"text\": \" Drafting\", \"type\": \"text\"}]}]}]}]}, {\"type\": \"blockquote\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"jigsaw\"}}, {\"text\": \" Use tables or checklists to track scope and ownership.\", \"type\": \"text\"}]}]}, {\"type\": \"horizontalRule\"}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"bricks\"}}, {\"text\": \" Architecture or System Design\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Use this section for \", \"type\": \"text\"}, {\"text\": \"technical deep dives\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}, {\"text\": \" or diagrams.\", \"type\": \"text\"}]}, {\"type\": \"codeBlock\", \"attrs\": {\"language\": \"bash\"}, \"content\": [{\"text\": \"Frontend → GraphQL → Backend → PostgreSQL\\nRedis for caching | RabbitMQ for background jobs\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}}]}", + "description_stripped": "Welcome to your Project Pages — the documentation hub for this specific project.Each project in Plane can have its own Wiki space where you track plans, specs, updates, and learnings — all connected to your issues and modules.🧭 Project SummaryFieldDetailsProject Name✏ Add your project nameOwnerAdd project owner(s)Status🟢 Active / 🟡 In Progress / 🔴 BlockedStart Date—Target Release—Linked ModulesEngineering, SecurityCycle(s)Cycle 1, Cycle 2🧩 Use tables to summarize key project metadata or links.🎯 Goals & Objectives🎯 Primary GoalsDeliver MVP with all core featuresValidate feature adoption with early usersPrepare launch plan for v1 release⚙ Success MetricsMetricTargetOwnerUser adoption100 active usersGrowthPerformance< 200ms latencyBackendDesign feedback≥ 8/10 average ratingDesign📈 Define measurable outcomes and track progress alongside issues.🧩 Scope & DeliverablesDeliverableOwnerStatusAuthentication flowBackend✅ DoneIssue board UIFrontend🏗 In ProgressAPI integrationBackend⏳ PendingDocumentationPM📝 Drafting🧩 Use tables or checklists to track scope and ownership.🧱 Architecture or System DesignUse this section for technical deep dives or diagrams.Frontend → GraphQL → Backend → PostgreSQL\nRedis for caching | RabbitMQ for background jobs", + "type": "PROJECT", + "access": 0, + "logo_props": { + "emoji": { + "url": "https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/1f680.png", + "value": "128640" + }, + "in_use": "emoji" + } + }, + { + "id": 2, + "name": "Project Draft proposal", + "project_id": 1, + "description": "{\"type\": \"doc\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"This is your \", \"type\": \"text\"}, {\"text\": \"Project Draft area\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}, {\"text\": \" — a private space inside the project where you can experiment, outline ideas, or prepare content before sharing it on the public Project Page.\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"It’s visible only to you (and collaborators you explicitly share with).\", \"type\": \"text\"}]}, {\"type\": \"horizontalRule\"}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"writing_hand\"}}, {\"text\": \" Current Work in Progress\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}}, {\"type\": \"blockquote\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"speech_balloon\"}}, {\"text\": \" Use this section to jot down raw ideas, rough notes, or specs that aren’t ready yet.\", \"type\": \"text\"}]}]}, {\"type\": \"taskList\", \"content\": [{\"type\": \"taskItem\", \"attrs\": {\"checked\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \" Outline project summary and goals\", \"type\": \"text\"}]}]}, {\"type\": \"taskItem\", \"attrs\": {\"checked\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \" Draft new feature spec\", \"type\": \"text\"}]}]}, {\"type\": \"taskItem\", \"attrs\": {\"checked\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \" Review dependency list\", \"type\": \"text\"}]}]}, {\"type\": \"taskItem\", \"attrs\": {\"checked\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \" Collect team feedback for next iteration\", \"type\": \"text\"}]}]}]}, {\"type\": \"blockquote\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"check_mark_button\"}}, {\"text\": \" Tip: Turn these items into actionable issues when finalized.\", \"type\": \"text\"}]}]}, {\"type\": \"horizontalRule\"}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"bricks\"}}, {\"text\": \" Prototype Commands (if technical)\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"You can also use \", \"type\": \"text\"}, {\"text\": \"code blocks\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}, {\"text\": \" to store snippets, scripts, or notes:\", \"type\": \"text\"}]}, {\"type\": \"codeBlock\", \"attrs\": {\"language\": \"bash\"}, \"content\": [{\"text\": \"# Rebuild Docker containers\\ndocker compose build backend frontend\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}}]}", + "description_html": "

This is your Project Draft area — a private space inside the project where you can experiment, outline ideas, or prepare content before sharing it on the public Project Page.

It’s visible only to you (and collaborators you explicitly share with).

Current Work in Progress

💬 Use this section to jot down raw ideas, rough notes, or specs that aren’t ready yet.

Tip: Turn these items into actionable issues when finalized.

🧱 Prototype Commands (if technical)

You can also use code blocks to store snippets, scripts, or notes:

# Rebuild Docker containers\ndocker compose build backend frontend

", + "description_stripped": "This is your Project Draft area — a private space inside the project where you can experiment, outline ideas, or prepare content before sharing it on the public Project Page.It’s visible only to you (and collaborators you explicitly share with).✍ Current Work in Progress💬 Use this section to jot down raw ideas, rough notes, or specs that aren’t ready yet. Outline project summary and goals Draft new feature spec Review dependency list Collect team feedback for next iteration✅ Tip: Turn these items into actionable issues when finalized.🧱 Prototype Commands (if technical)You can also use code blocks to store snippets, scripts, or notes:# Rebuild Docker containers\ndocker compose build backend frontend", + "type": "PROJECT", + "access": 1, + "logo_props": "{\"emoji\": {\"url\": \"https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/1f9f1.png\", \"value\": \"129521\"}, \"in_use\": \"emoji\"}" } ] \ No newline at end of file diff --git a/apps/api/plane/seeds/data/views.json b/apps/api/plane/seeds/data/views.json new file mode 100644 index 0000000000..f9d182324f --- /dev/null +++ b/apps/api/plane/seeds/data/views.json @@ -0,0 +1,14 @@ +[ + { + "id": 1, + "name": "Project Urgent Tasks", + "description": "Project Urgent Tasks", + "access": 1, + "filters": {}, + "project_id": 1, + "display_filters": {"layout": "list", "calendar": {"layout": "month", "show_weekends": false}, "group_by": "state", "order_by": "sort_order", "sub_issue": false, "sub_group_by": null, "show_empty_groups": false}, + "display_properties": {"key": true, "link": true, "cycle": true, "state": true, "labels": true, "modules": true, "assignee": true, "due_date": true, "estimate": true, "priority": true, "created_on": true, "issue_type": true, "start_date": true, "updated_on": true, "customer_count": true, "sub_issue_count": true, "attachment_count": true, "customer_request_count": true}, + "sort_order": 75535, + "rich_filters": {"priority__in": "urgent"} + } +] \ No newline at end of file