Datalayer User Interface
Project description
☰ Datalayer UI
Datalayer UI is a React.js WEB application that can be deployed as pure static (HTML, JavaScript, and CSS) artifacts on any Content Delivery Network (CDN) or bundled in the datalayer-ui Python package.
The UI depends on the Datalayer Plane (aka the "backend services"), which are cloud services running on a Kubernetes cluster that the UI connects to.
DEV
source /home/echarles/.datalayer/datalayerrc-r1 && cd /home/echarles/datalayer-osp/src/k8s/services/plane/etc/dockerfiles/agent-runtimes && make build-dev push && p k8s-prepull-cpu
#
source /home/echarles/.datalayer/datalayerrc-r1 && cd /home/echarles/datalayer-osp/src/k8s/services/plane/etc/dockerfiles/datalayer-runtimes-companion && make build-dev push && p k8s-prepull-cpu
#
source /home/echarles/.datalayer/datalayerrc-r1 && cd /home/echarles/datalayer-osp/src/k8s/services/plane/etc/dockerfiles/agent-checkpointer && make build-dev push && p k8s-prepull-cpu
#
source /home/echarles/.datalayer/datalayerrc-r1 && k delete pods -n datalayer-runtimes -l app=agent-runtimes && p reup datalayer-operator
# -----------------------------------------------------------------------------
source /home/echarles/.datalayer/datalayerrc-prod1 && cd /home/echarles/datalayer-osp/src/k8s/services/plane/etc/dockerfiles/datalayer-iam && make build-dev push && p reup datalayer-iam
#
source /home/echarles/.datalayer/datalayerrc-prod1 && cd /home/echarles/datalayer-osp/src/k8s/services/plane/etc/dockerfiles/datalayer-spacer && make build-dev push && p reup datalayer-spacer
#
source /home/echarles/.datalayer/datalayerrc-prod1 && cd /home/echarles/datalayer-osp/src/k8s/services/plane/etc/dockerfiles/datalayer-ai-agents && make build-dev push && p reup datalayer-ai-agents
#
source /home/echarles/.datalayer/datalayerrc-prod1 && cd /home/echarles/datalayer-osp/src/k8s/services/plane/etc/dockerfiles/datalayer-ai-inference && make build-dev push && p reup datalayer-ai-inference
#
source /home/echarles/.datalayer/datalayerrc-prod1 && cd /home/echarles/datalayer-osp/src/k8s/services/plane/etc/dockerfiles/datalayer-growth && make build push && p reup datalayer-growth
#
source /home/echarles/.datalayer/datalayerrc-prod1 && cd /home/echarles/datalayer-osp/src/k8s/services/plane/etc/dockerfiles/datalayer-manager && make build push && p reup datalayer-manager
#
source /home/echarles/.datalayer/datalayerrc-r1 && cd /home/echarles/datalayer-osp/src/k8s/services/plane/etc/dockerfiles/datalayer-runtimes && make build-dev push && p reup datalayer-runtimes
#
source /home/echarles/.datalayer/datalayerrc-r1 && cd /home/echarles/datalayer-osp/src/k8s/services/plane/etc/dockerfiles/datalayer-operator && make build-dev push && k delete pods -n datalayer-runtimes -l app=agent-runtimes && p reup datalayer-operator
# -----------------------------------------------------------------------------
source /home/echarles/.datalayer/datalayerrc-r1 && k logs -n datalayer-runtimes -c agent-runtimes -f runtime-01kshphqdq80b98by4vb23wpv1
#
source /home/echarles/.datalayer/datalayerrc-r1 && k logs -n datalayer-runtimes -c companion -f runtime-01kshphqdq80b98by4vb23wpv1
Managed Agents without Vendor Lock
- Interesting article from Venturebeat on "Anthropic’s Claude Managed Agents gives enterprises a new one-stop shop but raises vendor 'lock-in' risk" https://venturebeat.com/orchestration/anthropics-claude-managed-agents-gives-enterprises-a-new-one-stop-shop-but
Dalayer is shipping managed agent without getting you trapped into a vendor lock. You keep owning and using your own tools if you want. You can create custom integration with the Datalayer Opensource components.
LLM Tokens and Costs visibility is not enough, we need Tracability
LLM Tokens and Costs visibility is not enough, we need Tracability.
Agentspecs are getting nicer
Agent specifications are becoming interesting and nice
-
Support Multi Agentspecs aka Team
-
Compose and Extend Agentspecs
-
https://github.com/oracle/agent-spec https://oracle.github.io/agent-spec
Google Colab MCP Server
using jupyter-kernel-client
Programmatic Tools Explained
- Programmatic Tools Explained
Inverse Thinking
- Page to Tech
- React Jupyter
GitHub Projects
I found github project the most effective way for me and team to organize work - disclaimer: I am a github fans
Pydantic AI × Datalayer: A Case Study in Structured Agent Outputs
"The revenue was approximately 2.3 million, give or take."
That's not a data product. That's a hallucination propagating downstream.
We partnered with Pydantic AI to fix this:
- Define your schema once with Pydantic models
- Let the agent reason freely
- Validate and type-check every response before it hits the next stage
Agents that produce DataFrames, not paragraphs. Numbers with provenance, not guesses.
Read the case study → https://pydantic.dev/case-studies/datalayer
If your agentic pipelines feed BI dashboards, compliance reports, or financial models — structured outputs aren't optional. They're the whole point.
#PydanticAI #AIAgents #DataEngineering #StructuredOutputs #Datalayer
X / Bluesky: Your AI agent returning "approximately 2.3 million, give or take" isn't a data product — it's a hallucination. We partnered with Pydantic AI to make agents produce DataFrames, not paragraphs. Case study → datalayer.io #PydanticAI #AIAgents
MCP Compose + OpenTelemetry: Observability for Your Agent's Toolchain
Your AI agent calls 6 MCP servers. One is slow.
Which one? Why?
We integrated MCP Compose with OpenTelemetry (via Logfire). Every tool invocation, traced end-to-end:
→ Latency per MCP server call, by tool name → Token counts at each hop → Error rates and retry patterns
Debugging multi-tool agents without observability = debugging a distributed system with print statements.
With OTEL tracing: single pane of glass across your entire agentic workflow.
Running MCP servers in production? Instrument them. Your 2 AM self will thank you.
#MCP #OpenTelemetry #Observability #AIAgents #Logfire #Datalayer
X / Bluesky: Your AI agent calls 6 MCP servers. One is slow. Which one? We integrated MCP Compose + OpenTelemetry so every tool invocation gets traced end-to-end. Instrument your agents. #MCP #OpenTelemetry #Datalayer
Datalayer for VS Code: Jupyter Kernels Meet Your Favorite Editor
Data scientists live in VS Code. AI agents need Jupyter kernels.
Why are those two different worlds?
Datalayer's VS Code extension kills the gap:
→ Connect to remote, GPU-powered kernels from the command palette → Run notebook cells against cloud runtimes — never leave your editor → AI agents use the same kernels your team uses for exploration
No JupyterHub tab. No SSH tunneling. No context switching.
The editor you love. The kernels you need. One workflow.
Try it → search "Datalayer" in the VS Code Marketplace.
#VSCode #JupyterKernels #DataScience #DeveloperExperience #Datalayer
X / Bluesky: Data scientists live in VS Code. AI agents need Jupyter kernels. Our extension connects them — remote GPU kernels from the command palette, zero context switching. Try it → VS Code Marketplace. #VSCode #Jupyter #Datalayer
Software Developers Have a Chicken-and-Egg Problem
AI writes better code than most junior and mid-level devs. Not a hot take — a benchmark result.
So what do you do if you're early in your career?
The path from junior → mid → senior → architect hasn't changed. The speed has. AI compresses the learning loop.
Developers who thrive will:
- Use AI to code 5× faster — spend the saved time understanding WHY it works
- Learn to review, architect, evaluate — skills AI can't replicate yet
- Position as orchestrators, not typists
Senior engineers: stop writing boilerplate. Start designing systems. Delegate execution to AI. Focus on judgment calls.
Treat AI as a replacement? Trouble. Treat it as a multiplier? Best decade of your career.
#SoftwareEngineering #AIAssistants #CareerGrowth #TechLeadership #CodingWithAI
X / Bluesky: AI writes better code than most junior devs. That's a benchmark result, not a hot take. The developers who thrive will be orchestrators, not typists. Treat AI as a multiplier and this is the best decade of your career. #CodingWithAI
Jupyter Viewer: A Modern NbViewer for 2026
Remember NbViewer? Fastest way to share a rendered notebook with anyone.
We built its successor.
Three ways to use Jupyter Viewer:
- Online — paste a GitHub URL, get a rendered notebook instantly
- Standalone —
jupyter viewer notebook.ipynblocally - JupyterLab extension — preview and share without leaving your dev environment
Notebooks tell stories. Jupyter Viewer makes sure the audience can actually read them.
No setup. No dependencies. No "can you install JupyterLab first?"
NbViewer paved the way. Jupyter Viewer picks up where it left off.
#Jupyter #DataScience #Notebooks #OpenSource #Datalayer
X / Bluesky: NbViewer was the fastest way to share a rendered notebook. We built its successor: Jupyter Viewer. Paste a URL, run locally, or use the JupyterLab extension. No setup required. #Jupyter #OpenSource #Datalayer
Custom Data Product with Jupyter React
- ...
Develop JupyterLab Extensions 3× Faster
Building a JupyterLab extension shouldn't feel like building a spaceship.
We created JupyterLabApp — a dev harness that strips away the ceremony:
→ Hot-reload in seconds, not minutes → Skip the full JupyterLab rebuild cycle → Focus on plugin logic, not build pipelines
Most extension devs spend 60% of their time waiting for builds. JupyterLabApp cuts that to near-zero.
You ship 3× faster. Your feedback loop shrinks from "rebuild, restart, click through 4 menus" to "save, see."
Building JupyterLab extensions without a fast dev loop? You're leaving days on the table every sprint.
#JupyterLab #DeveloperExperience #OpenSource #Productivity #Datalayer
X / Bluesky: JupyterLab extension devs spend 60% of time waiting for builds. JupyterLabApp cuts that to near-zero with hot-reload. Ship 3× faster. Save, see. #JupyterLab #DeveloperExperience #Datalayer
Jupyter Is (Still) Not an IDE — and That's the Point
Brian Granger, co-creator of Jupyter, said it clearly: "Jupyter is not an IDE."
Years later, the community is still trying to make it one. It hurts.
Jupyter is a protocol. A kernel gateway. A literate computing environment. Never meant to replace PyCharm or VS Code — meant to complement them.
The moment we stopped turning Jupyter into an IDE and started embedding Jupyter capabilities INTO IDEs — everything clicked.
At Datalayer:
→ Jupyter kernels as a backend service, not a UI framework → React.js components that embed anywhere — VS Code, web apps, dashboards → The notebook experience without the notebook application
Jupyter's superpower isn't the UI. It's the protocol.
Keynote → https://www.youtube.com/watch?v=IJO7_v7GEVc
#Jupyter #DataScience #SoftwareArchitecture #DeveloperTools #Datalayer
X / Bluesky: "Jupyter is not an IDE" — Brian Granger. Years later the community still tries to make it one. At Datalayer we embed Jupyter INTO IDEs instead. The superpower isn't the UI — it's the protocol. #Jupyter #DataScience
Jupyter Is for Us Just Like Kubernetes
Hot take: Jupyter and Kubernetes solve the same problem at different layers.
Kubernetes abstracts infrastructure — declare what you want, the system figures out where to run it.
Jupyter abstracts compute — write code in a cell, the kernel figures out where to execute it. Local, remote, GPU, CPU, cloud, edge.
At Datalayer, we lean into this intentionally:
→ Kernels are pods. Scheduled, scaled, garbage-collected. → Notebooks are declarative specs. They describe workflows, not infrastructure. → The Jupyter server is the control plane.
Once you think "Kubernetes for compute sessions," a lot of architectural decisions suddenly make sense.
And yes — we run our Jupyter kernels ON Kubernetes. Turtles all the way down.
#Jupyter #Kubernetes #CloudNative #DataInfrastructure #Datalayer
X / Bluesky: Jupyter and Kubernetes solve the same problem at different layers. Kernels are pods. Notebooks are specs. The server is the control plane. We run our kernels ON Kubernetes. Turtles all the way down. #Jupyter #Kubernetes #Datalayer
Jupyter React Kernel Indicator: Seeing the Invisible
Ever stare at a notebook wondering: is the kernel busy, idle, or dead?
We built a Kernel Indicator component that makes state impossible to miss:
→ Color-coded: idle, busy, starting, restarting, dead → Latency metrics for remote kernels → Connection quality indicator
Sounds simple. But when Jupyter is embedded in a production web app, the difference between "thinking" and "crashed" determines whether your user waits patiently or files a bug.
Small component. Massive UX impact.
#Jupyter #ReactJS #UXDesign #DataScience #Datalayer
X / Bluesky: Is the kernel busy, idle, or dead? Our React Kernel Indicator makes it impossible to miss. Color-coded status + latency metrics + connection quality. Small component, massive UX impact. #Jupyter #ReactJS #Datalayer
The "InContainer" Pattern: Innovating and Securing on Kubernetes
An infrastructure pattern we don't talk about enough: InContainer.
Instead of a full VM or pod per user — give them a secure, isolated process INSIDE an already-running container.
→ Startup in milliseconds, not minutes → Resource sharing without contention → Process-level security, container-level isolation as the outer ring
At Datalayer, each user gets an isolated kernel process inside a pre-warmed container. Fast. Secure. Efficient.
The middle ground between "shared Jupyter server" (scary) and "one pod per user" (expensive).
Running multi-tenant compute on Kubernetes? Study this pattern.
#Kubernetes #CloudSecurity #Infrastructure #DevOps #Datalayer
X / Bluesky: The InContainer pattern: isolated process INSIDE a running container. Millisecond startup, shared resources, process-level security. The sweet spot between "shared server" (scary) and "pod per user" (expensive). #Kubernetes #Datalayer
Clouder: A Kubernetes Operator for Cloud Resources
Managing cloud resources shouldn't require a PhD in Terraform.
We built Clouder — a Kubernetes operator that treats cloud resources as first-class K8s objects.
→ Declare a database, storage bucket, or GPU cluster as a Custom Resource → Clouder provisions, monitors, and cleans up automatically → Works across managed services (RDS, Cloud SQL) and raw compute
Your team knows kubectl? They shouldn't need 3 more CLIs to provision what their notebooks and agents need.
One API surface. One reconciliation loop. All your cloud resources, the Kubernetes way.
#Kubernetes #CloudNative #InfrastructureAsCode #DevOps #Datalayer
X / Bluesky: Managing cloud resources shouldn't need a PhD in Terraform. Clouder: a K8s operator that treats databases, buckets, and GPU clusters as Custom Resources. One API, one reconciliation loop. #Kubernetes #CloudNative #Datalayer
The Content Should Be Owned by the Kernel, Not the Server
Unpopular opinion: the Jupyter Server should NOT own your notebook content.
Today, the server stores and manages .ipynb files. The kernel just executes code.
But the kernel knows the state. The variables. The execution order. The outputs.
What if we flipped it?
→ The kernel owns the document state → The notebook UI is just a view → The server is a relay, not a content manager
Kernel-first architecture means: → Collaboration becomes a kernel-state sync problem (well-understood) → Outputs are always consistent with execution state → Multiple UIs attach to the same kernel session seamlessly
The kernel is the source of truth. Everything else is a projection.
#Jupyter #SoftwareArchitecture #DataScience #OpenSource #Datalayer
X / Bluesky: The Jupyter Server shouldn't own your notebook content. The kernel knows the state, the variables, the outputs. Flip it: kernel owns the doc, notebook is just a view. Everything else is a projection. #Jupyter #Architecture
The Missing API in Jupyter Server
Jupyter Server has APIs for files, kernels, sessions, and terminals.
Know what it doesn't have? Authorization. Multi-tenancy. Resource quotas.
Every team building multi-user Jupyter has felt this. JupyterHub handles auth but punts on fine-grained authorization. The server has zero concept of "this user can see these files but not those."
At Datalayer, we filled the gap:
→ Token-based authorization per resource → Quota management at kernel and storage level → Proper RBAC between client and Jupyter server
This isn't a feature request. It's an architectural gap every serious deployment works around.
Time to fill it.
#Jupyter #API #Authorization #DataInfrastructure #Datalayer
X / Bluesky: Jupyter Server has APIs for files, kernels, sessions. Know what's missing? Authorization, multi-tenancy, resource quotas. We built the RBAC layer every serious Jupyter deployment needs. #Jupyter #API #Datalayer
Datalayer Examples: Learn by Running
Documentation is great. Running code is better.
We open-sourced examples for every Datalayer capability:
→ Embedding Jupyter cells in React.js apps → Connecting to remote kernels with auth → Building agent workflows with MCP servers → Deploying notebook-based data products
Every example is a working repo. Clone it. Run it. Break it. Learn.
No "exercise left to the reader." No pseudo-code. Just working end-to-end examples.
Browse them → https://github.com/datalayer/examples
#OpenSource #DataScience #DeveloperExperience #LearnByDoing #Datalayer
X / Bluesky: Documentation is great. Running code is better. We open-sourced working examples for every Datalayer capability — Jupyter + React, remote kernels, MCP agents, data products. Clone, run, learn. github.com/datalayer/examples #OpenSource #Datalayer
Why We Don't Need a "JupyterLab Engineer" Role
Some teams have a dedicated "JupyterLab Engineer." Full-time job: maintain and extend JupyterLab.
That's a symptom, not a solution.
If your platform requires a dedicated engineer just to keep running, you have too much accidental complexity. Extensions break on upgrades. Themes drift. The build system is fragile.
Our approach: make it simple enough that any frontend engineer can contribute.
→ React.js components, not custom widget frameworks → Standard npm packages, not JupyterLab-specific plugin arcana → A build system grad students can understand
The goal: lower the barrier so expertise compounds across the team, not concentrates in one person.
#Engineering #JupyterLab #TeamScaling #DeveloperExperience #Datalayer
X / Bluesky: If your notebook platform needs a dedicated engineer just to keep running, that's a symptom. We made it simple enough for any frontend dev to contribute. React components, npm packages, no arcana. #JupyterLab #Datalayer
Running Sessions: From Lumino to React.js
JupyterLab's session management is built on Lumino — a PhosphorJS descendant that predates modern React.
Lumino is solid. Dock panels, menus, keyboard shortcuts. But it's a parallel universe to the React ecosystem 90% of frontend devs live in.
At Datalayer, we moved session management into React:
→ useSession() hooks tracking kernel lifecycle
→ React context providers for multi-kernel environments
→ Standard React state management, not Lumino signals
Any React dev on your team can build on Jupyter sessions. No Lumino crash course required.
This isn't about Lumino being bad. It's about meeting developers where they are.
#ReactJS #Jupyter #FrontendDevelopment #DeveloperExperience #Datalayer
X / Bluesky: JupyterLab sessions run on Lumino — a parallel universe to React. We moved it all into useSession() hooks and React context. Any React dev can now build on Jupyter. No Lumino crash course. #ReactJS #Jupyter #Datalayer
Naming Is the Hardest Thing in Software
"Cache invalidation and naming things." — Phil Karlton
Nowhere more true than Jupyter.
→ KernelManager exists in both server AND client. Different classes, same name.
→ A "session" isn't a user session — it's a notebook-to-kernel mapping.
→ "Contents" = files, not cell content.
→ "Client" sometimes means browser, sometimes a Python library.
Every new contributor hits these collisions. Every explanation starts with "well, depends which KernelManager you mean."
The cost compounds. Every ambiguous name is a tax on onboarding, debugging, and documentation.
Name things as if the next person has never seen your codebase. Because they haven't.
#SoftwareEngineering #Naming #DeveloperExperience #OpenSource #Datalayer
X / Bluesky: Jupyter has a
KernelManagerin both server AND client. Different classes, same name. A "session" isn't a user session. "Contents" means files. Every ambiguous name is a tax on every contributor. #SoftwareEngineering #Naming
Jupyter Kernels Are Like AWS EC2 Instances
Think about EC2:
- Request an instance with specific resources (CPU, RAM, GPU)
- Starts in seconds
- Connect, run workload, disconnect
- Still running until you stop it
- Reconnect anytime
Now replace "EC2 instance" with "Jupyter kernel."
At Datalayer, that's exactly how we model it:
→ Kernels provisioned on-demand with resource specs → Persist independently of notebook sessions → Multiple clients connect to the same kernel → Scheduled, scaled, cleaned up automatically
Stop thinking "the thing that runs when I press Shift+Enter." Start thinking "compute instances."
Kernels are your fleet. Manage them accordingly.
#Jupyter #CloudCompute #DataInfrastructure #AWS #Datalayer
X / Bluesky: EC2: request resources, starts in seconds, reconnect anytime. Now replace "EC2 instance" with "Jupyter kernel." Same model. Kernels are your compute fleet — manage them accordingly. #Jupyter #CloudCompute #Datalayer
The In and Out of Datalayer IO
"Datalayer" — unusual name. What does it mean?
Data. Layer. Input. Output.
We sit between your data and your applications. The layer that makes data accessible to AI agents, interactive notebooks, and automated pipelines.
Data in: streams, files, APIs, databases. Data out: analyses, reports, dashboards, agent actions.
The "IO" in datalayer.io isn't an accident. It's the mission.
Every feature — remote kernels, MCP servers, notebook embedding — serves one purpose: get data in, transform it, get insights out.
Simple name. Clear mission. Relentless execution.
#Datalayer #DataEngineering #Mission #Startups
X / Bluesky: Data. Layer. Input. Output. We sit between your data and your apps. Remote kernels, MCP servers, notebook embedding — all to get data in and insights out. That's the IO in datalayer.io. #Datalayer
From Full Stack to Cross-Stack
"Full stack" was the dream. Frontend + backend + database = one person does it all.
The stack changed:
→ Frontend (React, mobile) → Backend (APIs, microservices) → Data layer (notebooks, pipelines, kernels) → AI layer (agents, LLMs, MCP servers) → Infrastructure (Kubernetes, GPUs, observability)
No single person covers all of this.
The new archetype: cross-stack.
A cross-stack engineer doesn't master every layer. They understand the interfaces BETWEEN layers. Enough about each to debug across boundaries and design systems that don't break at the seams.
At Datalayer, we're cross-stack by necessity. React.js, Python kernels, K8s operators, and LLM agents — often in the same PR.
Full stack is over. Cross-stack is here.
#SoftwareEngineering #FullStack #Engineering #CareerDevelopment #Datalayer
X / Bluesky: "Full stack" is over. The real stack now: frontend, backend, data, AI, infrastructure. No one person covers it all. The new archetype is cross-stack — mastering the interfaces between layers. #SoftwareEngineering #Datalayer
Deno Kernel vs. JupyterLite JavaScript Kernel
Two approaches to JavaScript in Jupyter. Same language, different philosophies.
JupyterLite JavaScript Kernel: → Runs entirely in the browser via WebAssembly → Zero server required. Perfect for demos and education. → Limited to browser APIs
Deno Kernel: → Runs server-side on the Deno runtime → Full file system and network access → TypeScript-first with built-in tooling
Our take: both have a place.
JupyterLite wins for shareability — embed on any webpage, it just works. Deno wins for real workloads — data processing, API calls, file manipulation.
At Datalayer, we support both. Your kernel choice should depend on your use case, not platform limitations.
#JavaScript #Deno #Jupyter #WebAssembly #Datalayer
X / Bluesky: JupyterLite JS kernel: browser-only, zero server, great for demos. Deno kernel: server-side, full access, real workloads. Both have a place — we support both. #JavaScript #Deno #Jupyter #Datalayer
Kernel First: Inverting the Jupyter Architecture
Traditional Jupyter: the server is the center. It manages files, spawns kernels, routes messages.
We flipped it. Kernel first.
The kernel is the primary compute unit. Everything else — notebook UI, file system, collaboration layer — connects TO the kernel.
Why it matters:
→ IPyWidgets become a kernel responsibility, not a server one → Notebooks become lightweight, trivially replaceable clients → Multi-client (VS Code + web UI + agent) works naturally — kernel is single source of truth
This isn't theoretical. It's how Datalayer's agent runtime works. Agent connects to a kernel. Human connects too. Same kernel. Same state. True collaboration.
#Jupyter #SoftwareArchitecture #AIAgents #DataScience #Datalayer
X / Bluesky: Traditional Jupyter: server at the center. We flipped it: kernel first. The kernel owns state. Notebooks are just views. Agent + human connect to the same kernel. True collaboration. #Jupyter #AIAgents #Datalayer
Jupyter Stories: How Teams Actually Use Notebooks
We asked 50 teams how they use Jupyter in production.
Nobody uses it "just for exploration" anymore.
→ Financial teams run compliance checks as parameterized notebooks → ML engineers treat notebooks as source of truth for training runs → Data analysts version notebooks in Git like code → DevOps teams embed cells in monitoring dashboards
The common thread: Jupyter scaled beyond the data scientist's laptop. It's a production tool — and infrastructure hasn't caught up.
That's the gap Datalayer fills. Runtime. Collaboration. Deployment. Turning notebooks from messy experiments into reliable data products.
What's your Jupyter story?
#Jupyter #DataScience #DataProducts #MLOps #Datalayer
X / Bluesky: Asked 50 teams how they use Jupyter in production. Nobody said "just for exploration." Compliance checks, training runs, Git-versioned analysis, monitoring dashboards. It's a production tool now. #Jupyter #DataScience #Datalayer
Kernel Clients: There's a Kernel Client, but No Jupyter Client
Jupyter has jupyter_client — a Python library to talk to kernels.
But there's no jupyter_client for JavaScript.
No official SDK for connecting a web app to a Jupyter kernel with proper auth, reconnection, and state management.
We built one.
Datalayer's JavaScript kernel client handles:
→ WebSocket connections with automatic reconnection → Token or OAuth authentication → Message queuing during network interruptions → Full ZeroMQ-style channel multiplexing over a single WebSocket
Open-sourced. Because if you're embedding Jupyter in a web app, you shouldn't reinvent the communication layer.
The kernel protocol is beautiful. Accessing it from JavaScript should be too.
#JavaScript #Jupyter #OpenSource #WebDevelopment #Datalayer
X / Bluesky: Jupyter has a Python kernel client. No JavaScript one. We built it: WebSocket reconnection, OAuth auth, message queuing, channel multiplexing. Open-sourced. The kernel protocol deserves a proper JS SDK. #Jupyter #JavaScript #Datalayer
Building Datalayer Like a Music Group
Every startup metaphor involves sports teams or military units. Here's ours: a music group.
In a band: → Everyone knows their instrument AND the song → Rehearse, then improvise → Best performances come from deep trust, not rigid scores → Bad timing destroys the set. A well-timed solo makes it legendary.
At Datalayer: → Engineers own their domain but understand the whole product → Structure (sprints, reviews) + space for creative deviation → Ship on a rhythm — Friday release cadence → Best features come from someone improvising a solution nobody planned
Startups aren't armies. They're jazz ensembles.
#StartupCulture #TeamBuilding #Engineering #Music #Datalayer
X / Bluesky: Startups aren't armies. They're jazz ensembles. Rehearse then improvise. Ship on a rhythm. The best features come from someone improvising a solution nobody planned for. #StartupLife #Datalayer
Kernel Session Killing: Don't Kill the Kernel
Closing a browser tab should NOT kill your kernel.
Today in most Jupyter deployments: close a session, kernel dies. All variables, loaded models, warmed-up state — gone.
That's like SSH into a server, start a 3-hour training job, terminal disconnects, job dies.
We fixed this:
→ Kernels persist independently of notebook sessions → Close the tab. Reopen. Your state is still there. → Multiple clients attach to the same living kernel
Kernel lifecycle ≠ session lifecycle. Always.
Your kernel is not your tab.
#Jupyter #DataScience #DeveloperExperience #Infrastructure #Datalayer
X / Bluesky: Close a browser tab → kernel dies → all your state gone. That's broken. We decoupled kernel lifecycle from session lifecycle. Close the tab. Reopen. State is still there. #Jupyter #Datalayer
From Monorepo to Metarepo
Started with a monorepo. Got unwieldy. Moved to something in between: a metarepo.
Monorepo: everything in one repo. Simple but slow at scale. Multi-repo: everything separate. Fast but coordinated releases = nightmare.
Metarepo: thin orchestration layer managing multiple repos as a cohesive unit.
→ Shared versioning across repos → Coordinated CI/CD pipelines → One command to clone, build, and test the entire ecosystem
Tools like meta (github.com/mateodelnorte/meta) make this practical.
At Datalayer: Jupyter components, Python packages, web apps in separate repos — shipping coordinated releases every Friday.
Monorepo is a good default. Metarepo is the escape hatch.
#DevOps #Monorepo #SoftwareEngineering #OpenSource #Datalayer
X / Bluesky: Monorepo: simple but slow. Multi-repo: fast but release coordination is a nightmare. Metarepo: thin orchestration layer, shared versioning, one command to build everything. The escape hatch that works. #DevOps #SoftwareEngineering
Friday Releases: We Have a Plan, Time to Roll It Out
Every Friday, we ship. No exceptions.
#FridayReleases isn't just a hashtag — it's a discipline.
Why it works:
- Weekly cadence forces work to stay small and shippable
- Friday shipping = Monday is feedback, not deployment anxiety
- Users get a predictable rhythm
- Kills the "just one more thing" death spiral
Hardest part? Not the shipping. The scoping.
Every Monday: "What can we FINISH by Friday?" Not "what do we want to do" — what can we FINISH.
Small batches. Predictable rhythm. Compounding improvements.
Ship. Every. Friday.
#ShipIt #FridayReleases #ProductDevelopment #StartupLife #Datalayer
X / Bluesky: Every Friday, we ship. No exceptions. The hardest part isn't shipping — it's scoping. "What can we FINISH by Friday?" Small batches. Predictable rhythm. Compounding improvements. #FridayReleases #ShipIt #Datalayer
Less Is More: The Case for Headless Jupyter
JupyterLab: full IDE in the browser. JupyterHub: multi-user server manager. Both feature-rich. Both carry baggage you might not need.
What if we stripped them down?
→ JupyterLab Headless: kernel + file APIs only. No UI. Embed your own. → Jupyter Serverless: kernels on demand, gone when idle. No long-running server. → JupyterHub Less: auth without the authorization model overhead.
Most production Jupyter use cases need LESS, not more. Teams want the kernel protocol, not the Lab UI. Auth, not Hub's full stack.
The fastest system has the fewest moving parts.
Sometimes less really is more.
#Jupyter #MinimalArchitecture #DataInfrastructure #OpenSource #Datalayer
X / Bluesky: Most production Jupyter use cases need LESS, not more. The kernel protocol, not the Lab UI. Auth, not Hub's full stack. We built headless, serverless, and hub-less options. Less is more. #Jupyter #Datalayer
So I Have a GPU — Now What?
Team got approved for GPU instances. Exciting!
…now what?
Common journey:
- Get GPU. Install CUDA. Fight version mismatches.
- Notebook can't see the GPU. Debug for 2 hours.
- Train a model. Forget to stop the instance. $3,000 surprise bill.
- Need to share with a colleague. No isolation.
We abstracted this away:
→ Kernels with GPU profiles — request what you need, provisioned automatically → Automatic idle shutdown — no surprise bills → Multi-user GPU sharing with resource isolation → One click from "I need a GPU" to "my model is training"
Getting a GPU is easy. Making it useful for a team is hard.
We solved the hard part.
#GPU #MachineLearning #CloudCompute #DataScience #Datalayer
X / Bluesky: Got a GPU? Common path: CUDA version hell → notebook can't see it → surprise $3K bill → no sharing. We fixed it: GPU kernel profiles, auto idle shutdown, multi-user isolation. One click to training. #GPU #Datalayer
Scaling Down Is Harder Than Scaling Up
Everyone talks about scaling up. Few talk about scaling down.
Scaling up is exciting: more users, more servers, more GPUs. Throw resources at the problem.
Scaling down is terrifying: idle kernels burning money at 3 AM. GPU instances at 2% utilization because someone forgot to shut them down.
The engineering challenges: → Graceful draining without data loss → Distinguishing truly idle vs. "thinking" resources → Rebuilding state quickly when demand returns
At Datalayer: → Automatic idle detection + kernel hibernation → K8s autoscaling that actually scales to zero → State checkpointing so restarts are fast, not fresh
Any startup can scale up with money. Scaling down with elegance? That's engineering.
#CloudOptimization #Kubernetes #CostManagement #Infrastructure #Datalayer
X / Bluesky: Everyone talks about scaling up. Scaling down is harder. Idle kernels at 3 AM. GPUs at 2% utilization. We built: auto idle detection, K8s scale-to-zero, state checkpointing. Elegance > money. #CloudOptimization #Datalayer
Kubernetes: Add and Remove Nodes Like Breathing
Kubernetes' killer feature isn't container orchestration. It's elastic node management.
Need compute? Nodes spin up. Demand drops? Nodes drain and terminate. Your cluster breathes.
But most Jupyter deployments don't use this. Fixed cluster. Pray it's the right size.
At Datalayer, kernels are Kubernetes-native:
→ Each kernel = a pod (or process) → Autoscaler watches kernel demand, not just CPU → New nodes join in minutes. Drained nodes leave clean.
Result: compute bill mirrors actual usage, not worst-case estimates.
Stop sizing for peak demand. Let Kubernetes breathe.
#Kubernetes #AutoScaling #CloudNative #CostOptimization #Datalayer
X / Bluesky: K8s killer feature: elastic nodes. Need compute? Nodes spin up. Demand drops? They drain. Our kernels are K8s-native — bill mirrors actual usage, not worst-case. Let Kubernetes breathe. #Kubernetes #CloudNative #Datalayer
Kicking Up and Down: The Art of Vertical Communication
In a startup, you kick information two directions:
Kicking up: Technical complexity → business impact for leadership. "We reduced kernel cold-start time" becomes "users wait 3 seconds instead of 30."
Kicking down: Business goals → technical requirements. "Win Enterprise deals" becomes "SOC 2, RBAC, audit logs."
The best engineers do both. They don't just write code — they translate between worlds.
At Datalayer, every engineer presents to customers. Every business conversation includes a technical person.
Kicking up and down isn't a management skill. It's a team muscle.
If your engineers can't explain their work to non-engineers, that's not a communication problem. It's a product-understanding problem.
#Leadership #StartupLife #Engineering #Communication #Datalayer
X / Bluesky: Best engineers translate both ways. "Reduced cold-start time" becomes "3 seconds instead of 30." "Win Enterprise" becomes "SOC 2 + RBAC + audit logs." Communication isn't soft — it's engineering. #Leadership #Engineering
Hiring vs. Firing: The Asymmetry No One Talks About
Hiring takes weeks. Firing takes months. The asymmetry costs more than you think.
Every slow firing: → Team compensates, strong performers burn out → Culture erodes, accountability disappears → The person struggles in a role that doesn't fit (bad for everyone)
Every rushed hire: → Onboarding debt compounds → Cultural mismatches found too late → Hired for resume, not the team
What we've learned at 10 people: hire slowly and deliberately. If it's not working, address it fast — with kindness, but with speed.
The goal isn't to fire quickly. It's to never let someone languish where they can't succeed. That's not mercy. That's neglect.
#Hiring #StartupLife #Leadership #TeamBuilding #Datalayer
X / Bluesky: Hiring takes weeks. Firing takes months. Every slow firing burns out the strong. Every rushed hire compounds onboarding debt. Hire slowly. Address mismatches fast — with kindness AND speed. #StartupLife #Leadership
Jupyter Kernels: More Than You Think
Quick quiz: how many types of Jupyter kernels exist?
Most say "Python." Some say "Python, R, Julia."
Real answer: 100+. And they don't all work the same.
- Native kernels: IPython, IJulia, IRkernel — tight language integration
- Wrapper kernels:
ipykernelmachinery wrapping any REPL - Remote kernels: execute on a different machine. UI never knows.
- Browser kernels: WebAssembly (JupyterLite, Pyodide)
- Agent kernels: AI agents using the kernel as code execution tool
At Datalayer, we connect to all of them through a single interface. Your notebook doesn't care if the kernel is local, remote, GPU-powered, or running in a browser tab.
The Jupyter kernel protocol: the USB of compute.
#Jupyter #Kernels #DataScience #OpenSource #Datalayer
X / Bluesky: How many Jupyter kernel types exist? 100+. Native, wrapper, remote, browser, agent. We connect to all of them through one interface. The Jupyter kernel protocol is the USB of compute. #Jupyter #Kernels #Datalayer
3 Types of Kernels in the Same JupyterLab
Something most Jupyter users never try: 3 kernel types in the same session.
→ Tab 1: Local Python kernel for quick scripting → Tab 2: Remote GPU kernel for model training → Tab 3: In-browser Pyodide kernel for a demo
Same UI. Three completely different execution environments.
At Datalayer, we made this seamless:
→ Kernel picker showing local, remote, and browser kernels in one list → Transparent connection: WebSocket for remote, SharedArrayBuffer for in-browser → Unified status indicator for all active kernels
Your JupyterLab should be a cockpit for compute, not a single-kernel terminal.
Mix and match.
#Jupyter #JupyterLab #DataScience #RemoteCompute #Datalayer
X / Bluesky: 3 kernel types in one JupyterLab: local Python, remote GPU, in-browser Pyodide. Same UI, three execution environments. Your notebook should be a compute cockpit, not a single-kernel terminal. #Jupyter #Datalayer
Jupyter UI Storybook: See Before You Ship
How do you test 50+ React components that wrap Jupyter functionality?
You build a Storybook.
Our Jupyter UI Storybook:
→ Every component in isolation: cells, notebooks, terminals, file browsers → Interactive knobs to test props and configurations → Playwright visual regression tests on every PR
We catch UI regressions before they ship. New devs explore every component without reading source code.
Building a component library that talks to a backend like Jupyter? A Storybook isn't nice-to-have. It's insurance against visual chaos.
See it. Test it. Ship it.
#Storybook #ReactJS #Testing #UIEngineering #Datalayer
X / Bluesky: 50+ React components wrapping Jupyter. How to test them? Storybook. Every component isolated, interactive knobs, Playwright visual regression on every PR. See it, test it, ship it. #Storybook #ReactJS #Datalayer
Pick Your JupyterLab Plugins and Create a React.js Web App
What if you cherry-picked JupyterLab features and dropped them into a standard React app?
That's exactly what we built.
Most teams don't need all of JupyterLab. They need: → Code editor with syntax highlighting → Kernel connection + cell execution → Maybe the file browser → Definitely NOT the menu system, dock panels, and settings editor
With Datalayer: pick plugins, compose as React components, ship a web app that looks like YOUR product — not JupyterLab in a costume.
Your users don't need to know Jupyter is under the hood. They just know it works.
#ReactJS #Jupyter #WebDevelopment #DataProducts #Datalayer
X / Bluesky: Cherry-pick JupyterLab features, drop them into a React app. Code editor, kernel connection, file browser — skip the rest. Your product, not JupyterLab in a costume. #ReactJS #Jupyter #Datalayer
The Literate Editor: Where Prose Meets Code
Donald Knuth envisioned literate programming in 1984: code woven with explanation, readable as narrative.
Jupyter got us 80% there. The editor experience for prose? Still rough.
We're building a Literate Editor:
→ Rich text editing (not just Markdown cells) with real-time formatting → Code cells executing inline, outputs flowing into the narrative → Version control treating prose and code as equal citizens
The end game: a document that reads like a report, executes like a script, versions like code.
Data products aren't just code. They're arguments. Explanations. Decisions. The editor should support all of it.
Literate computing is 40 years old. Time to get the UX right.
#LiterateProgramming #DataScience #Notebooks #TechnicalWriting #Datalayer
X / Bluesky: Knuth envisioned literate programming in 1984. Jupyter got us 80% there. We're building the last 20%: rich text + inline code execution + Git-friendly versioning. Reads like a report, runs like a script. #LiterateProgramming #Datalayer
Jupyter React: Authentication and Authorization Built In
Embedding Jupyter in your app is easy. Embedding it SECURELY is hard.
Most deployments run with a single token. Everyone with the token = superuser. Fine for local dev. Catastrophic for production.
Jupyter React ships with auth built in:
- Simple editor mode: syntax highlighting, no kernel. Zero auth needed.
- Authenticated mode: token or OAuth-based kernel connections.
- Authorized mode: role-based access to specific kernels and files.
Plus performance: → React 18 concurrent rendering for smooth editing → Chunk-loaded notebooks for large documents → Monaco editor for VS Code-grade autocomplete
Security isn't a bolt-on feature. It's a day-one design decision.
#Security #Jupyter #ReactJS #Authentication #Datalayer
X / Bluesky: Most Jupyter deployments: single token = everyone is superuser. Fine for dev. Catastrophic for prod. Jupyter React ships with auth built in — simple, authenticated, or RBAC-authorized mode. Security on day one. #Jupyter #Security #Datalayer
Jupyter React: The iframe Killer
- You still embed Jupyter with an iframe.
If that made you wince, you're not alone.
Iframes were the quick-and-dirty solution. They come with: → No communication between host app and notebook → Double scrollbars. Triple if you're unlucky. → CSS conflicts. Z-index nightmares. → Zero control over UX inside the frame
Jupyter React replaces the iframe entirely:
→ React components rendering natively in your DOM → Full programmatic control: execute cells, read outputs, set variables → Your theme, your layout, your auth — no frame boundaries
Still using iframes? You're not embedding. You're framing.
Time to upgrade.
#ReactJS #Jupyter #WebDevelopment #FrontendEngineering #Datalayer
X / Bluesky: Still embedding Jupyter with an iframe? Double scrollbars, CSS conflicts, zero control. Jupyter React: native React components, full programmatic control, your theme. You're not embedding — you're framing. Upgrade. #ReactJS #Jupyter #Datalayer
Jupyter Was Serverless Before Serverless
- Jupyter already had:
→ Stateless client (browser) writing code → Backend process (kernel) spinning up on demand → Process scales independently, hibernates, or dies without losing work → Client and server communicate via stateless messages
Sound familiar? That's the serverless function model — years before AWS Lambda.
Jupyter invented serverless compute without calling it that. The kernel IS a function-as-a-service runtime. It just maintains state between invocations (arguably better).
Sometimes the best ideas aren't ahead of their time. They're just named something else.
#Jupyter #Serverless #CloudCompute #TechHistory #Datalayer
X / Bluesky: 2014: Jupyter had stateless clients, on-demand backend processes, stateless messaging. That's the serverless model — years before Lambda. The kernel is FaaS that keeps state. Best ideas just get named later. #Jupyter #Serverless
Kernel Provisioning: The Hidden Complexity
User clicks "New Notebook." What happens?
- Server selects a kernel spec
- Provisioner decides WHERE to run (local? container? remote cluster?)
- Resources allocated (CPU, RAM, maybe GPU)
- Kernel process starts, registers connection info
- Notebook connects via kernel protocol
5 steps. Most invisible. All customizable.
Kernel provisioning = where Jupyter meets infrastructure.
Decisions: → Shared resources or dedicated? → Kernels survive server restarts? → 20 kernels per user or 2?
At Datalayer: custom provisioner, kernels as K8s pods, resource quotas, health checks. User sees "kernel started." System sees a pod spec + resource claim.
Invisible when it works. Everything when it breaks.
#Jupyter #Kubernetes #Infrastructure #DataPlatform #Datalayer
X / Bluesky: "New Notebook" = 5 invisible steps: spec selection, provisioner routing, resource allocation, process startup, protocol connection. We made all of them customizable via K8s. Invisible when working. Everything when broken. #Jupyter #Kubernetes
Sort Before You Talk About AI
Hot take: if you can't sort data at scale, you're not ready for AI.
AI conversations jump straight to models, embeddings, vector databases. Fundamentals still matter.
→ 3 items? Conditional swaps. Done. → 3 million? Merge sort or Timsort. O(n log n). Know your memory budget. → 3 trillion? External sort. Distributed sort. MapReduce. The algorithm isn't hard — the I/O is.
Every AI pipeline has a sorting problem hiding in it. Ranking. Deduplication. Top-k. Window functions.
Before you import torch, make sure you understand sorted().
Fundamentals don't go out of style. They just get bigger.
#Algorithms #DataEngineering #FundamentalsMatter #AI #Datalayer
X / Bluesky: Can't sort data at scale? Not ready for AI. Every pipeline has a sorting problem: ranking, dedup, top-k. 3 items → swaps. 3M → merge sort. 3T → distributed I/O. Before
import torch, understandsorted(). #DataEngineering #AI
Jupyter Traitlets: The Configuration System Nobody Understands
Ever added c.ServerApp.token = 'my-token' to a Jupyter config file? You used Traitlets without knowing it.
Traitlets = typed attributes + validation + defaults + dynamic notification. Jupyter's entire config layer runs on it.
What most devs miss:
→ Runtime type validation. Set a port to a string? Exception.
→ Cascade: CLI > config file > env var > default.
→ Observable: self.observe(callback, names=['my_trait']) — reactive config.
Powerful system. Deeply unfamiliar to devs who think in dataclasses or Pydantic.
We bridge the gap: Traitlets config exposed via environment variables and API endpoints. Users get familiarity. Jupyter gets type safety.
Traitlets are Jupyter's secret weapon. They just need better PR.
#Jupyter #Python #Configuration #OpenSource #Datalayer
X / Bluesky: Jupyter's entire config runs on Traitlets — typed attributes with cascade (CLI > file > env > default) and runtime validation. Powerful but unknown. We expose it via env vars and APIs. Jupyter's secret weapon needs better PR. #Jupyter #Python
Why Jupyter Matters More Than Ever
AI agents need a runtime. The Jupyter kernel protocol is the best one ever designed for interactive computation.
What Jupyter gives you: → Language-agnostic execution protocol → Rich outputs: HTML, images, LaTeX, interactive widgets → Introspection and completion APIs built into the protocol → Massive kernel ecosystem for every language
Our agents use Jupyter kernels as hands. LLM reasons. Kernel acts. Output protocol shows results.
Jupyter isn't a notebook app. It's the runtime standard for computational work.
In 2026, that matters more than ever.
#Jupyter #AIAgents #DataScience #OpenSource #Datalayer
X / Bluesky: AI agents need a runtime. Jupyter kernel protocol = the best interactive compute interface ever built. Language-agnostic. Rich outputs. Our agents reason with LLMs, act through kernels. Jupyter isn't a notebook app — it's the runtime standard. #Jupyter #AI
My New Laptop Is Less Powerful Than My Previous One (And That's Fine)
First time ever: I downgraded my laptop.
Previous: 64 GB RAM, 12-core, discrete GPU. Current: 16 GB RAM, 8-core, integrated graphics.
Why? My compute isn't local anymore.
→ Heavy workloads → cloud kernels (Datalayer-provisioned) → Model training → GPU instances (auto-scaled) → CI/CD → hosted runners → Boilerplate → AI-generated (someone else's GPU)
My laptop is a thin client with a nice keyboard. Most productive setup I've ever had.
"Spec for your heaviest workload" is dead. "Connect to the cloud" is here.
Save the money. Invest in cloud credits.
#RemoteCompute #CloudDevelopment #Productivity #Datalayer
X / Bluesky: Downgraded my laptop for the first time. 64GB → 16GB. Why? Compute isn't local anymore. Cloud kernels, auto-scaled GPUs, hosted CI. Laptop = thin client + nice keyboard. Most productive setup ever. Invest in cloud credits, not RAM. #CloudDev
Hot-Reload for JupyterLab Development: The Secret to 3× Velocity
Default JupyterLab extension dev loop:
- Edit → 2. Build → 3. Restart → 4. Navigate back → 5. Test → 6. Repeat
30-60 seconds. Every. Single. Change.
With HMR:
- Edit → 2. See the change instantly.
Sub-second feedback. That's it.
We open-sourced it: https://github.com/datalayer-examples/jupyterlab-hot-reload-example
60-second loop vs 1-second loop isn't a speed difference. It's a behavior change. You experiment more. Try bolder ideas. Catch issues earlier.
Building JupyterLab extensions without hot-reload? You're not slow. You're doing slow.
#JupyterLab #DeveloperExperience #HotReload #Productivity #Datalayer
X / Bluesky: JupyterLab extension dev: edit → build → restart → navigate → test → repeat. 60 seconds per change. With HMR: edit → see it instantly. We open-sourced the setup. You're not slow — you're doing slow. #JupyterLab #HotReload #DX
Are JupyterLab Extensions Microservices?
Hear me out.
A JupyterLab extension: → Own lifecycle (activate, deactivate) → Exposes APIs via tokens → Deployed independently → Well-defined interfaces → Can fail without crashing the host
That's a microservice. Running inside a browser.
Lumino/JupyterLab plugin system = dependency-injection framework for frontend microservices. Each extension provides and consumes services.
The catch? No network boundary. When one extension breaks another via shared state, there's no isolation safety net.
Write better extensions: → Keep surfaces small → Avoid shared mutable state → Version your service tokens
Extensions ARE microservices. Treat them accordingly.
#JupyterLab #Microservices #FrontendArchitecture #SoftwareDesign #Datalayer
X / Bluesky: JupyterLab extensions: own lifecycle, expose APIs, deploy independently, can fail without crashing the host. That's a microservice — in a browser. No network boundary = no isolation safety net. Treat them like microservices. #JupyterLab #Architecture
Icons for React.js and JupyterLab: A Unification Story
JupyterLab: LabIcon system. React: component-based icons (@primer/octicons-react, lucide-react). Both in the same app? Pain.
We unified them: → Single icon component — works in both JupyterLab and React → Automatic light/dark adaptation → Consistent sizing and alignment across systems
Sounds small. It's not.
When you're building a hybrid app (JupyterLab inside, React outside), icon inconsistency is the FIRST thing users notice.
Consistency isn't about pixels. It's about trust. Broken icons = users assume the rest is broken too.
Sweat the small stuff. Icons count.
#ReactJS #JupyterLab #UIDesign #DesignSystems #Datalayer
X / Bluesky: JupyterLab has LabIcon. React has component icons. Using both = pain. We unified them: one component, auto theme adaptation, consistent sizing. Broken icons = users assume everything is broken. Sweat the small stuff. #ReactJS #JupyterLab #Design
Multi-User Jupyter Server: What Most Users Don't Know
Since version 3, JupyterLab runs on Jupyter Server directly. No classic Notebook server needed.
Datalayer was part of that migration. If you didn't notice — that was the goal.
But Jupyter Server still lacks: → Built-in multi-user support with proper isolation → Fine-grained authorization (who gets which kernels/files) → Audit logging for compliance
We built what was missing: → Token-scoped sessions per user → RBAC middleware gating every API call → Full audit trail: kernel launches, file access, cell executions
The foundation is rock-solid. Enterprise features needed building on top. So we built them.
#Jupyter #MultiUser #Security #DataPlatform #Datalayer
X / Bluesky: JupyterLab v3+ runs on Jupyter Server directly. But it still lacks multi-user isolation, fine-grained auth, and audit logging. We added: token-scoped sessions, RBAC on every API call, full audit trail. Foundation solid. We built the rest. #Jupyter #Security
Backwards Compatibility: Our Promise
Full backwards compatibility. Every release.
Sounds boring. It's actually one of the hardest engineering challenges we face.
In practice: → Your notebooks keep working → Your kernel specs don't break → Your JupyterLab extensions still load → Your REST API calls return the same shapes
How we enforce it: → Automated compat suites running against 3 previous majors → Deprecation warnings 2 releases before removal → Migration scripts for anything that must change
Breaking changes = tax on user trust. Pay it once, some users never come back.
We'd rather spend 3 extra days on compatibility than 3 months rebuilding trust.
#Backwards #Compatibility #Engineering #OpenSource #Datalayer
X / Bluesky: Full backwards compatibility. Every release. Your notebooks, kernel specs, extensions, and API calls keep working. Automated compat suites against 3 previous majors. Breaking changes = trust tax. Pay it once, users leave. #Engineering #OpenSource
Jupyterpool: An Alternative to JupyterHub and Enterprise Gateway
JupyterHub: gives every user a server. Enterprise Gateway: routes to remote kernels. Neither fits modern agent-driven workloads.
Enter Jupyterpool: kernel pool manager between users/agents and compute.
→ Pre-warms kernels across your cluster → Users/agents get kernels instantly — zero cold start → Idle kernels recycled into the pool, not destroyed → Resource limits enforced at pool level, not per-user
Think database connection pooling — but for compute sessions.
JupyterHub starts a server. Enterprise Gateway routes to one. Jupyterpool manages a fleet.
Different scale. Different design.
Running 100+ concurrent kernel users? Pooling isn't an optimization. It's a requirement.
#Jupyter #Infrastructure #Pooling #CloudNative #Datalayer
X / Bluesky: JupyterHub = server per user. Enterprise Gateway = route to kernel. Jupyterpool = pool manager. Pre-warmed kernels, zero cold start, idle recycling. Database connection pooling for compute. 100+ users? Pooling is required. #Jupyter #CloudNative
Mapping the JupyterLab Theme Ecosystem
Theming JupyterLab is more complex than it should be. Here's the landscape:
→ Primer Theme: GitHub's design system, adapted for JupyterLab. Clean, accessible. → Primer Brand: GitHub's marketing theme. Landing pages, not apps. → Datalayer Theme: Custom, built on Primer primitives. Data-focused palettes. → VS Code Theme: For users who want JupyterLab to feel like their editor.
We maintain a theme mapping layer: → Primer React tokens → JupyterLab CSS variables → VS Code color themes → Jupyter theme overrides → One source of truth, multiple outputs
User picks "dark mode" → JupyterLab, React shell, and VS Code editor all update simultaneously.
Theming is solved. Theme COORDINATION across frameworks? That's the real challenge.
#Theming #DesignSystems #JupyterLab #UIEngineering #Datalayer
X / Bluesky: JupyterLab theming: Primer, Primer Brand, Datalayer, VS Code themes — all different systems. We built a mapping layer: one source of truth → multiple outputs. Pick dark mode, everything updates. Theming is solved. Coordination isn't. #JupyterLab #DesignSystems
A Toolkit for Data Products, with Addons
Data products aren't dashboards. Aren't notebooks. Aren't APIs.
They're all three — and more.
Our toolkit: → Core: Jupyter kernel connections, auth, React components → Addons: Visualization, collaboration, export modules → Runtime: Managed kernels with auto-scaling + GPU
Start lean. Add complexity when needed: → Charts? Visualization addon. → Multi-user editing? Collaboration addon. → PDF export? Export addon.
Every team's data product is different. The toolkit adapts to your product — not the reverse.
Build what you need. Add what you discover. Ship fast.
#DataProducts #Toolkit #SoftwareArchitecture #DataScience #Datalayer
X / Bluesky: Data products = dashboards + notebooks + APIs. Our toolkit: Core (kernels, auth, React), Addons (viz, collab, export), Runtime (auto-scaling + GPU). Start lean, add what you need. Toolkit adapts to your product. #DataProducts #Datalayer
Library for Jupyter: Reuse, Don't Rebuild
Every team building on Jupyter reinvents the same 5 things:
- Kernel connection management
- Cell execution + output capture
- Auth wrapper
- Output rendering (HTML, images, errors)
- Notebook load/save
We packaged ours:
→ @datalayer/jupyter-react — React components for every Jupyter concept
→ @datalayer/core — Shared utilities, hooks, context providers
→ @datalayer/primer-addons — Enhanced design system components
Open-source. Production-tested. Actively maintained.
Stop rebuilding the Jupyter integration layer. Import it. Configure it. Focus on what makes YOUR product unique.
#Jupyter #OpenSource #Libraries #DeveloperExperience #Datalayer
X / Bluesky: Every team on Jupyter rebuilds: kernel mgmt, cell execution, auth, rendering, load/save. We packaged it: @datalayer/jupyter-react + core + primer-addons. Open-source. Production-tested. Stop rebuilding. Import and ship. #Jupyter #OpenSource
A Better Jupyter Experience
Jupyter, designed from scratch in 2026:
→ Startup: Instant. No "kernel starting" spinner. → Editing: VS Code-grade autocomplete + AI suggestions. → Execution: Visible, interruptible, progress bars for long cells. → Outputs: Interactive, resizable, persistent across sessions. → Collaboration: Real-time co-editing with presence. → Deployment: One click → notebook to scheduled pipeline.
We're not building a new Jupyter. We're building a better experience ON TOP of Jupyter.
Same protocol. Same kernels. Same ecosystem. Better UX.
The Jupyter protocol is the foundation. What we build above it should feel as modern as every other tool data teams use.
That's our standard.
#Jupyter #UX #DataScience #ProductDesign #Datalayer
X / Bluesky: Jupyter in 2026: instant startup, VS Code autocomplete + AI, interruptible execution, persistent outputs, real-time collab, one-click deploy. Not a new Jupyter — a better experience on top. Same protocol, better UX. #Jupyter #UX #Datalayer
Cell Magic: A Tribute to Apache Zeppelin
Before Jupyter dominated: Apache Zeppelin.
Zeppelin had one feature Jupyter still lacks: the cell interpreter.
Prefix any cell with %spark, %sql, %python, %shell — runs on that interpreter. No kernel switching. No separate notebooks. One document, many languages.
The original polyglot notebook. Worked beautifully for Big Data on Spark.
I used Zeppelin extensively for customer data pipelines (https://datalayer.blog/2018/01/17/datalayer-0.0.1-on-k8s) before moving to Jupyter (https://datalayer.blog/2020/08/31/new-start-with-jupyter).
We're bringing cell magic back. Best ideas don't belong to one project — they belong to the ecosystem.
Zeppelin got this right. Time to carry it forward.
#ApacheZeppelin #Jupyter #Notebooks #BigData #Datalayer
X / Bluesky: Before Jupyter: Apache Zeppelin. Its killer feature? Cell interpreters. %spark, %sql, %python in one doc. No kernel switching. Original polyglot notebook. We're bringing cell magic back to Jupyter. Best ideas belong to the ecosystem. #Zeppelin #Jupyter
Jupyter UI Lite: Notebooks Without a Server
Full Jupyter notebook. Zero backend.
Jupyter UI Lite: → Pyodide kernel → Python entirely in-browser via WebAssembly → No server to deploy, secure, or pay for → Works offline. Static sites. CDN-hosted pages.
Use cases: → Documentation with runnable examples → Education platforms — students run code, zero infra → Demos that work anywhere with a browser
Trade-offs: no filesystem, no GPU, no native packages that won't compile to WASM.
But for 80% of "let me show you how this works" scenarios? All you need.
Zero servers. Full interactivity. The future of shareable computation.
#Jupyter #WebAssembly #Serverless #Education #Datalayer
X / Bluesky: Jupyter notebook, zero backend. Pyodide kernel = Python in the browser via WASM. No server, works offline, runs on static sites. 80% of demos need nothing more. Zero servers, full interactivity. #Jupyter #WebAssembly #Datalayer
The Notebook of the Day
Every day, someone writes a notebook that solves a problem no one else has.
A financial analyst building a custom risk model. A biologist scripting novel genome alignment. An ML engineer debugging training in a way that saves $10K/month.
These notebooks are invisible. Trapped in /home/user/notebooks/Untitled-37.ipynb. Never shared. Never versioned.
Every great notebook should be discoverable: → Version it in Git → Publish it with Jupyter Viewer → Share it as a reusable template
The best code in the world is useless if nobody can find it.
What's your notebook of the day?
#Notebooks #DataScience #KnowledgeSharing #Collaboration #Datalayer
X / Bluesky: Someone wrote a notebook today that solves a unique problem. It's sitting in Untitled-37.ipynb. Never shared. Never versioned. Every great notebook deserves Git, a viewer, and a template. What's your notebook of the day? #DataScience #Jupyter
Jupyter IPyWidgets: Interactive Visualization in Any Context
IPyWidgets: sliders, dropdowns, live-updating plots. Jupyter's interactive layer.
Reputation: fragile. And for good reason.
Debugging a custom widget = 5 repositories: widget code → JupyterLab → jupyterlab-ipywidgets → ipywidgets → ipykernel. Each with its own release cycle and compatibility matrix.
We simplified this: → Jupyter React renders IPyWidgets natively in React — no iframe, no JupyterLab dependency → State management at the kernel level, not widget level → Live outputs work in standalone web apps, not just notebooks
IPyWidgets are powerful. Using them outside JupyterLab shouldn't require a PhD in Jupyter internals.
Interactive outputs belong everywhere. Dashboards. Web apps. Reports. Let's make it easy.
#IPyWidgets #Jupyter #DataVisualization #ReactJS #Datalayer
X / Bluesky: IPyWidgets: powerful interactive viz, fragile outside JupyterLab. Debugging = 5 repos deep. We fixed it: native React rendering, no iframe, kernel-level state. Interactive outputs belong everywhere — dashboards, web apps, reports. #Jupyter #IPyWidgets
The Vanishing Cards of Jupyter
Jupyter has a rich history — and a growing list of architectural bets that didn't age well.
The ecosystem tried to compete with VS Code head-on instead of embracing embeddability. It layered Lumino when React.js was winning the web. It tied content to the server when the kernel should own it.
At Datalayer, we Think Inverse:
→ React.js first, Lumino as needed → Kernel-centric: the kernel owns state, the notebook is just a view → Rust-based Jupyter server for performance, full backwards compatibility → Jupyter UI Lite for in-browser execution.
Reinventing the wheel? lumino instead or rect, lumino-rtc instead of yjs or similar...
Debugging? A single IPyWidgets issue crosses 5 repos. That's not a bug. It's an architecture smell.
We're not abandoning Jupyter. We're rebuilding the parts that need it — and keeping everything that works.
#Jupyter #OpenSource #DataScience #WebDevelopment #SoftwareArchitecture #Datalayer
X / Bluesky: Jupyter bet on Lumino when React was winning. Tied content to the server when the kernel should own it. At Datalayer we Think Inverse: React-first, kernel-centric, Rust-powered. Not abandoning Jupyter — rebuilding what needs it. #Jupyter #OpenSource
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file datalayer_ui-1.0.26-py3-none-any.whl.
File metadata
- Download URL: datalayer_ui-1.0.26-py3-none-any.whl
- Upload date:
- Size: 32.3 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dceaeccd40c43795bbc222935a41885ed1e897629d50e61173a8e5195c880912
|
|
| MD5 |
13e57409a820a3fc07c51b5f03db0c5b
|
|
| BLAKE2b-256 |
013f94b53779136e1f97ed214f44da5f609fdbf3bf001ced838dff116a4bee1c
|