Sign in

Fritz Lekschas

@lekschas.de
94 followers 168 following 19 posts

I'm a computer scientist who develops interactive, intelligent, and insightful visualization systems for analyzing and exploring large-scale data on the web. lekschas.de · github.com/flekschas · linkedin.com/in/flekschas

PostsRepliesMedia
Fritz Lekschas @lekschas.de · 18/05/2026
This was a really fun project that was cooking up in our heads for years. AI coding finally made it possible to build the idea in the evenings :) Still super thankful for the embedding reading club that @nvictus.bsky.social organized with folks from Mirny Lab back in 2020 or 2021!
031
Fritz Lekschas @lekschas.de · 18/02/2026
If you're curious about the philosophy and design decisions behind MCP-Web, keep on reading at mcp-web.dev/made-with-love.
mcp-web.dev
The Story Behind MCP-Web | MCP-Web
Expose frontend state and actions as MCP tools for AI agents
000
Fritz Lekschas @lekschas.de · 18/02/2026
MCP-Web also lets you trigger AI queries directly from the frontend. Your app can "ask" AI questions, not just respond to AI requests. As an example, checkers.demo.mcp-web.dev is a checkers game where you play against AI. But since the app is AI-controllable, you can also let AI play against AI.
100
Fritz Lekschas @lekschas.de · 18/02/2026
To build AI-controllable frontend apps with MCP-Web, you need to model your frontend state declaratively. Break your state into atomic and derived units, and describe it with Zod schemas. Exposing your state as tools is then straightforward. MCP-Web comes with utilities to streamline all this.
110
Fritz Lekschas @lekschas.de · 18/02/2026
Another benefit is when your UI has rich ephemeral state that shouldn't live in a db. Think of dashboards or visualization tools with crossfilters, selections, and dynamic color scales. These view models are often larger than the data model itself. See higlass.demo.mcp-web.dev as an example
100
Fritz Lekschas @lekschas.de · 18/02/2026
This approach makes the frontend the main control surface, which has a few benefits. Primarily, it makes human-AI parity easy. Humans control state through UIs and AI controls the same state through tools. So both have the same capabilities, which also enables mixed-initiative interactions
100
Fritz Lekschas @lekschas.de · 18/02/2026
With MCP-Web, your frontend app becomes the MCP server. AI doesn't need to parse HTML to identify possible actions. It gets typed tools to directly manipulate your frontend app's state like your UIs do. Try it: todo.demo.mcp-web.dev is a todo app that either you or AI can fully control.
100
Fritz Lekschas @lekschas.de · 18/02/2026
Did you ever want to control frontend apps through AI while being able to take over at any point? I built a library called MCP-Web that lets you expose state, actions, and UI as MCP tools+apps for AI while maintaining human agency. Code: github.com/flekschas/mc... Docs: mcp-web.dev
111
Reposted by Fritz Lekschas
Nezar Abdennur @nvictus.bsky.social · 07/07/2025
I'm proud to announce the latest release of 🧬 #Oxbow 🏹, with new features to make NGS data analysis more powerful, efficient, and "composable". Learn more at: oxbow.readthedocs.io
22613
Fritz Lekschas @lekschas.de · 18/02/2025
Ohhhhh nice shortcut ✨
000
Fritz Lekschas @lekschas.de · 18/02/2025
To test it yourself, head to github.com/flekschas/ju..., clone the repo, cd into notebooks, and run `juv run dimbridge.ipynb`. This requires juv (github.com/manzt/juv), a super handy new tool from @manzt.sh that makes Jupyter Notebooks reproducible! I highly recommend you check it out if you haven't
github.com
GitHub - flekschas/jupyter-scatter: Interactive 2D scatter plot widget for Jupyter Lab and Notebook. Scales to millions of points!
Interactive 2D scatter plot widget for Jupyter Lab and Notebook. Scales to millions of points! - flekschas/jupyter-scatter
1113
Fritz Lekschas @lekschas.de · 18/02/2025
Using a single-cell surface protein dataset, you can use Jupyter Scatter to select points and have DimBridge compute the key protein expressions. You can also contrast two or more selections or use the brush selection to study a sequence of selections in the dataset.
nature.com
Extricating human tumour immune alterations from tissue inflammation - Nature
Complementary single-cell approaches show that a population of regulatory T cells co-expressing ICOS and IL-1 receptor type 1 is highly enriched in tumours but not in site-matched inflamed non-maligna...
100
Fritz Lekschas @lekschas.de · 18/02/2025
To test the new brush selection, I combined JScatter w/ DimBridge (arxiv.org/abs/2404.07386) a method to identify key dims in the high-dim space that explain a subset of points in the embedding. The idea is to tell you which handful of dims from the dataset can explain patterns in the embedding.
arxiv.org
DimBridge: Interactive Explanation of Visual Patterns in Dimensionality Reductions with Predicate Logic
Dimensionality reduction techniques are widely used for visualizing high-dimensional data. However, support for interpreting patterns of dimension reduction results in the context of the original data...
110
Fritz Lekschas @lekschas.de · 18/02/2025
The brush selection can be useful when working with temporal or sequential patterns. Huge kudos to Andres Colubri who brought up that idea and the initial implementation for regl-scatterplot (Jupyter Scatter's rendering engine github.com/flekschas/re...).
github.com
GitHub - flekschas/regl-scatterplot: Scalable WebGL-based scatter plot library build with Regl
Scalable WebGL-based scatter plot library build with Regl - flekschas/regl-scatterplot
100
Fritz Lekschas @lekschas.de · 18/02/2025
A new version of Jupyter Scatter (jupyter-scatter.dev) is out: v0.21.0. 🥳 This version introduces fun new ways to select points using either a brush or rectangle. You can now also more easily extend or reduce a selection by holding down the meta (CMD on macOS) key or alt key respectively.
1173
Fritz Lekschas @lekschas.de · 30/12/2024
See the full changelog at github.com/flekschas/ju... and let me know what you think! And most importantly, Guten Rutsch and Happy New Year! 🥳
000
Fritz Lekschas @lekschas.de · 30/12/2024
Under the hood, we've modernized the tooling by switching to Biome for JS code formatting and uv for Python package management. The min Python version is now 3.9. Again thanks to @manzt.sh for taking on the switch to uv. And a big shoutout to the wonderful folks behind Biome and uv 🙏
110
Fritz Lekschas @lekschas.de · 30/12/2024
To give Jupyter Scatter a try is now easier than ever: ➡️ `uvx jupyter-scatter demo` This fantastic feature is shamelessly copied from @manzt.sh who implemented it for cev github.com/OzetteTech/c.... Huuuge thanks Trevor 🙏
github.com
GitHub - OzetteTech/comparative-embedding-visualization: A Jupyter widget for comparing two embeddings with shared labels by their confusion, neighborhoods, and size.
A Jupyter widget for comparing two embeddings with shared labels by their confusion, neighborhoods, and size. - OzetteTech/comparative-embedding-visualization
100
Fritz Lekschas @lekschas.de · 30/12/2024
Another addition is the ability to change the points' zoom scale function to constant or linear. By default, points are scaled up using the inverse hyperbolic sine to reveal overlapping points as you zoom in. Finally, you can also now lock the camera view with to avoid zooming in as you scroll.
100
Fritz Lekschas @lekschas.de · 30/12/2024
My first 🦋 post before 2024 is a wrap 🫣: here is a new version of Jupyter Scatter! 🎉 This release adds support for full-screen mode, which makes it easier to explore large plots. You can also use it to create custom high-resolution exports. ➡️ github.com/flekschas/ju... 📚 jupyter-scatter.dev
140
Reposted by Fritz Lekschas
Evan You @evanyou.me · 26/11/2024
Here it is! The big thing is the (experimental) Environment API: our hope is it can serve as the foundation for frameworks that run code in multiple different JS runtimes. The internal module runner refactors also pave the way for some interesting things down the road...
1044054