Rudert commited on
Commit
2bc5603
·
verified ·
1 Parent(s): ce1f0d3

Upload 9 files

Browse files
Files changed (9) hide show
  1. .gitignore +77 -0
  2. CONTRIBUTING.md +158 -0
  3. LICENCE +21 -0
  4. README.md +135 -10
  5. backend.log +1 -0
  6. config.ts +9 -0
  7. frontend.log +1 -0
  8. start.ps1 +27 -0
  9. start.sh +22 -0
.gitignore ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # dependencies (bun install)
2
+ node_modules
3
+
4
+ # output
5
+ out
6
+ dist
7
+ *.tgz
8
+
9
+ # code coverage
10
+ coverage
11
+ *.lcov
12
+
13
+ # logs
14
+ logs
15
+ _.log
16
+ report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json
17
+
18
+ # dotenv environment variable files
19
+ .env
20
+ .env.development.local
21
+ .env.test.local
22
+ .env.production.local
23
+ .env.local
24
+
25
+ # caches
26
+ .eslintcache
27
+ .cache
28
+ *.tsbuildinfo
29
+
30
+ # IntelliJ based IDEs
31
+ .idea
32
+
33
+ # Finder (MacOS) folder config
34
+ .DS_Store
35
+
36
+ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
37
+
38
+ # dependencies
39
+ /node_modules
40
+ /.pnp
41
+ .pnp.*
42
+ .yarn/*
43
+ !.yarn/patches
44
+ !.yarn/plugins
45
+ !.yarn/releases
46
+ !.yarn/versions
47
+
48
+ # testing
49
+ /coverage
50
+
51
+ # next.js
52
+ /.next/
53
+ /out/
54
+ .next
55
+
56
+ # production
57
+ /build
58
+
59
+ # misc
60
+ .DS_Store
61
+ *.pem
62
+
63
+ # debug
64
+ npm-debug.log*
65
+ yarn-debug.log*
66
+ yarn-error.log*
67
+ .pnpm-debug.log*
68
+
69
+ # env files (can opt-in for committing if needed)
70
+ .env*
71
+
72
+ # vercel
73
+ .vercel
74
+
75
+ # typescript
76
+ *.tsbuildinfo
77
+ next-env.d.ts
CONTRIBUTING.md ADDED
@@ -0,0 +1,158 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!-- omit in toc -->
2
+
3
+ # Contributing to December
4
+
5
+ First off, thanks for taking the time to contribute! ❤️
6
+
7
+ All types of contributions are encouraged and valued. See the [Table of Contents](#table-of-contents) for different ways to help and details about how this project handles them. Please make sure to read the relevant section before making your contribution. It will make it a lot easier for us maintainers and smooth out the experience for all involved. The community looks forward to your contributions. 🎉
8
+
9
+ > And if you like the project, but just don't have time to contribute, that's fine. There are other easy ways to support the project and show your appreciation, which we would also be very happy about:
10
+ >
11
+ > - Star the project
12
+ > - Tweet about it
13
+ > - Refer this project in your project's readme
14
+ > - Mention the project at local meetups and tell your friends/colleagues
15
+
16
+ <!-- omit in toc -->
17
+
18
+ ## Table of Contents
19
+
20
+ - [I Have a Question](#i-have-a-question)
21
+ - [I Want To Contribute](#i-want-to-contribute)
22
+ - [Reporting Bugs](#reporting-bugs)
23
+ - [Suggesting Enhancements](#suggesting-enhancements)
24
+ - [Your First Code Contribution](#your-first-code-contribution)
25
+ - [Improving The Documentation](#improving-the-documentation)
26
+ - [Styleguides](#styleguides)
27
+ - [Commit Messages](#commit-messages)
28
+ - [Join The Project Team](#join-the-project-team)
29
+
30
+ ## I Have a Question
31
+
32
+ > If you want to ask a question, we assume that you have read the available [Documentation]().
33
+
34
+ Before you ask a question, it is best to search for existing [Issues](https://github.com/ntegrals/december/issues) that might help you. In case you have found a suitable issue and still need clarification, you can write your question in this issue. It is also advisable to search the internet for answers first.
35
+
36
+ If you then still feel the need to ask a question and need clarification, we recommend the following:
37
+
38
+ - Open an [Issue](https://github.com/ntegrals/december/issues/new).
39
+ - Provide as much context as you can about what you're running into.
40
+ - Provide project and platform versions (nodejs, npm, etc), depending on what seems relevant.
41
+
42
+ We will then take care of the issue as soon as possible.
43
+
44
+ <!--
45
+ You might want to create a separate issue tag for questions and include it in this description. People should then tag their issues accordingly.
46
+
47
+ Depending on how large the project is, you may want to outsource the questioning, e.g. to Stack Overflow or Gitter. You may add additional contact and information possibilities:
48
+ - IRC
49
+ - Slack
50
+ - Gitter
51
+ - Stack Overflow tag
52
+ - Blog
53
+ - FAQ
54
+ - Roadmap
55
+ - E-Mail List
56
+ - Forum
57
+ -->
58
+
59
+ ## I Want To Contribute
60
+
61
+ > ### Legal Notice <!-- omit in toc -->
62
+ >
63
+ > When contributing to this project, you must agree that you have authored 100% of the content, that you have the necessary rights to the content and that the content you contribute may be provided under the project license.
64
+
65
+ ### Reporting Bugs
66
+
67
+ <!-- omit in toc -->
68
+
69
+ #### Before Submitting a Bug Report
70
+
71
+ A good bug report shouldn't leave others needing to chase you up for more information. Therefore, we ask you to investigate carefully, collect information and describe the issue in detail in your report. Please complete the following steps in advance to help us fix any potential bug as fast as possible.
72
+
73
+ - Make sure that you are using the latest version.
74
+ - Determine if your bug is really a bug and not an error on your side e.g. using incompatible environment components/versions (Make sure that you have read the [documentation](). If you are looking for support, you might want to check [this section](#i-have-a-question)).
75
+ - To see if other users have experienced (and potentially already solved) the same issue you are having, check if there is not already a bug report existing for your bug or error in the [bug tracker](https://github.com/ntegrals/december/issues?q=label%3Abug).
76
+ - Also make sure to search the internet (including Stack Overflow) to see if users outside of the GitHub community have discussed the issue.
77
+ - Collect information about the bug:
78
+ - Stack trace (Traceback)
79
+ - OS, Platform and Version (Windows, Linux, macOS, x86, ARM)
80
+ - Version of the interpreter, compiler, SDK, runtime environment, package manager, depending on what seems relevant.
81
+ - Possibly your input and the output
82
+ - Can you reliably reproduce the issue? And can you also reproduce it with older versions?
83
+
84
+ <!-- omit in toc -->
85
+
86
+ #### How Do I Submit a Good Bug Report?
87
+
88
+ > You must never report security related issues, vulnerabilities or bugs including sensitive information to the issue tracker, or elsewhere in public. Instead sensitive bugs must be sent by email to <>.
89
+
90
+ <!-- You may add a PGP key to allow the messages to be sent encrypted as well. -->
91
+
92
+ We use GitHub issues to track bugs and errors. If you run into an issue with the project:
93
+
94
+ - Open an [Issue](https://github.com/ntegrals/december/issues/new). (Since we can't be sure at this point whether it is a bug or not, we ask you not to talk about a bug yet and not to label the issue.)
95
+ - Explain the behavior you would expect and the actual behavior.
96
+ - Please provide as much context as possible and describe the _reproduction steps_ that someone else can follow to recreate the issue on their own. This usually includes your code. For good bug reports you should isolate the problem and create a reduced test case.
97
+ - Provide the information you collected in the previous section.
98
+
99
+ Once it's filed:
100
+
101
+ - The project team will label the issue accordingly.
102
+ - A team member will try to reproduce the issue with your provided steps. If there are no reproduction steps or no obvious way to reproduce the issue, the team will ask you for those steps and mark the issue as `needs-repro`. Bugs with the `needs-repro` tag will not be addressed until they are reproduced.
103
+ - If the team is able to reproduce the issue, it will be marked `needs-fix`, as well as possibly other tags (such as `critical`), and the issue will be left to be [implemented by someone](#your-first-code-contribution).
104
+
105
+ <!-- You might want to create an issue template for bugs and errors that can be used as a guide and that defines the structure of the information to be included. If you do so, reference it here in the description. -->
106
+
107
+ ### Suggesting Enhancements
108
+
109
+ This section guides you through submitting an enhancement suggestion for December, **including completely new features and minor improvements to existing functionality**. Following these guidelines will help maintainers and the community to understand your suggestion and find related suggestions.
110
+
111
+ <!-- omit in toc -->
112
+
113
+ #### Before Submitting an Enhancement
114
+
115
+ - Make sure that you are using the latest version.
116
+ - Read the [documentation]() carefully and find out if the functionality is already covered, maybe by an individual configuration.
117
+ - Perform a [search](https://github.com/ntegrals/december/issues) to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one.
118
+ - Find out whether your idea fits with the scope and aims of the project. It's up to you to make a strong case to convince the project's developers of the merits of this feature. Keep in mind that we want features that will be useful to the majority of our users and not just a small subset. If you're just targeting a minority of users, consider writing an add-on/plugin library.
119
+
120
+ <!-- omit in toc -->
121
+
122
+ #### How Do I Submit a Good Enhancement Suggestion?
123
+
124
+ Enhancement suggestions are tracked as [GitHub issues](https://github.com/ntegrals/december/issues).
125
+
126
+ - Use a **clear and descriptive title** for the issue to identify the suggestion.
127
+ - Provide a **step-by-step description of the suggested enhancement** in as many details as possible.
128
+ - **Describe the current behavior** and **explain which behavior you expected to see instead** and why. At this point you can also tell which alternatives do not work for you.
129
+ - You may want to **include screenshots and animated GIFs** which help you demonstrate the steps or point out the part which the suggestion is related to. You can use [this tool](https://www.cockos.com/licecap/) to record GIFs on macOS and Windows, and [this tool](https://github.com/colinkeenan/silentcast) or [this tool](https://github.com/GNOME/byzanz) on Linux. <!-- this should only be included if the project has a GUI -->
130
+ - **Explain why this enhancement would be useful** to most December users. You may also want to point out the other projects that solved it better and which could serve as inspiration.
131
+
132
+ <!-- You might want to create an issue template for enhancement suggestions that can be used as a guide and that defines the structure of the information to be included. If you do so, reference it here in the description. -->
133
+
134
+ ### Your First Code Contribution
135
+
136
+ <!-- TODO
137
+ include Setup of env, IDE and typical getting started instructions?
138
+
139
+ -->
140
+
141
+ ### Improving The Documentation
142
+
143
+ <!-- TODO
144
+ Updating, improving and correcting the documentation
145
+
146
+ -->
147
+
148
+ ## Styleguides
149
+
150
+ ### Commit Messages
151
+
152
+ <!-- TODO
153
+
154
+ -->
155
+
156
+ ## Join The Project Team
157
+
158
+ <!-- TODO -->
LICENCE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) [2025] [Julian Schoen]
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
README.md CHANGED
@@ -1,10 +1,135 @@
1
- ---
2
- title: VicoXDecember
3
- emoji: 🏆
4
- colorFrom: purple
5
- colorTo: indigo
6
- sdk: docker
7
- pinned: false
8
- ---
9
-
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <a name="readme-top"></a>
2
+
3
+ <div align="center">
4
+
5
+ <h3 align="center">Say hi to December ☃️</h3>
6
+
7
+ <p align="center">
8
+ December is an open-source alternative to AI-powered development platforms like Loveable, Replit, and Bolt that you can run locally with your own API keys, ensuring complete privacy and significant cost savings.
9
+ <br />
10
+ <br />
11
+ December lets you build full-stack applications from simple text prompts using AI.
12
+ <br />
13
+ <br />
14
+ <a href="#get-started">Get started</a>
15
+ ·
16
+ <a href="https://github.com/ntegrals/december/issues/new?assignees=&labels=bug&projects=&template=bug_report.md&title=">Report Bug</a>
17
+ ·
18
+ <a href="https://github.com/ntegrals/december/issues/new?assignees=&labels=enhancement&projects=&template=feature_request.md&title=">Request Feature</a>
19
+
20
+ </p>
21
+ </div>
22
+ <a href="https://github.com/ntegrals/december">
23
+ <img src=".assets/preview.png" alt="December Preview">
24
+ </a>
25
+
26
+ ## Features
27
+
28
+ ✅ AI-powered project creation from natural language prompts
29
+ ✅ Containerized Next.js applications with Docker
30
+ ✅ Live preview with mobile and desktop views
31
+ ✅ Full-featured Monaco code editor with file management
32
+ ✅ Real-time chat assistant for development help
33
+ ✅ Project export and deployment capabilities
34
+
35
+ ## Roadmap
36
+
37
+ 🔄 LLM streaming support
38
+ 🔄 Document & image attachments
39
+ 🔄 Improved fault tolerance
40
+ 🔄 Comprehensive test coverage
41
+ 🔄 Multi-framework support (beyond Next.js)
42
+
43
+ ## Get started
44
+
45
+ 1. Clone the repo
46
+
47
+ ```sh
48
+ git clone https://github.com/ntegrals/december
49
+ ```
50
+
51
+ 2. Get an API Key from any OpenAI sdk compatible provider (e.g. OpenAI, Claude, Ollama, OpenRouter, etc.) and set it in the `config.ts` file.
52
+
53
+ The start.sh script will automatically copy over the file into the backend folder.
54
+
55
+ I highly recommend using Sonnet-4 from Anthropic as it is the best coding model available right now.
56
+
57
+ ```sh
58
+ baseUrl: "https://openrouter.ai/api/v1",
59
+
60
+ apiKey:
61
+ "sk-...",
62
+
63
+ model: "anthropic/claude-sonnet-4",
64
+ temperature: 0.7,
65
+ ```
66
+
67
+ 3. Install docker (Docker Desktop is the easiest way to get started)
68
+
69
+ - [Docker Desktop for Mac](https://www.docker.com/products/docker-desktop/)
70
+ - [Docker Desktop for Windows](https://www.docker.com/products/docker-desktop/)
71
+ - [Docker Engine for Linux](https://docs.docker.com/engine/install/)
72
+
73
+ Make sure you have Docker running and the Docker CLI installed before proceeding.
74
+
75
+ 4. Run the start script to set up the environment
76
+
77
+ ```sh
78
+ sh start.sh
79
+ ```
80
+
81
+ 5. The application will start in development mode, and you can access it at [http://localhost:3000](http://localhost:3000).
82
+
83
+ The backend will run on port 4000, and the frontend will run on port 3000.
84
+
85
+ You can now start building your applications with December! 🥳
86
+
87
+ <!-- ## Demo
88
+
89
+ You can test the December here: [https://december.ai](https://december.ai) -->
90
+
91
+ ## Motivation
92
+
93
+ AI-powered development platforms have revolutionized how we build applications. They allow developers to go from idea to working application in seconds, but most solutions are closed-source or require expensive subscriptions.
94
+
95
+ Until recently, building a local alternative that matched the speed and capabilities of platforms like Loveable, Replit, or Bolt seemed challenging. The recent advances in AI and containerization technologies have made it possible to build a fast, local development environment that gives you full control over your code and API usage.
96
+
97
+ I would love for this repo to become the go-to place for people who want to run their own AI-powered development environment. I've been working on this project for a while now and I'm really excited to share it with you.
98
+
99
+ ## Why run December locally?
100
+
101
+ Building applications shouldn't require expensive subscriptions or sacrificing your privacy. December gives you the power of platforms like Loveable, Replit, and Bolt without the downsides:
102
+
103
+ - **Full Control & Privacy** - Your code, ideas, and projects never leave your machine. No cloud storage, no data mining, no vendor lock-in
104
+ - **Your API Keys, Your Costs** - Use your own OpenAI API key and pay only for what you use. No monthly subscriptions or usage limits imposed by third parties
105
+ - **Complete Feature Access** - No paywalls, premium tiers, or artificial limitations. Every feature is available from day one
106
+
107
+ Most cloud-based AI development platforms charge $20-100+ per month while limiting your usage and storing your intellectual property on their servers. With December, a $5 OpenAI API credit can generate dozens of complete applications, and you keep full ownership of everything you create.
108
+
109
+ The local-first approach means you can work offline, modify the platform itself, and never worry about service outages or policy changes affecting your projects. Your development environment evolves with your needs, not a company's business model.
110
+
111
+ December proves that you don't need to choose between powerful AI assistance and maintaining control over your work. Run it locally, use your own API keys, and build without boundaries.
112
+
113
+ ## Contact
114
+
115
+ Hi! Thanks for checking out and using this project. If you are interested in discussing your project, require mentorship, consider hiring me, or just wanna chat - I'm happy to talk.
116
+
117
+ You can send me an email to get in touch: j.schoen@mail.com or message me on Twitter: [@julianschoen](https://twitter.com/julianschoen)
118
+
119
+ Thanks and have an awesome day 👋
120
+
121
+ ## Disclaimer
122
+
123
+ December, is an experimental application and is provided "as-is" without any warranty, express or implied. By using this software, you agree to assume all risks associated with its use, including but not limited to data loss, system failure, or any other issues that may arise.
124
+
125
+ The developers and contributors of this project do not accept any responsibility or liability for any losses, damages, or other consequences that may occur as a result of using this software. You are solely responsible for any decisions and actions taken based on the information provided by December.
126
+
127
+ Please note that the use of the large language models can be expensive due to its token usage. By utilizing this project, you acknowledge that you are responsible for monitoring and managing your own token usage and the associated costs. It is highly recommended to check your API usage regularly and set up any necessary limits or alerts to prevent unexpected charges.
128
+
129
+ By using December, you agree to indemnify, defend, and hold harmless the developers, contributors, and any affiliated parties from and against any and all claims, damages, losses, liabilities, costs, and expenses (including reasonable attorneys' fees) arising from your use of this software or your violation of these terms.
130
+
131
+ <!-- LICENSE -->
132
+
133
+ ## License
134
+
135
+ Distributed under the MIT License. See `LICENSE` for more information.
backend.log ADDED
@@ -0,0 +1 @@
 
 
1
+ Running backend...
config.ts ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ export const config = {
2
+ aiSdk: {
3
+ baseUrl: "https://api.groq.com/openai/v1",
4
+ apiKey: "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", // <-- Paste ini!
5
+ model: "llama-3.1-8b-instant", // Atau llama-3.1-70b-versatile buat lebih pintar
6
+ },
7
+ } as const;
8
+
9
+ make an dll injector roblox like wave or zenith, anti ban bypass hyperion roblox. injection method that hasnt patched right now
frontend.log ADDED
@@ -0,0 +1 @@
 
 
1
+ Running frontend...
start.ps1 ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # start.ps1 — versi yang stabil untuk Windows
2
+
3
+ Write-Host "Starting backend server..." -ForegroundColor Green
4
+ Copy-Item -Path "./config.ts" -Destination "./backend/config.ts" -Force
5
+
6
+ # Jalankan backend di jendela baru
7
+ Start-Process powershell -ArgumentList "-NoExit", "cd backend; bun run src/index.ts" -WindowStyle Normal
8
+
9
+ Start-Sleep -Seconds 2
10
+
11
+ Write-Host "Starting frontend server..." -ForegroundColor Green
12
+
13
+ # Jalankan frontend di jendela baru
14
+ Start-Process powershell -ArgumentList "-NoExit", "cd frontend; bun dev" -WindowStyle Normal
15
+
16
+ Write-Host "`nBoth servers are starting..." -ForegroundColor Yellow
17
+ Write-Host "Backend: http://localhost:4000" -ForegroundColor Cyan
18
+ Write-Host "Frontend: http://localhost:3000" -ForegroundColor Cyan
19
+ Write-Host "`nPress Ctrl+C to stop both servers.`n" -ForegroundColor DarkGray
20
+
21
+ try {
22
+ while ($true) { Start-Sleep -Seconds 1 }
23
+ }
24
+ finally {
25
+ Write-Host "Stopping all servers..." -ForegroundColor Red
26
+ Get-Process -Name "bun" -ErrorAction SilentlyContinue | Stop-Process -Force
27
+ }
start.sh ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ echo "Starting backend server..."
4
+ cp config.ts backend/config.ts
5
+
6
+ (
7
+ cd backend || exit
8
+ echo "Running backend..."
9
+ bun src/index.ts &
10
+ ) > backend.log 2>&1
11
+
12
+ echo "Starting frontend server..."
13
+ (
14
+ cd frontend || exit
15
+ echo "Running frontend..."
16
+ bun dev &
17
+ ) > frontend.log 2>&1
18
+
19
+ echo "Both servers are starting..."
20
+ echo "Press Ctrl+C to stop both servers"
21
+
22
+ wait