Skip to main content

Jupyter Notepad

jupyter_notepad is a python library that provides you a code editor widget that automatically tracks change history right within Jupyter notebooks. This is useful when you're iterating on a particular piece of text such as some code or a prompt for an AI model and don't want to lose any of your history. To try it out, simple install using pip:

pip install jupyter_notepad

Then in a jupyter notebook cell, you can get started in just a couple lines of code:

from jupyter_notepad import Repo

repo = Repo("./my-project")

prompt_file = repo.file("prompt.md")
prompt_file # This should be the last line of the cell

You should see an editor open in your notebook like below:

Screenshot of the widget in a notebook

You can retrieve the contents of your file by simply calling str(file):

prompt_value = str(prompt_file)

You can use the "History" dropdown within the widget to restore old versions of your text:

Screenshot of the widget in a notebook with the history dropdown expanded

jupyter_notepad saves a new version of your text automatically when you update your file, but you can also use Cmd+S or the "Save" button in the widget to save a new version of your work. If you disable the checkbox next to "Auto Save" in the widget, new versions will only be created when you explicitly save your work using one of those two methods. The only exception is that when you restore an old version of your text, jupyter_notepad will always save a new version before restoring it (as long as there's a diff since the last saved version).

For simple usages of jupyter_notepad, those features should be all you need. Read on to learn about more advanced usages of jupyter_notepad.

Table of Contents

Sharing notebooks

One of the side effects of using jupyter_notepad is that by default it makes sharing notebooks more difficult. jupyter_notepad offers a solution for this so that even without your jupyter_notepad repository, others can still run all of your code.

The solution is to use the %load_from_repo magic function. This will be registered automatically when you import jupyter_notepad. What this magic function does is load one of the files from your repository, and store the contents in a string literal in a cell of your notebook.

When using this magic function, you must provide three arguments:

  • The variable name for the jupyter_notepad.Repo instance to load the file from.
  • The file path within the repository to load, or the variable name that holds that path.
  • The output variable that the contents of that variable will be assigned to.

For example:

%load_from_repo repo prompt.md prompt_value

If you run a cell with those contents after the code block from the introduction, it will replace the contents of the cell with the following and execute it:

%load_from_repo repo prompt.md prompt_value
# NOTE: The contents of this cell are generated. It's recommended that you 
# edit the contents of prompt.md using jupyter_notepad or directly rather 
# than editing this cell directly.
prompt_value = '# Hello\n\nAs you can see, there will be automatic syntax highlighting for most languages based on the file extension of the file name.\n\n```js\n// Code will even be highlighted in code blocks!\nconst a = 1;\n```\n'

The cell can be re-run, and the latest contents of the file will be loaded each time.

Now, when others run your notebook, you have two options:

  • They can comment out the %load_from_repo line and just run the cell normally. In fact, if desired all of the jupyter_notebook code could be removed from the notebook by others if desired and they could still run the notebook.
  • If they have an empty repository and prompt.md is not found, %load_from_repo will simply print a warning and still execute the python code below it.

Editing Multiple Files at Once

When editing multiple files, you might want to have multiple tabs or multiple editors side-by-side. Luckly, the ipywidgets module makes this very straightforward. jupyter_notepad works seemlessly with ipywidgets widgets such as VBox, HBox, and Tab. You can use these to build more complex layouts composed of multiple individual editors. An illustrative example can be found below:

import ipywidgets

ipywidgets.Tab(
    children=[
        repo.file("prompt.md"),
        ipywidgets.HBox([
            repo.file("fibonacci.js"),
            repo.file("fibonacci.py"),
        ])
    ],
    titles=[
        "prompt.md",
        "fibonacci",
    ]
)

Results in the following:

Multiple jupyter_notepad file widgets composed into tabs and an HBox

Note that you can change the height for a particular file by setting the height property. It is a number, and the height of the widget will be set in rem. The default value is 18. Example:

my_file = repo.file("prompt.md")
my_file.height = 36
my_file

Development

See DEVELOPMENT.md.

Support and feature requests

If you encounter a bug with jupyter_notepad or would like to request a new feature, please open an issue and I'll try to help you out as quickly as possible. Contributions are welcome if you'd like to contribute a feature or improve the documentation.

Release files for jupyter-notepad 0.0.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for jupyter-notepad 0.0.2
File Size Uploaded
jupyter_notepad-0.0.2.tar.gz 1.9 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for jupyter-notepad 0.0.2
File Interpreter ABI Platform
jupyter_notepad-0.0.2-py3-none-any.whl Python 3 none any Details

Total release size: 5.2 MB

Release files / jupyter_notepad-0.0.2.tar.gz

Download URL jupyter_notepad-0.0.2.tar.gz
Size 1.9 MB
Tags Source
SHA-256 checksum
How to use checksums
930fc35456bbf359fc2a1015c594d9acb97bfb7fa4bd4e84bb410babd1636d45
BLAKE2b-256 checksum
How to use checksums
e517234cfe1b690fc322ab3d840135f4259c07b24c7ac0d81a7d510b87add5c0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.0.0 CPython/3.10.14

Release files / jupyter_notepad-0.0.2-py3-none-any.whl

Download URL jupyter_notepad-0.0.2-py3-none-any.whl
Size 3.3 MB
Tags Python 3
SHA-256 checksum
How to use checksums
5f499219f2653227cec6909316fbca93093fe87377d8716991a2124041e20f6c
BLAKE2b-256 checksum
How to use checksums
7658cef3db759a45495568c9ec4b6083ae102bdc4239629cb751738ca6c876c9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.0.0 CPython/3.10.14
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page