You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* Add Mac keyboard shortcut equivalents to numbered chapters
- Standardized all shortcuts to use Cmd/Ctrl+Key slash syntax
- Added Mac equivalents for browser DevTools (F12 or Cmd/Ctrl+Shift+I, or Cmd+Option+I on Mac)
- Added Mac equivalents for JupyterLab command palette (Cmd/Ctrl+Shift+C)
- Updated Source Control shortcuts (Cmd/Ctrl+Shift+G)
- Standardized Cursor shortcuts (Cmd/Ctrl+L, Cmd/Ctrl+N, Cmd/Ctrl+K, Cmd/Ctrl+,)
- Verified Ctrl+C for SIGINT is correct on all platforms
Files updated:
- 02-anatomy-of-extensions.md
- 03-debugging.md
- 05-developing-with-ai.md
* suggestion to remove dead code
* Make small commits for each "thing"
* explain the concept of "good first issue"
* use header targets
* rework examples
try to embed Loom videos
* rework examples
* add tip on prompt explicitly for a UI color palette when creating a theme
* better wording about referring to inspiration ideas
* tone it down with superlatives
* clarify and combine project needs lists
* small clarification
* small clarification
* add bonus goal suggestion
* fix ci issue
* fix the chapter names 3<->4
* update shutdown instructions
* Clarify JupyterLab as an extensible IDE, not an operating system
Addresses reviewer feedback that the OS comparison was inaccurate.
JupyterLab is an IDE, and emphasizing its extensibility better leads
into the workshop content about writing extensions.
* Update 04-materials/06-working-on-your-own.md
Co-authored-by: Matt Fisher <[email protected]>
* Update 04-materials/06-working-on-your-own.md
Co-authored-by: Matt Fisher <[email protected]>
---------
Co-authored-by: Matt Fisher <[email protected]>
Copy file name to clipboardExpand all lines: 03-vocabulary.md
+8Lines changed: 8 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -116,6 +116,14 @@ These tools work in an **agentic loop**: they plan an action, use a tool to exec
116
116
Examples include Cursor, Claude Code, and Cline.
117
117
Unlike chat-based or autocomplete AI, agentic tools act like a team member with tools — they don't just suggest, they do.
118
118
119
+
Good first issue
120
+
: A GitHub label that identifies issues suitable for newcomers to a project or to open source in general.
121
+
The concept emerged from the "first-timers-only" movement, popularized by developers like Scott Hanselman and Kent C. Dodds, to create approachable pathways into open source contribution.
122
+
These issues are typically well-scoped bugs or minor enhancements with clear requirements, making them ideal starting points for new contributors.
123
+
Projects use variations like "beginner-friendly," "easy-fix," or "low-hanging fruit."
124
+
By marking issues this way, maintainers signal that their project welcomes beginners, helping grow their community while inviting people who might otherwise feel excluded from open source.
125
+
Resources: [goodfirstissue.dev](https://goodfirstissue.dev/), [GitHub's guide](https://opensource.guide/building-community/), [How to Create Good Good-First-Issues](https://blogs.vmware.com/opensource/2019/10/16/open-source-good-first-issues/), [Finding Good First Issues](https://community.codenewbie.org/bdougie/finding-good-first-issues-33a6).
126
+
119
127
LLM token
120
128
: In the context of {term}`LLMs <LLM>`, a token is a unit of text (roughly 3-4 characters or ~0.75 words in English) that the model processes.
121
129
API providers charge based on the number of tokens consumed—both input tokens (text sent to the model) and output tokens (text generated by the model).
Copy file name to clipboardExpand all lines: 04-materials/02-anatomy-of-extensions.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -45,7 +45,7 @@ This tutorial is inspired by many prior works.
45
45
* Structure the activities around in person teaching and exercises
46
46
:::
47
47
48
-
48
+
(anatomy-setup)=
49
49
## 🛠️ Setup
50
50
51
51
Before we get started, we need to set up:
@@ -197,7 +197,7 @@ Our extension will:
197
197
198
198
🚀 Let's build it together from scratch.
199
199
200
-
200
+
(anatomy-exercise-a)=
201
201
## 🏋️ Exercise A (15 minutes): Extension creation and development loop
202
202
203
203
### 🔧 Create a new extension from the [official template](https://github.com/jupyterlab/extension-template)
@@ -363,7 +363,7 @@ git push -u origin main
363
363
364
364
### 🔧 Do a complete development loop
365
365
366
-
0. Close the JupyterLab server with `Ctrl+C`.
366
+
0. Close the JupyterLab server. You can use the shutdown menu item in the JupyterLab itself (File → Shut Down), which is more reliable, or use `Ctrl+C` in the terminal where the server is running.
367
367
368
368
1. Make any change to the codebase.
369
369
For example, alter the text in a `console.log()` message.
Copy file name to clipboardExpand all lines: 04-materials/03-debugging.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,4 +1,4 @@
1
-
# 🐞 4 - Debugging: What to do when things go wrong?
1
+
# 🐞 3 - Debugging: What to do when things go wrong?
2
2
3
3
:::{tip} Outcome
4
4
By the end of this module, we'll have looked into JupyterLab extension development errors in both the terminal and browser console, and used the browser console functionalities to gather information that will help us resolve our errors.
Copy file name to clipboardExpand all lines: 04-materials/06-working-on-your-own.md
+43-24Lines changed: 43 additions & 24 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -29,7 +29,7 @@ All paths are valuable! Pick what excites you most.
29
29
Before diving into your chosen path, make sure you have:
30
30
31
31
- A clear goal (extension idea or GitHub issue to work on)
32
-
- Development environment ready (if building new: follow [Setup](02-anatomy-of-extensions.md#️-setup) and [Exercise A](02-anatomy-of-extensions.md#️-exercise-a-15-minutes-extension-creation-and-development-loop))
32
+
- Development environment ready (if building new: follow {ref}`Setup <anatomy-setup>` and {ref}`Exercise A <anatomy-exercise-a>`)
33
33
- Access to [JupyterLab API docs](https://jupyterlab.readthedocs.io/en/latest/api/) and [Extension Examples](https://github.com/jupyterlab/extension-examples)
34
34
35
35
## 🔨 Path 1: Build your own extension from scratch
@@ -40,10 +40,10 @@ Create something entirely new using the extension template, AI assistance, and t
40
40
41
41
Follow these sections from chapter 2 to start a new extension from a template:
42
42
43
-
1.[🛠️ Setup](02-anatomy-of-extensions.md#️-setup) - Set up your environment, Git, and GitHub repository
44
-
2.[🏋️ Exercise A: Extension creation and development loop](02-anatomy-of-extensions.md#️-exercise-a-15-minutes-extension-creation-and-development-loop) - Create your extension from the template and test the development loop
43
+
1.{ref}`🛠️ Setup <anatomy-setup>` - Set up your environment, Git, and GitHub repository
44
+
2.{ref}`🏋️ Exercise A: Extension creation and development loop <anatomy-exercise-a>` - Create your extension from the template and test the development loop
45
45
46
-
Once you have your extension set up and working, return here to choose an inspiration project below.
46
+
Once you have your extension set up and working, proceed to work on your extension idea or return here to find inspiration below.
47
47
48
48
### 💫 Inspiration
49
49
@@ -81,13 +81,14 @@ To customize:
81
81
Make the confetti more colorful and add a sound effect when it triggers.
This is a perfect first project - it's self-contained, purely visual, and you'll immediately see if it works. It teaches you about JupyterLab's status bar API without backend complexity.
91
+
This is an ideal first project - it's self-contained, purely visual, and you'll immediately see if it works. It teaches you about JupyterLab's status bar API without backend complexity.
91
92
:::
92
93
93
94
#### 🎨 Custom theme extension
@@ -101,6 +102,17 @@ This is a perfect first project - it's self-contained, purely visual, and you'll
101
102
Create a theme based on [your favorite movie/show/game/aesthetic]
102
103
```
103
104
105
+
:::{tip} Better Results with Color Planning
106
+
For better results, ask the LLM to plan the color palette first:
107
+
```
108
+
Create a theme based on [your theme]. First, suggest a UI color palette
109
+
of 6 colors (background, foreground, accent, etc.) that match this theme,
110
+
then implement the theme using those colors.
111
+
```
112
+
113
+
This explicit request for a color palette triggers more thoughtful planning before implementation!
114
+
:::
115
+
104
116
**Example**:
105
117
```
106
118
Create a theme based on Netflix show KPop Demon Hunters
@@ -110,7 +122,7 @@ Create a theme based on Netflix show KPop Demon Hunters
110
122
- A new theme appears in Settings → Theme menu
111
123
- Theme includes custom colors matching your chosen aesthetic
112
124
- JupyterLab interface reflects the theme's visual style
113
-
- Theme can be toggled on/off
125
+
- Theme can be toggled on/off in Settings → Theme menu
114
126
115
127
**What to watch for**:
116
128
@@ -144,10 +156,16 @@ Use [specific colors] for accent elements.
144
156
- Consider color palettes - extract 3-5 main colors from your chosen image (AI can help you with it!)
This is a perfect creative project! You get immediate visual feedback, can personalize your JupyterLab environment, and learn how JupyterLab's theming system works. Plus, you'll have a custom theme you actually want to use daily.
166
+
This is a solid creative project! You get immediate visual feedback, can personalize your JupyterLab environment, and learn how JupyterLab's theming system works. Plus, you'll have a custom theme you actually want to use daily.
149
167
150
-
Themes are also great conversation starters - share your theme with other workshop participants!
168
+
Themes are also good conversation starters - share your theme with other workshop participants!
151
169
:::
152
170
153
171
#### 📊 CPU monitor widget
@@ -193,14 +211,14 @@ Add a graph that shows CPU usage over the last 60 seconds,
This teaches you the full stack: backend API design, frontend-backend communication, error handling, and periodic updates. It's a perfect template for any monitoring or dashboard extension.
221
+
This teaches you the full stack: backend API design, frontend-backend communication, error handling, and periodic updates. It's an excellent template for any monitoring or dashboard extension.
204
222
:::
205
223
206
224
### 🌟 More extension ideas
@@ -214,9 +232,9 @@ Pick an idea that matches your comfort level and interests:
214
232
4.**Pomodoro timer**: Status bar timer for focused work sessions with notifications
215
233
216
234
#### 🚦 Intermediate (frontend + server)
217
-
1.**File size analyzer**: Scan workspace directory and show largest files/folders
218
-
2.**Git status widget**: Display current branch, uncommitted changes count
219
-
3.**Environment inspector**: Show installed packages and Python version
235
+
1.**File size analyzer**: Scan workspace directory and show largest files/folders. Bonus goal: Add a treemap visualization (like [WinDirStat](https://windirstat.net/)) to visually represent file sizes
236
+
2.**Git status widget**: Display current branch, uncommitted changes count in the status bar
237
+
3.**Environment inspector**: Show installed packages and Python version in the sidebar
220
238
4.**Todo list with persistence**: Sidebar panel that saves tasks to disk
221
239
222
240
#### 🎯 Advanced
@@ -248,7 +266,7 @@ Contributing to established extensions is a great way to learn real-world patter
248
266
See our [Show & Tell session](04-show-and-tell.md) for a curated list of popular JupyterLab extensions and inspiration on projects to contribute to.
249
267
250
268
#### 🐛 Beginner-friendly JupyterLab core
251
-
Want to contribute to JupyterLab itself? Here are good first issues:
269
+
Want to contribute to JupyterLab itself? Here are {term}`good first issues <good first issue>`:
252
270
253
271
**JupyterLab Core:**
254
272
-[Good First Issues](https://github.com/jupyterlab/jupyterlab/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)
@@ -259,11 +277,10 @@ Want to contribute to JupyterLab itself? Here are good first issues:
259
277
260
278
### ✅ Check the project needs
261
279
**Check the project board or GitHub Issues** for:
280
+
- {term}`"Good first issue" <good first issue>` labels
262
281
- Feature requests that align with your interests
263
282
- Bug reports you can reproduce
264
283
- Documentation improvements
265
-
266
-
**Browse recent issues** and look for:
267
284
- Questions you can answer
268
285
- Problems you've encountered yourself
269
286
- Features you wish existed
@@ -292,6 +309,7 @@ Want to contribute to JupyterLab itself? Here are good first issues:
292
309
293
310
3.**Make your changes**:
294
311
- Start small - fix one thing at a time
312
+
- Make small commits for each "thing"
295
313
- Follow the project's code style
296
314
- Add or update tests if applicable
297
315
- Update documentation
@@ -351,6 +369,7 @@ Before opening a PR, verify:
351
369
- Commit messages are clear and descriptive
352
370
- PR description explains what and why
353
371
- You've read and followed CONTRIBUTING.md
372
+
- Remove unused or unreachable code ("dead code") and unused artifacts (imports, variables, files, commented-out code)
0 commit comments