🎯 Session Format¶
This is an open exploration session - similar to office hours or a study hall. You’ll choose a project that interests you and work on it with instructor support. Don’t worry about finishing - the goal is to practice the development workflow and problem-solving.
🚀 Getting Started¶
Before diving into your chosen path, make sure you have:
A clear goal (extension idea or GitHub issue to work on)
Development environment ready (if building new: follow Setup and Exercise A)
Access to JupyterLab API docs and Extension Examples
🔨 Path 1: Build your own extension from scratch¶
Create something entirely new using the extension template, AI assistance, and the patterns you’ve learned.
⚡ Quick start¶
Follow these sections from chapter 2 to start a new extension from a template:
🛠️ Setup - Set up your environment, Git, and GitHub repository
🏋️ Exercise A: Extension creation and development loop - Create your extension from the template and test the development loop
Once you have your extension set up and working, return here to choose an inspiration project below.
💫 Inspiration¶
The following three examples with prompts have been tested and confirmed working. Pick one that matches your interests - whether you want visual effects, creative customization, or full-stack development. Use them as-is to practice prompt engineering, or as inspiration for your own ideas.
🎉 Confetti celebration button¶
Complexity: Beginner (Frontend only) Time: 15-20 minutes What you’ll work with: Status bar integration, DOM manipulation, visual effects
The Prompt:
Add a button in the status bar to celebrate something! It should show confetti
on top of the UI for 3 secondsExpected Results:
Status bar shows a celebration button (usually bottom-right)
Clicking triggers confetti animation overlay
Animation appears on top of all UI elements
Confetti clears after ~3 seconds
Multiple clicks work correctly
What to Watch For:
If the confetti doesn’t appear, try prompting:
The button is there but I don't see confetti. Check that the z-index
is high enough and the confetti container is properly positioned.To customize:
Make the confetti more colorful and add a sound effect when it triggers.Verified Setup:
✅ macOS 15.7, Claude Code (Claude Sonnet 4.5)
✅
condaenvironment: Python 3.13, Node.js 22, JupyterLab
🎨 Custom theme extension¶
Complexity: Beginner (Frontend only) Time: 20-30 minutes What you’ll work with: Theme customization, CSS styling, JupyterLab theming system
The Prompt:
Create a theme based on [your favorite movie/show/game/aesthetic]Example:
Create a theme based on Netflix show KPop Demon HuntersExpected results:
A new theme appears in Settings → Theme menu
Theme includes custom colors matching your chosen aesthetic
JupyterLab interface reflects the theme’s visual style
Theme can be toggled on/off
What to watch for:
To add a background image to the main panel:
Can we use this image as a background for main panel?
[paste your image URL]Example:
Can we use this image as a background for main panel?
https://www.billboard.com/wp-content/uploads/2025/07/kpop-demon-hunters-billboard-1800.jpg?w=942&h=628&crop=1To refine the styling:
The background image is too bright - make it more subtle with reduced opacity
and add a dark overlay so text is readable.To adjust colors:
Update the sidebar and toolbar colors to match the theme's color palette.
Use [specific colors] for accent elements.Tips for finding images:
Search “[theme name] wallpaper 4k” for high-quality backgrounds
Look for images with good contrast for text readability
Consider color palettes - extract 3-5 main colors from your chosen image (AI can help you with it!)
Free image sources: Unsplash, Pexels, Wallhaven
📊 CPU monitor widget¶
Complexity: Intermediate (Frontend + Server) Time: 30-40 minutes What you’ll work on: REST API integration, backend data processing, error handling
The Prompt:
Create a JupyterLab extension that monitors CPU stats:
- Use psutil on the backend to get utilization and temperature data
- Create a REST API endpoint
- Display it in a widget in the main area
- Handle gracefully if some fields aren't availableExpected results:
Extension installs
psutilsuccessfullyWidget appears in main area when launched
CPU utilization percentage displays
Updates automatically (polling every few seconds)
Widget gracefully handles when temperature data is unavailable
Widget layout is readable and organized
What to watch for:
If psutil isn’t installed:
I'm getting ModuleNotFoundError for psutil. Update pyproject.toml to
include psutil as a dependency.If the widget doesn’t update:
The widget shows data once but doesn't update. Add automatic polling
every 2 seconds to refresh the CPU stats.To extend it:
Add a graph that shows CPU usage over the last 60 seconds,
and highlight in red when usage is above 80%.Verified setup:
✅ macOS 15.7, Cursor (Claude Sonnet 4.5 MAX)
✅
condaenvironment: Python 3.13, Node.js 22, JupyterLab⚠️ Temperature data gracefully handled as N/A on macOS (expected)
🌟 More extension ideas¶
Pick an idea that matches your comfort level and interests:
🎓 Beginner (frontend only)¶
Theme switcher dropdown: Add a quick theme selector to the toolbar for easy switching
Quote of the day: Main area widget that fetches and displays random quotes
Keyboard shortcut viewer: Panel showing all available shortcuts
Pomodoro timer: Status bar timer for focused work sessions with notifications
🚦 Intermediate (frontend + server)¶
File size analyzer: Scan workspace directory and show largest files/folders
Git status widget: Display current branch, uncommitted changes count
Environment inspector: Show installed packages and Python version
Todo list with persistence: Sidebar panel that saves tasks to disk
🎯 Advanced¶
Custom welcome screen: Override the default launcher with your own design
AI code assistant: Create a chat with LLM
Performance profiler: Instrument notebook cells and show execution metrics
Custom file format viewer: Add support for viewing unsupported file types
Real-time log viewer: Stream and filter server logs in a widget
💡 Even more ideas from JupyterLab community¶
🤝 Path 2: Contribute to existing extensions¶
Contributing to established extensions is a great way to learn real-world patterns and give back to the community.
🌱 Why contribute?¶
Learn from production-quality code
Work with maintainers who know JupyterLab well
Your contribution helps thousands of users
Build your portfolio and resume
Connect with the Jupyter community
🔍 Find your project¶
🌐 Popular open source extensions¶
See our Show & Tell session for a curated list of popular JupyterLab extensions and inspiration on projects to contribute to.
🐛 Beginner-friendly JupyterLab core¶
Want to contribute to JupyterLab itself? Here are good first issues:
JupyterLab Core:
Extension Template:
✅ Check the project needs¶
Check the project board or GitHub Issues for:
Feature requests that align with your interests
Bug reports you can reproduce
Documentation improvements
Browse recent issues and look for:
Questions you can answer
Problems you’ve encountered yourself
Features you wish existed
🎬 Making your first contribution¶
Set up the development environment:
# Fork the repository on GitHub first, then: git clone https://github.com/YOUR-USERNAME/extension-name.git cd extension-name # Follow the project's CONTRIBUTING.md instructions # Usually similar to: pip install --editable ".[dev,test]" jupyter labextension develop . --overwrite jlpm buildCreate a branch for your work:
git checkout -b fix/issue-123-button-alignmentMake your changes:
Start small - fix one thing at a time
Follow the project’s code style
Add or update tests if applicable
Update documentation
Test thoroughly:
# Run the project's test suite jlpm test pytest # Test manually in JupyterLab jupyter labCommit and push:
git add . git commit -m "Fix button alignment in toolbar (#123)" git push -u origin fix/issue-123-button-alignmentOpen a Pull Request:
Go to the original repository on GitHub
Click “New Pull Request”
Select your fork and branch
Describe what you changed and why
Reference the issue number if applicable
📋 Contribution checklist¶
Before opening a PR, verify:
Code follows the project’s style guide
Changes are tested (automated tests and manual testing)
Documentation is updated if needed
Commit messages are clear and descriptive
PR description explains what and why
You’ve read and followed CONTRIBUTING.md
Tests pass in CI/CD (after opening PR)
🔧 When contributing gets stuck¶
If you’re blocked:
Comment on the issue asking for clarification
Join the Jupyter Zulip chat (or project-specific chat if available)
Ask instructors during this session
It’s okay to pause and try something else
If maintainers request changes:
Don’t take it personally - writing high quality code requires collaboration
Ask questions if feedback is unclear
Make the requested changes iteratively
Maintainers are volunteers - be patient and courteous
🔄 Development Workflow¶
This is the cycle you’ll repeat many times during development:
Write a clear prompt - Provide context, requirements, and constraints
Review generated code - Read and understand it; don’t blindly accept
Build: Run
jlpm buildto compile your extensionTest: Refresh JupyterLab (or restart if backend changed)
Debug: Check browser console and terminal for errors
Iterate: Refine your prompt based on results
Commit: Save working states frequently with git
💪 Tips for productive development¶
Focus on small wins: Small working features beat ambitious broken ones
Document as you go: Note what prompts work well, save error solutions, update README
Learn through debugging: Getting stuck teaches you more than smooth sailing
Collaborate: Share progress with neighbors, help each other debug, show off features
💬 Getting Help¶
👥 During this session¶
Where to get help:
Raise your hand for instructor help
Discuss with neighbors
Jupyter Zulip for real-time chat
When to ask for help - Don’t stay stuck! Ask an instructor if:
You’ve tried the same thing 3-4 times with no progress
AI suggests something that contradicts JupyterLab patterns
Build succeeds but feature doesn’t appear
You want guidance on architecture decisions
You’re unsure if your contribution approach is right
How to ask effectively:
Share your exact error message
Show what you’ve already tried
Explain what you expected vs. what happened
Include relevant code snippets
🎁 Wrapping up your work¶
Before the session ends, take 10 minutes to:
Commit your changes:
git add . git commit -m "Work in progress: [what you accomplished]" git pushDocument your progress in README.md:
What you built or contributed
What works and what’s still in progress
Interesting challenges you solved
Next steps you’d like to take
Reflect on what you learned:
What surprised you about AI-assisted development?
What JupyterLab concepts clicked for you?
What would you explore next?
🚪 After the tutorial¶
🛠️ To continue developing¶
Add automated tests (
pytestfor Python,jestfor TypeScript)Set up continuous integration (template includes GitHub Actions)
Write comprehensive documentation
Create example notebooks showing your extension in use
📢 To share your work¶
Publish to PyPI:
python -m build && twine upload dist/*Open-source on GitHub: write a good README, set
jupyterlab-extensionas a repo topicWrite a blog post about your development experience
Present at a local developer meetup or a conference
Track downloads
🌍 To contribute more¶
Subscribe to issues on extensions you’ve contributed to
Join the Jupyter Zulip chat for real-time discussions and help from contributors and users
Participate in the Jupyter Discourse forum
Attend Jupyter Community Calls - bring your questions or request code review from experienced developers
Help others getting started
📚 Reference Materials¶
Bookmark these resources for when you need them during development:
📖 Documentation¶
💻 Code Examples¶
Extension Examples Repository - 40+ example extensions
JupyterLab GitHub - Core extensions source code
🔑 Key JupyterLab APIs¶
Common tokens and services you’ll use:
| API | Use Case | Documentation |
|---|---|---|
INotebookTracker | Track active notebooks | Docs |
IStatusBar | Add widgets to status bar | Docs |
ICommandPalette | Register commands | Docs |
IFileBrowserFactory | Access file browser | Docs |
IThemeManager | Theme customization | Docs |
ISettingRegistry | Extension settings | Docs |
🖥️ Server Extensions¶
🔬 Tools & Discovery¶
Browser DevTools - Debug frontend
Run JupyterLab with
--debugflag for detailed server logsJupyter Marketplace - Snapshot of active extensions with stats
JupyterLab-Contrib Extensions - A list of some unofficial extensions by the community
jupyterlab-extension topic - Browse extensions on GitHub