Repository: PrefectHQ/prefect
Pull request: Add OSS to the quickstart
The quickstart is cloud-centric. Because OSS is a popular path for first-time users, let's update the quickstart to give people the option of whether they want to go down the cloud or OSS path.

Closes https://github.com/PrefectHQ/prefect/issues/14029

This PR also converts the quickstart to [ventilated prose](https://writetheasciidocs.netlify.app/ventilated-prose) to make future edits easier to review.

### Example

Instead of creating separate quickstarts for cloud and OSS, let's add tabs to the existing quickstart to let people easily toggle between these paths. This approach doesn't require users to know in advance which path they want to go down, and it makes it easy to compare equivalent cloud and OSS code.

```
<Tabs>
  <Tab title="Cloud">
Cloud instructions
  </Tab>
  <Tab title="OSS">
OSS instructions
  </Tab>
</Tabs>
```

### Checklist

- [X] This pull request includes a label categorizing the change e.g. `maintenance`, `fix`, `feature`, `enhancement`, `docs`.
- [X] This pull request references any related issue by including "closes `<link to issue>`"
- [ ] ~If this pull request adds new functionality, it includes unit tests that cover the changes~
- [ ] ~If this pull request removes docs files, it includes redirect settings in `mint.json`.~
- [ ] ~If this pull request adds functions or classes, it includes helpful docstrings.~

### Preview

https://prefect-bd373955-add_oss_to_the_quickstart.mintlify.app/3.0rc/get-started/quickstart

Problem statement:
Update the Quickstart to reflect OSS options
### First check

- [X] I added a descriptive title to this issue.
- [X] I used GitHub search to find a similar request and didn't find it 😇

### Describe the issue

The quickstart in the 3.0 docs is currently aimed only at Prefect Cloud. 

### Describe the proposed change

We should update the Quick start section to add an OSS version with commands such as `prefect server start`. 
As a follow up, we should ensure that the UI quick start matches the docs. 

### Additional context

_No response_

Hints from issue discussion:
Working on this in a branch: https://github.com/PrefectHQ/prefect/tree/add_oss_to_the_quickstart

Commit message: Merge branch 'main' into add_oss_to_the_quickstart

Patch to review:
diff --git a/docs/3.0rc/get-started/quickstart.mdx b/docs/3.0rc/get-started/quickstart.mdx
index 93ab4a34d153..6be69f18a4b0 100644
--- a/docs/3.0rc/get-started/quickstart.mdx
+++ b/docs/3.0rc/get-started/quickstart.mdx
@@ -3,18 +3,16 @@ title: Quickstart
 description: Get started with Prefect, the easiest way to orchestrate and observe your data pipelines
 ---
 
-Prefect is an orchestration and observability platform that empowers developers to build and scale code quickly, turning Python scripts into resilient, recurring workflows. Take a Python script to a production-ready, remotely executable workflow in minutes.
+Prefect is an orchestration and observability platform that empowers developers to build and scale code quickly, turning Python scripts into resilient, recurring workflows.
+Take a Python script to a production-ready, remotely executable workflow in minutes.
 
-In this quickstart, you'll schedule your code on remote infrastructure and observe the state of your workflows.
-
-## Example
-
-This basic script fetches statistics about the [main Prefect GitHub repository](https://github.com/PrefectHQ/prefect).
+In this quickstart, you will use Prefect to convert the following Python script to a schedulable, observable, resilient, and deployable workflow.
 
 ```python
 import httpx
 
 def get_repo_info():
+    """Fetch statistics about https://github.com/PrefectHQ/prefect"""
     url = "https://api.github.com/repos/PrefectHQ/prefect"
     response = httpx.get(url)
     repo = response.json()
@@ -25,47 +23,63 @@ if __name__ == "__main__":
     get_repo_info()
 ```
 
-The following steps convert this script to a schedulable, observable, resilient, and deployable workflow.
-
 ## Install Prefect
 
+Install the Prefect client.
+If needed, see [Install Prefect](/3.0rc/get-started/install/) for other options.
+
 ```bash
-pip install -U prefect==3.0.0rc2"
+pip install -U prefect==3.0.0rc2
 ```
 
-See the [install guide](/3.0rc/get-started/install/) for more detailed installation instructions, if needed.
-
 ## Connect to Prefect's API
 
-Much of Prefect's functionality is backed by a hosted API. The fastest and simplest solution is a Prefect-hosted API:
+Connect to the Prefect API on Cloud or spin up a local API server:
 
+<Tabs>
+  <Tab title="Cloud">
 1. Head to [https://app.prefect.cloud/](https://app.prefect.cloud/) and sign in or create a forever-free Prefect Cloud account.
-1. Use the `prefect cloud login` CLI command to log in to Prefect Cloud from your development environment.
+1. Log in to Prefect Cloud from your development environment.
 
-```bash
-prefect cloud login
-```
+   ```bash
+   prefect cloud login
+   ```
+
+1. Choose **Log in with a web browser** and click the **Authorize** button in the browser window that opens.
 
-Choose **Log in with a web browser** and click the **Authorize** button in the browser window that opens.
 Your CLI is now authenticated with your Prefect Cloud account through a locally-stored API key that expires in 30 days.
 
 If you have any issues with browser-based authentication, see the [Prefect Cloud docs](/3.0rc/manage/cloud/manage-users/api-keys/) to learn how to authenticate with a manually created API key.
+  </Tab>
+  <Tab title="OSS">
+1. Ensure your current profile hasn't logged into Prefect Cloud:
 
-<Note>
-If you would like to run a Prefect server instance on your own infrastructure, see the [Host a Prefect server instance](/3.0rc/manage/self-host/) docs.
-Note that you need to both host your own server and run flows on your own infrastructure.
-</Note>
+   ```bash
+   prefect cloud logout
+   ```
 
-## Convert your function to a Prefect flow
+1. Start a local API server:
 
-The easiest way convert a Python function into a workflow is to add a `@flow` decorator.
+   ```bash
+   prefect server start
+   ```
+
+1. Open the Prefect dashboard in your browser at [http://localhost:4200](http://localhost:4200).
+  </Tab>
+</Tabs>
+
+## Convert your script to a Prefect flow
+
+The easiest way to convert a Python script into a workflow is to add a `@flow` decorator.
 [Flows](/3.0rc/develop/write-flows/) are the core observable, deployable units in Prefect and are the primary entrypoint to orchestrated work.
 
+Convert the script into a flow with two tasks, each defined by the `@task` decorator.
+Tasks are the smallest unit of observed and orchestrated work in Prefect.
+
 ```python my_gh_workflow.py
 import httpx   # an HTTP client library and dependency of Prefect
 from prefect import flow, task
 
-
 @task(retries=2)
 def get_repo_info(repo_owner: str, repo_name: str):
     """Get info about a repo - will retry twice after failing"""
@@ -75,7 +89,6 @@ def get_repo_info(repo_owner: str, repo_name: str):
     repo_info = api_response.json()
     return repo_info
 
-
 @task
 def get_contributors(repo_info: dict):
     """Get contributors for a repo"""
@@ -85,7 +98,6 @@ def get_contributors(repo_info: dict):
     contributors = response.json()
     return contributors
 
-
 @flow(log_prints=True)
 def repo_info(repo_owner: str = "PrefectHQ", repo_name: str = "prefect"):
     """
@@ -98,16 +110,17 @@ def repo_info(repo_owner: str = "PrefectHQ", repo_name: str = "prefect"):
     contributors = get_contributors(repo_info)
     print(f"Number of contributors 👷: {len(contributors)}")
 
-
 if __name__ == "__main__":
     repo_info()
 ```
 
+<Note>
 The `log_prints=True` argument provided to the `@flow` decorator logs output from `print` statements within the function.
+</Note>
 
-The flow calls two tasks, defined by the `@task` decorator. Tasks are the smallest unit of observed and orchestrated work in Prefect.
+## Run your flow
 
-Run the script:
+Run your Prefect flow.
 
 ```bash
 python my_gh_workflow.py
@@ -129,101 +142,120 @@ Prefect automatically tracks the state of the flow run and logs the output in th
 14:28:33.255 | INFO    | Flow run 'energetic-panther' - Finished in state Completed('All states completed.')
 ```
 
-## Deploy on a remote infrastructure
+## Create a work pool
 
-Running a flow locally is a good start, but a remote destination is used for production. Tell Prefect where to run the workflow by creating a [work pool](/3.0rc/deploy/work-pools/control-runs/).
+Running a flow locally is a good start, but you should use a remote destination for production flows.
+A [work pool](/3.0rc/deploy/work-pools/control-runs/) is the most common way to do this.
 
-Prefect Cloud can run the flow code using a [Prefect Managed work pool](/3.0rc/deploy/serve-flows/index). You can create a work pool in the UI or from the CLI.
+<Tabs>
+  <Tab title="Cloud">
+Deploy your flow to Cloud using a managed work pool.
 
-```bash
-prefect work-pool create my-managed-pool --type prefect:managed
-```
+1. Create a [managed work pool](/3.0rc/deploy/serve-flows/index):
 
-You'll see the work pool created by the CLI. You can also view your new work pool on the **Work Pools** page of the UI.
+   ```bash
+   prefect work-pool create my-work-pool --type prefect:managed
+   ```
 
-## Make your code schedulable
+1. View your new work pool on the **Work Pools** page of the UI.
+  </Tab>
+  <Tab title="OSS">
+Deploy your flow to your local server using a Docker type work pool.
 
-The final step is to deploy your flow so it can run remotely on a schedule. 
+1. Install Docker on your machine.
+1. Create a Docker type work pool:
 
-A [deployment](/3.0rc/deploy/serve-flows/) schedules a flow function to run in your work pool. Deployments elevate flows to remotely configurable entities that have their own API.
+   ```bash
+   prefect work-pool create --type docker my-work-pool
+   ```
 
-This next script builds a deployment, identifying:
+1. Verify that the work pool exists:
 
-- Source for the code to deploy (here, a GitHub repo)
-- Specific flow to run (`my_gh_workflow.py:repo_info`)
-- Work pool target (`my-managed-pool`)
-- Cron schedule (1am every day)
+   ```bash
+   prefect work-pool ls
+   ```
 
-<Info>
-This example uses Prefect's own GitHub repo. To test with your own code, push your script to your GitHub account and update the `source` argument accordingly.
-</Info>
+1. Start a worker in the work pool:
 
-```bash create_deployment.py
-from prefect import flow
-
-if __name__ == "__main__":
-    flow.from_source(
-        source="https://github.com/prefecthq/demos.git",
-        entrypoint="my_gh_workflow.py:repo_info",
-    ).deploy(
-        name="my-first-deployment",
-        work_pool_name="my-managed-pool",
-        cron="0 1 * * *",
-    )
-```
+   ```bash
+   prefect worker start --pool my-work-pool
+   ```
 
 <Tip>
-You can store your flow code in nearly any location as long as Prefect can access it. This example uses a GitHub repository, but you could bake your code into a Docker image or store it in cloud provider storage. Read [Where to store your flow code](/3.0rc/deploy/dynamic-infra/retrieve-flow-code) for details.
+You can also choose from other [work pool types](https://docs.prefect.io/concepts/work-pools/#worker-types).
 </Tip>
+  </Tab>
+</Tabs>
 
-Run the script to create the deployment on the Prefect Cloud server.
+## Deploy and schedule your flow
 
-```bash
-python create_deployment.py
-```
+A [deployment](/3.0rc/deploy/serve-flows/) is used to determine when, where, and how a flow function should run.
+Deployments elevate flows to remotely configurable entities that have their own API.
 
-You see a message that your deployment was created:
+1. Create a deployment script:
 
-```bash
-Successfully created/updated all deployments!
-______________________________________________________
-|                    Deployments                     |  
-______________________________________________________
-|    Name                       |  Status  | Details |
-______________________________________________________
-| repo-info/my-first-deployment | applied  |         |
-______________________________________________________
-```
+   ```bash create_deployment.py
+   from prefect import flow
 
-The previous command creates the deployment in Prefect, without starting it. To schedule a run for the deployment, use:
+   # Source for the code to deploy (here, a GitHub repo)
+   SOURCE_REPO="https://github.com/prefecthq/demos.git"
 
-```bash
-prefect deployment run 'repo-info/my-first-deployment'
-```
+   if __name__ == "__main__":
+       flow.from_source(
+           source=SOURCE_REPO,
+           entrypoint="my_gh_workflow.py:repo_info", # Specific flow to run
+       ).deploy(
+           name="my-first-deployment",
+           work_pool_name="my-work-pool", # Work pool target
+           cron="0 1 * * *", # Cron schedule (1am every day)
+       )
+   ```
+
+   <Tip>
+   You can store your flow code in nearly any location as long as Prefect can access it.
+   See [Where to store your flow code](/3.0rc/deploy/dynamic-infra/retrieve-flow-code) for more details.
+   </Tip>
+
+1. Run the script to create the deployment:
+
+   ```bash
+   python create_deployment.py
+   ```
 
-You can also run your flow via the Prefect UI on the **Deployments** page.
+   Check the logs to ensure your deployment was created:
 
-The deployment is configured to run on a Prefect Managed work pool, so Prefect automatically spins up the infrastructure to run the flow. 
+   ```bash
+   Successfully created/updated all deployments!
+   ______________________________________________________
+   |                    Deployments                     |  
+   ______________________________________________________
+   |    Name                       |  Status  | Details |
+   ______________________________________________________
+   | repo-info/my-first-deployment | applied  |         |
+   ______________________________________________________
+   ```
 
-After a minute or so, you should see the flow run graph and logs on the Flow Run page in the UI.
+1. Schedule a run for the deployment:
 
-![Managed flow run graph and logs](/3.0rc/img/ui/qs-flow-run.png)
+   ```bash
+   prefect deployment run 'repo-info/my-first-deployment'
+   ```
 
-<Warning>
-    After testing this process, click the **Remove** button in the top right of the **Deployment** page so that the workflow is no longer scheduled to run once per day.
-</Warning>
+   After a minute or so, you should see the flow run graph and logs on the Flow Run page in the UI.
+
+   ![Flow run graph and logs](/3.0rc/img/ui/qs-flow-run.png)
+
+1. When you're done, click the **More** > **Delete** button on the **Deployments** page to stop further scheduled runs.
 
 ## Next steps
 
-You've seen how to move from a Python script to a scheduled, observable, remotely orchestrated workflow with Prefect. Now considering reading: 
+You've seen how to move from a Python script to a scheduled, observable, remotely orchestrated workflow with Prefect.
+Now considering reading: 
 
 * [Write flows](/3.0rc/develop/write-flows/index)
 * [Write tasks](/3.0rc/develop/write-tasks/index)
 * [Self-host](/3.0rc/manage/self-host) your Prefect server
 
-
 <Tip>
-**Need help?**
-
-Get your questions answered by a Prefect Product Advocate! [Book a meeting](https://calendly.com/prefect-experts/prefect-product-advocates?utm_campaign=prefect_docs_cloud&utm_content=prefect_docs&utm_medium=docs&utm_source=docs)
+[Book a meeting](https://calendly.com/prefect-experts/prefect-product-advocates?utm_campaign=prefect_docs_cloud&utm_content=prefect_docs&utm_medium=docs&utm_source=docs) with a Prefect Product Advocate to get your questions answered.
 </Tip>


Code review comments:
diff_hunk: @@ -25,47 +23,63 @@ if __name__ == "__main__":
     get_repo_info()
 ```
 
-The following steps convert this script to a schedulable, observable, resilient, and deployable workflow.
-
 ## Install Prefect
 
+Install the Prefect client.
+If needed, see [Install Prefect](/3.0rc/get-started/install/) for other options.
+
 ```bash
-pip install -U prefect==3.0.0rc2"
+pip install -U prefect==3.0.0rc2
path: docs/3.0rc/get-started/quickstart.mdx
text: @user1:
```suggestion
pip install -U prefect==3.0.0rc3
```

@user1:
Got a PR open for this little change, so will avoid a conflict if it merges.

diff_hunk: @@ -129,101 +142,120 @@ Prefect automatically tracks the state of the flow run and logs the output in th
 14:28:33.255 | INFO    | Flow run 'energetic-panther' - Finished in state Completed('All states completed.')
 ```
 
-## Deploy on a remote infrastructure
+## Create a work pool
 
-Running a flow locally is a good start, but a remote destination is used for production. Tell Prefect where to run the workflow by creating a [work pool](/3.0rc/deploy/work-pools/control-runs/).
+Running a flow locally is a good start, but you should use a remote destination for production flows.
+A [work pool](/3.0rc/deploy/work-pools/control-runs/) is the most common way to do this.
 
-Prefect Cloud can run the flow code using a [Prefect Managed work pool](/3.0rc/deploy/serve-flows/index). You can create a work pool in the UI or from the CLI.
+<Tabs>
+  <Tab title="Cloud">
path: docs/3.0rc/get-started/quickstart.mdx
text: @user1:
Do we want suggest a Process type work pool for Cloud and OSS? Then they would be the same setup and both expose folks to workers. Docker also introduces come more install and complexity that we may want to avoid for the quickstart.

@author:
Sounds good to me! I was unaware that this was an option.

@author:
@user1 I went ahead and replaced the Docker type work pool with a Process type work pool.

However, for Cloud, I left the managed work pool in place, since I think we want to emphasize that option for the people who are able to use it. cc @user2

diff_hunk: @@ -25,47 +23,63 @@ if __name__ == "__main__":
     get_repo_info()
 ```
 
-The following steps convert this script to a schedulable, observable, resilient, and deployable workflow.
-
 ## Install Prefect
 
+Install the Prefect client.
+If needed, see [Install Prefect](/3.0rc/get-started/install/) for other options.
+
 ```bash
-pip install -U prefect==3.0.0rc2"
+pip install -U prefect==3.0.0rc2
 ```
 
-See the [install guide](/3.0rc/get-started/install/) for more detailed installation instructions, if needed.
-
 ## Connect to Prefect's API
 
-Much of Prefect's functionality is backed by a hosted API. The fastest and simplest solution is a Prefect-hosted API:
+Connect to the Prefect API on Cloud or spin up a local API server:
 
+<Tabs>
+  <Tab title="Cloud">
 1. Head to [https://app.prefect.cloud/](https://app.prefect.cloud/) and sign in or create a forever-free Prefect Cloud account.
-1. Use the `prefect cloud login` CLI command to log in to Prefect Cloud from your development environment.
+1. Log in to Prefect Cloud from your development environment.
 
-```bash
-prefect cloud login
-```
+   ```bash
+   prefect cloud login
+   ```
+
+1. Choose **Log in with a web browser** and click the **Authorize** button in the browser window that opens.
 
-Choose **Log in with a web browser** and click the **Authorize** button in the browser window that opens.
 Your CLI is now authenticated with your Prefect Cloud account through a locally-stored API key that expires in 30 days.
 
 If you have any issues with browser-based authentication, see the [Prefect Cloud docs](/3.0rc/manage/cloud/manage-users/api-keys/) to learn how to authenticate with a manually created API key.
+  </Tab>
+  <Tab title="OSS">
+1. Ensure your current profile hasn't logged into Prefect Cloud:
path: docs/3.0rc/get-started/quickstart.mdx
text: @user1:
```suggestion
1. Ensure your current profile isn't authenticated to Prefect Cloud:
```