# \[ANN\] Neptune.jl v0.15.0 — non-reactive Julia notebooks (Pluto fork)

**URL:** <https://discourse.julialang.org/t/ann-neptune-jl-v0-15-0-non-reactive-julia-notebooks-pluto-fork/136949>\
**Category:** Package Announcements\
**Created:** [May 1, 2026, 3:26pm UTC](https://discourse.julialang.org/t/ann-neptune-jl-v0-15-0-non-reactive-julia-notebooks-pluto-fork/136949 "2026-05-01T15:26:36Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![compleat](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/compleat/32/8958_2.png) [@compleat](https://discourse.julialang.org/u/compleat)\
**Post date:** [May 1, 2026, 3:26pm UTC](https://discourse.julialang.org/t/ann-neptune-jl-v0-15-0-non-reactive-julia-notebooks-pluto-fork/136949/1 "2026-05-01T15:26:36Z")

</div>

Neptune.jl is a non-reactive fork of  
[Pluto.jl](https://github.com/JuliaPluto/Pluto.jl). It looks and works exactly  
like Pluto, with one key difference: **cells do not automatically re-run when  
other cells change**.

- Editing a cell runs **only that cell**
- Notebooks **do not auto-run** when opened
- Multiple cells can **define the same variable** without error
- Everything else — the UI, package management, `@bind` widgets, exports — is  
identical to Pluto

This makes Neptune better suited to workflows where cells are expensive to  
compute, you’re iterating on a single cell, or you simply want Jupyter-style  
manual control with a cleaner interface.

**Install:**

```julia
import Pkg
Pkg.add("Neptune")

Usage:

using Neptune
Neptune.run()                                                                 

Neptune can open .jl notebooks saved by Pluto — both formats are supported.   
                                                                
Source: https://github.com/compleathorseplayer/Neptune.jl                     
                                                                
All credit for the underlying notebook platform goes to                       
https://github.com/fonsp and the Pluto.jl contributors.
```

---

<div class="post-metadata">

**Author:** ![RoyiAvital](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/royiavital/32/571_2.png) [@RoyiAvital](https://discourse.julialang.org/u/RoyiAvital)\
**Post date:** [May 1, 2026, 4:28pm UTC](https://discourse.julialang.org/t/ann-neptune-jl-v0-15-0-non-reactive-julia-notebooks-pluto-fork/136949/2 "2026-05-01T16:28:46Z")

</div>

It shows the last commit was years ago:

 ![image](https://global.discourse-cdn.com/julialang/original/3X/a/1/a185865b65136a46e6bc02457d14926f44ed2911.png)

Will you update it to match the latest `Pluto.jl`?

---

<div class="post-metadata">

**Author:** ![lilachint](https://avatars.discourse-cdn.com/v4/letter/l/ee7513/32.png) [@lilachint](https://discourse.julialang.org/u/lilachint)\
**Post date:** [May 2, 2026, 3:41am UTC](https://discourse.julialang.org/t/ann-neptune-jl-v0-15-0-non-reactive-julia-notebooks-pluto-fork/136949/3 "2026-05-02T03:41:28Z")

</div>

How does this compare to Jupyter in detail? I personally don’t think a cleaner interface would justify the tool’s necessity. Some elaboration would help! 😃

---

<div class="post-metadata">

**Author:** ![ufechner7](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ufechner7/32/51363_2.png) [@ufechner7](https://discourse.julialang.org/u/ufechner7)\
**Post date:** [May 2, 2026, 10:09am UTC](https://discourse.julialang.org/t/ann-neptune-jl-v0-15-0-non-reactive-julia-notebooks-pluto-fork/136949/4 "2026-05-02T10:09:28Z")

</div>

> [@lilachint](#):
>
> Some elaboration would help!

It is stated in the first post:

- Editing a cell runs **only that cell**
- Notebooks **do not auto-run** when opened
- Multiple cells can **define the same variable** without error

That makes a huge difference. Neptune is usable for code that takes a long time to load and to re-evaluate, where Ploto is not.  
And yes, this could also be a configuration option for Pluto, but as far as I remember the Pluto developer did not want to add that to his code base. Correct me if I am wrong.

---

<div class="post-metadata">

**Author:** ![pankgeorg](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pankgeorg/32/21549_2.png) [@pankgeorg](https://discourse.julialang.org/u/pankgeorg)\
**Post date:** [May 2, 2026, 10:41am UTC](https://discourse.julialang.org/t/ann-neptune-jl-v0-15-0-non-reactive-julia-notebooks-pluto-fork/136949/5 "2026-05-02T10:41:22Z")

</div>

Hello! It’s good to see that you find most of Pluto useful and the source code easy-to-work with! I was just a bit surprised by the MAINTAINING.md; you seem to ask for the authors field of the Project.toml to be set to your name. That’s not really accurate in terms of the effort; given that you [patch 11 commits](https://github.com/JuliaPluto/Pluto.jl/compare/main...compleathorseplayer:Neptune.jl:main) on the Pluto source right?

What I propose instead:

1. Add your name to the list, (also, something similar for the LICENSE I would guess, but I am not a lawyer) OR
2. Pluto is pretty extensible as is. Make a package that _depends_ on Pluto and applies the patches on the julia runtime. You can probably make this more modular if you apply some patches upstream, we will be happy to review contributions towards maintainability. This approach most likely doesn’t _need_ maintenance anyway. And you’ll definitely be the sole author of that 🙂

All in all, I welcome your contribution to the julia ecosystem! It’s good to see traction and discussions again!!

---

<div class="post-metadata">

**Author:** ![lilachint](https://avatars.discourse-cdn.com/v4/letter/l/ee7513/32.png) [@lilachint](https://discourse.julialang.org/u/lilachint)\
**Post date:** [May 2, 2026, 10:52am UTC](https://discourse.julialang.org/t/ann-neptune-jl-v0-15-0-non-reactive-julia-notebooks-pluto-fork/136949/6 "2026-05-02T10:52:47Z")

</div>

I was comparing Neptune to Jupyter, not Pluto. Jupyter is basically as OP described already, only running a single cell at a time. OP mentioned

> [@compleat](#):
>
> or you simply want Jupyter-style  
> manual control with a cleaner interface.

I was curious about what other niches/benefits Neptune could provide, other than ‘a cleaner interface’ which is a bit subjective. This is considering Jupyter is a more mature and established tool with no obvious downsides.

---

<div class="post-metadata">

**Author:** ![pankgeorg](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pankgeorg/32/21549_2.png) [@pankgeorg](https://discourse.julialang.org/u/pankgeorg)\
**Post date:** [May 5, 2026, 3:42pm UTC](https://discourse.julialang.org/t/ann-neptune-jl-v0-15-0-non-reactive-julia-notebooks-pluto-fork/136949/7 "2026-05-05T15:42:39Z")

</div>

Here is “NotPluto.jl” which applies more or less your patch and disables reactivity using the real Pluto under the hood and requiring ~0 maintenance; should be functionally equivalent to Neptune: [NotPluto.jl/src/NotPluto.jl at main · pankgeorg/NotPluto.jl · GitHub](https://github.com/pankgeorg/NotPluto.jl/blob/main/src/NotPluto.jl)

It actually additionally stops Pluto from disabling cells if they redefine something.  
It’s almost guaranteed to give you stale state.

---

<div class="post-metadata">

**Author:** ![Mason](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mason/32/2423_2.png) [@Mason](https://discourse.julialang.org/u/Mason)\
**Post date:** [May 6, 2026, 3:13pm UTC](https://discourse.julialang.org/t/ann-neptune-jl-v0-15-0-non-reactive-julia-notebooks-pluto-fork/136949/8 "2026-05-06T15:13:22Z")

</div>

I’d argue that your NotPluto has the exact same maintainance problems as Pluto.jl does, and in many ways it’s worse.

By maintaining a Pluto fork, every time Pluto releases an update, you can just use git to compare if Pluto changed any of the lines Neptune changed, and then either just cleanly update, or take whatever actions need to be taken in order to adapt to changes in the source.

NotPluto on the other hand needs hard version caps on Pluto down to the sub-sub-version to make sure it doesn’t get broken by upstream changes to pluto, and the process of finding out if changes to Pluto will break NonPluto is more cumbersome and manual than the process of updating Neptune. The claim of “~0 maintenance” is just wrong.

* * *

If Pluto had generic APIs for the things that @compleat wants to overload, then of course something like NotPluto would be preferred, but if the only way to hook into these things is agressive type piracy and completely overwriting existing methods at startup time, that’s just bad practice with no upside.

Pluto is a highly opinonated tool though, and requests for customization APIs like that have been routinely rejected, so I don’t see what @compleat could do here other than fork.

---

<div class="post-metadata">

**Author:** ![pankgeorg](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pankgeorg/32/21549_2.png) [@pankgeorg](https://discourse.julialang.org/u/pankgeorg)\
**Post date:** [May 7, 2026, 8:23am UTC](https://discourse.julialang.org/t/ann-neptune-jl-v0-15-0-non-reactive-julia-notebooks-pluto-fork/136949/9 "2026-05-07T08:23:29Z")

</div>

Sure, I can’t argue with that. I’m just demonstrating how the alternative would work. I don’t actually plan to maintain `NotPluto.jl` (I do plan to maintain `Pluto` though. will vaguely try to break neither).

With claude, we are all victims of [“The Lisp Curse”](https://www.winestockwebdesign.com/Essays/Lisp_Curse.html); it’s a new world we live it 🙂

---

<div class="post-metadata">

**Author:** ![krcools](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/krcools/32/10212_2.png) [@krcools](https://discourse.julialang.org/u/krcools)\
**Post date:** [May 7, 2026, 9:11am UTC](https://discourse.julialang.org/t/ann-neptune-jl-v0-15-0-non-reactive-julia-notebooks-pluto-fork/136949/10 "2026-05-07T09:11:13Z")

</div>

In [Makeitso.jl](https://github.com/krcools/Makeitso.jl) I also implemented a declarative, non-reactive framework to deal with scripts built from long-running expensive tasks.

It takes the cue from GNU make for its syntax. Recipe definition and build requests are separated. Moreover, the output of each cell is backed up to disk using JLD2, meaning that script execution can even survive a kernel crash. Targets can be parametrised and for-loops creating a target for a range of parameters are supported by the syntax.

---

<div class="post-metadata">

**Author:** ![sylvaticus](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sylvaticus/32/203883_2.png) [@sylvaticus](https://discourse.julialang.org/u/sylvaticus)\
**Post date:** [May 7, 2026, 9:20am UTC](https://discourse.julialang.org/t/ann-neptune-jl-v0-15-0-non-reactive-julia-notebooks-pluto-fork/136949/11 "2026-05-07T09:20:35Z")

</div>

I like _some_ ideas of Pluto: full julia stack, notebooks as valid JL scripts, cool interactivity… but I need only _sometimes_ the reactivity mechanism (mainly short/demo/teaching scripts).

I really believe that a Pluto option to enable/disable reactivity (and, as follows, allowing multiple commands per cell) in a given notebook would be a much better outcome for the community than keeping 2 separate projects.

---

<div class="post-metadata">

**Author:** ![mihalybaci](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mihalybaci/32/13528_2.png) [@mihalybaci](https://discourse.julialang.org/u/mihalybaci)\
**Post date:** [May 7, 2026, 12:34pm UTC](https://discourse.julialang.org/t/ann-neptune-jl-v0-15-0-non-reactive-julia-notebooks-pluto-fork/136949/12 "2026-05-07T12:34:34Z")

</div>

It’s important to remember for the discussion and questions that have been asked, Neptune is a 6-year old project started shortly after the release of Pluto, so a lot of the features Pluto currently has (like easy cell disabling) may not have been implemented when Neptune began.

So, rather than rehashing here (unless there are _new_ questions), read the original Neptune announcement ([Announcing Neptune.jl (now updated to multi-line cells!)](https://discourse.julialang.org/t/announcing-neptune-jl-now-updated-to-multi-line-cells/54088)) which has a good discussion on its intent and reasoning.

---

<div class="post-metadata">

**Author:** ![compleat](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/compleat/32/8958_2.png) [@compleat](https://discourse.julialang.org/u/compleat)\
**Post date:** [July 5, 2026, 8:44pm UTC](https://discourse.julialang.org/t/ann-neptune-jl-v0-15-0-non-reactive-julia-notebooks-pluto-fork/136949/13 "2026-07-05T20:44:35Z")

</div>

Neptune has been updated and the (semi-automated) plan is to follow Pluto updates.
