summaryrefslogtreecommitdiff
path: root/topics/notebooks/binding-lite.gmi
blob: 6b55cf2340677ce333a4e19b44224fa9eb1bb25a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# Binding notebooks

Binder and Cocalc are tools for deploying Jupyter notebooks, R/shiny notebooks and Pluto notebooks. These binding tools do a lot more and do not leverage GNU Guix lightweight container infrastructure. In this project we want to create a binding-lite.

## Members

* jgart
* pjotr

## Implementation

Key is to leverage what is in Guix and what we already have in GeneNetwork as much as possible.

We should create this separately from genenetwork because all we want to do is run notebooks in containers. We should be able to use and external authentication system, fetch notebooks from git elsewhere and push them on git elsewhere.

binding-lite will be packaged in GNU Guix. GeneNetwork will essentially be a 'rebranding' of binding-lite.

Later we'll add an API to create notebooks on the fly. That is a separate topic.

## Background

The current way of using guix-jupyter is to create a guix environment that contains the guix-jupyter kernel and jupyter.

The user can then run the `jupyter notebook` command which prints a url to the terminal for the user to copy/paste into the browser.

Once the url is opened in the browser, a user has to select the guix kernel and choose the notebook from the file manager menu.

## Initial Design Ideas

The first goal is to fire up a jupyter notebook from a local git repository. 

Afterwards, this would be implemented with a remote git repository.

We need a command line interface/tool and guile library to automate the process of opening a jupyter notebook from a local git repository.

I am tentatively calling this tool `repo2guix`.

Some of the tasks that `repo2guix` will need to automate is preselecting the guix kernel and opening the browser to the notebook view
of the given url. 

Here is an example of how the command line interface would be used:

```
$ repo2guix file:///path/to/<git-repository>

To access the notebook, open this file in a browser:
        file:///path/to/<git-repository>
    or copy and paste one of these URLs:
        http://localhost:8890/?token=fc21c17b9ec31eddbea28c06ce086cf71b5605a09610439b
    or  http://127.0.0.1:8890/?token=fc21c17b9ec31eddbea28c06ce086cf71b5605a09610439b
```
        
## Managing Jupyter Notebook Dependencies

We'll need a manifest.scm file that will specify the dependencies needed by the guix-jupyter notebook.

Below is an example of the contents of a guix-jupyter notebook repository that can be given to `repo2guix`:

```
$ tree <git-repository>
.
├── LICENSE
├── README.md
├── index.ipynb
└── manifest.scm
```

An example of the contents of manifest.scm:

```
(specifications->manifest
  '("python-numpy" 
    "python-pandas"
    "python-matplotlib"))
```

## Additional Features and Ideas

One possibility for easing the creation of a manifest.scm in the notebook repository is to parse the requirements.txt/setup.py, 
in the case of a python notebook, and generate the manifest.scm file for the notebook user.

We would have to write similar manifest generators for Julia and R project dependencies in order to support this feature. 

I will ask on the guix mailing lists for feedback on this idea.

Once we have this library we can start building binder-lite on top of it. 

## Use Cases

The use cases for `repo2guix` are driven by the following design decisions:

1. Automated guix container building guile library to be used by binder-lite.

2. Manual guix container building and running the container from the command line,
   `repo2guix`, by users on their workstations.