On a quest for agency in Bellairs

Compare changes

Choose any two refs to compare.

-12
.gitignore
···
-
_build
-
_coverage
-
_metrics
-
*~
-
*.install
-
*.merlin
-
_opam
-
.envrc
-
\#*
-
.#*
-
.*.swp
-
**/.DS_Store
-1
.ocamlformat
···
-
version = 0.27.0
-20
README.md
···
- Try `ssh git.recoil.org` to ensure that you have a login and you get a message saying that this is a knot and that it doesnt like interactive mode (instead of access denied).
- Try cloning over https and pushing over SSH.
-
-
### MVP
-
-
Run the server with:
-
-
```
-
$ dune exec -- mvp/ocaml/server/server.exe --capnp-secret-key-file server.pem --capnp-listen-address tcp:127.0.0.1:1234
-
```
-
-
Run the client (in another terminal):
-
-
```
-
$ export BELLAIRS_CAP=storage.cap # this is located on the same dir as where the server has started
-
$ dune exec -- mvp/ocaml/client/client.exe read foo
-
foo: ""
-
$ dune exec -- mvp/ocaml/client/client.exe write foo 'hello bellairs!'
-
9 bytes successfully written into foo.
-
$ dune exec -- mvp/ocaml/client/client.exe read foo
-
foo: "hello bar"
-
```
-5
bellairs.opam
···
-
opam-version: "1.2"
-
depends: [
-
"capnp-rpc-unix"
-
"eio_main"
-
]
-2
dune-project
···
-
(lang dune 3.17)
-
(name bellairs)
-1
mvp/.gitignore
···
-
_build
+18
mvp/bellairs.mli
···
+
+
type dir
+
type file
+
+
type entry = {
+
name: string;
+
file: file;
+
}
+
+
val root : dir
+
val list : dir -> entry list
+
+
val create : dir -> string -> file
+
val open_ : dir -> string -> file
+
val delete : dir -> string -> unit
+
+
val size : file -> int64
+
val read : file -> ?off:int64 -> ?len:int64 -> string
+33
mvp/bellairs.schema
···
+
@0xa59e1c95e37fb55d;
+
+
interface Directory {
+
# Represents a directory in the filesystem
+
+
list @0 () -> (entries :List(Entry));
+
# Lists all entries in the directory
+
+
struct Entry {
+
name @0 :Text; # Name of the entry
+
file @1 :File; # Reference to the file object
+
}
+
+
create @1 (name :Text) -> (file :File);
+
# Creates a new file with the given name
+
+
open @2 (name :Text) -> (file :File);
+
# Opens an existing file with the given name
+
+
delete @3 (name :Text);
+
# Deletes a file with the given name
+
}
+
+
interface File {
+
# Represents a file in the filesystem
+
+
size @0 () -> (size :UInt64);
+
# Returns the size of the file in bytes
+
+
read @1 (off :UInt64 = 0, len :UInt64 = 0xffffffffffffffff) -> (data :Data);
+
# Reads data from the file, optionally starting at offset and reading up to len bytes
+
# Default is to read the entire file
+
}
+4
mvp/dune
···
+
(library
+
(name bellairs)
+
(modules_without_implementation bellairs)
+
(modules bellairs))
+1
mvp/dune-project
···
+
(lang dune 3.17)
-1
mvp/ocaml/API.ml
···
-
include Schema.Storage.MakeRPC (Capnp_rpc)
-2
mvp/ocaml/bellairs.ml
···
-
include Bellairs_intf
-
module API = API
-2
mvp/ocaml/bellairs.mli
···
-
include Bellairs_intf.Sigs
-
module API = API
-20
mvp/ocaml/bellairs_intf.ml
···
-
module type Storage = sig
-
type dir
-
type file
-
type entry = { name : string; file : file }
-
-
val list : dir -> entry list
-
val create : dir -> string -> file
-
val open_ : dir -> string -> file
-
val delete : dir -> string -> unit
-
val size : file -> int64
-
val read : ?off:int64 -> ?len:int64 -> file -> string
-
val write : ?off:int64 -> ?len:int64 -> file -> string -> unit
-
-
(* FIXME: not totally sure if that should be here *)
-
val share : file -> Uri.t
-
end
-
-
module type Sigs = sig
-
module type Storage = Storage
-
end
-158
mvp/ocaml/client/client.ml
···
-
open Capnp_rpc.Std
-
open Eio.Std
-
-
let connect net uri f =
-
Switch.run @@ fun sw ->
-
let client_vat = Capnp_rpc_unix.client_only_vat ~sw net in
-
let client = Capnp_rpc_unix.Vat.import_exn client_vat uri in
-
Capnp_rpc_unix.with_cap_exn client f
-
-
let pp_name ppf name = Fmt.pf ppf "%a" Fmt.(styled `Bold string) name
-
let pp_uri ppf id = Fmt.pf ppf "%a" Fmt.(styled `Yellow Uri.pp) id
-
let pp_entry ppf { Storage.name; _ } = Fmt.pf ppf "%a" pp_name name
-
-
let ls net () uri =
-
connect net uri @@ fun dir ->
-
let entries = Storage.list dir in
-
Fmt.pr "total %d:\n" (List.length entries);
-
List.iter (Fmt.pr "- %a\n" pp_entry) entries;
-
Fmt.pr "%!"
-
-
let create net () uri name data =
-
connect net uri @@ fun dir ->
-
let file = Storage.create dir name in
-
Storage.write file data;
-
Fmt.pr "%a is created.\n%!" pp_name name
-
-
let share net () uri name =
-
connect net uri @@ fun dir ->
-
Capability.with_ref (Storage.open_ dir name) @@ fun file ->
-
let uri = Storage.share file in
-
Fmt.pr "%a\n%!" pp_uri uri
-
-
let delete net () uri name =
-
connect net uri @@ fun dir ->
-
Storage.delete dir name;
-
Fmt.pr "%a is deleted.\n%!" pp_name name
-
-
let size net () uri name =
-
connect net uri @@ fun dir ->
-
let file = Storage.open_ dir name in
-
let size = Storage.size file in
-
Fmt.pr "%a: %Ld bytes.\n%!" pp_name name size
-
-
let read net () uri name offset length =
-
connect net uri @@ fun dir ->
-
Capability.with_ref (Storage.open_ dir name) @@ fun file ->
-
let data = Storage.read ?off:offset ?len:length file in
-
Fmt.pr "%a: %S\n%!" pp_name name data
-
-
let write net () uri name offset length data =
-
connect net uri @@ fun dir ->
-
Capability.with_ref (Storage.open_ dir name) @@ fun file ->
-
Storage.write ?off:offset ?len:length file data;
-
Fmt.pr "%d bytes successfully written into %a.\n%!" (String.length data)
-
pp_name name
-
-
open Cmdliner
-
-
let () =
-
Logs.set_level (Some Logs.Warning);
-
Logs.set_reporter (Logs_fmt.reporter ())
-
-
let connect_addr =
-
let env = Cmd.Env.info "BELLAIRS_CAP" in
-
let i =
-
Arg.info ~env [ "cap" ] ~docv:"CAP" ~doc:"capabilities file(capnp://...)"
-
in
-
Arg.(required @@ opt (some Capnp_rpc_unix.sturdy_uri) None i)
-
-
let name_arg =
-
let i = Arg.info [] ~docv:"NAME" ~doc:"Name of the file" in
-
Arg.(required @@ pos 0 (some string) None i)
-
-
let data_arg =
-
let i = Arg.info [] ~docv:"DATA" ~doc:"Data of the file" in
-
Arg.(required @@ pos 1 (some string) None i)
-
-
let offset_arg =
-
let i =
-
Arg.info [ "o"; "offset" ] ~docv:"OFFSET"
-
~doc:"Offset from where to start reading (default: 0)"
-
in
-
Arg.(value @@ opt (some int64) None i)
-
-
let length_arg =
-
let i =
-
Arg.info [ "l"; "length" ] ~docv:"LENGTH"
-
~doc:"Number of bytes to read (default: all)"
-
in
-
Arg.(value @@ opt (some int64) None i)
-
-
let setup_log style_renderer level =
-
Fmt_tty.setup_std_outputs ?style_renderer ();
-
Logs.set_level level;
-
Logs.set_reporter (Logs_fmt.reporter ());
-
()
-
-
let setup_log =
-
Term.(const setup_log $ Fmt_cli.style_renderer () $ Logs_cli.level ())
-
-
let ls_cmd env =
-
let doc = "List files in the directory" in
-
let info = Cmd.info "ls" ~doc in
-
Cmd.v info Term.(const (ls env#net) $ setup_log $ connect_addr)
-
-
let create_cmd env =
-
let doc = "Create a new file" in
-
let info = Cmd.info "create" ~doc in
-
Cmd.v info
-
Term.(
-
const (create env#net) $ setup_log $ connect_addr $ name_arg $ data_arg)
-
-
let share_cmd env =
-
let doc = "Open an existing file and show its ID" in
-
let info = Cmd.info "share" ~doc in
-
Cmd.v info Term.(const (share env#net) $ setup_log $ connect_addr $ name_arg)
-
-
let delete_cmd env =
-
let doc = "Delete a file" in
-
let info = Cmd.info "delete" ~doc in
-
Cmd.v info Term.(const (delete env#net) $ setup_log $ connect_addr $ name_arg)
-
-
let size_cmd env =
-
let doc = "Get the size of a file" in
-
let info = Cmd.info "size" ~doc in
-
Cmd.v info Term.(const (size env#net) $ setup_log $ connect_addr $ name_arg)
-
-
let read_cmd env =
-
let doc = "Read the contents of a file" in
-
let info = Cmd.info "read" ~doc in
-
Cmd.v info
-
Term.(
-
const (read env#net)
-
$ setup_log $ connect_addr $ name_arg $ offset_arg $ length_arg)
-
-
let write_cmd env =
-
let doc = "Write some contents to a file" in
-
let info = Cmd.info "write" ~doc in
-
Cmd.v info
-
Term.(
-
const (write env#net)
-
$ setup_log $ connect_addr $ name_arg $ offset_arg $ length_arg $ data_arg)
-
-
let main_cmd env =
-
let doc = "Bellairs Storage Client" in
-
let info = Cmd.info "bellairs" ~doc in
-
Cmd.group info
-
[
-
ls_cmd env;
-
create_cmd env;
-
share_cmd env;
-
delete_cmd env;
-
size_cmd env;
-
read_cmd env;
-
write_cmd env;
-
]
-
-
let () = exit @@ Eio_main.run @@ fun env -> Cmd.eval (main_cmd env)
-1
mvp/ocaml/client/client.mli
···
-
(* empty *)
-11
mvp/ocaml/client/dune
···
-
(executables
-
(names client)
-
(libraries
-
bellairs
-
eio_main
-
capnp-rpc
-
logs.fmt
-
capnp-rpc-unix
-
fmt.cli
-
logs.cli
-
fmt.tty))
-70
mvp/ocaml/client/storage.ml
···
-
open Capnp_rpc
-
open Bellairs
-
-
type file = API.Client.File.t Capability.t
-
type dir = API.Client.Directory.t Capability.t
-
type entry = { name : string; file : file }
-
-
let entry r =
-
let name = API.Reader.Directory.Entry.name_get r in
-
let file = API.Reader.Directory.Entry.file_get r in
-
match file with
-
| Some file -> { name; file }
-
| None -> failwith "missing entry.file"
-
-
let list t =
-
let open API.Client.Directory.List in
-
let request = Capability.Request.create_no_args () in
-
let results = Capability.call_for_value_exn t method_id request in
-
let entries = Results.entries_get_list results in
-
List.map entry entries
-
-
let create t name =
-
let open API.Client.Directory.Create in
-
let request, params = Capability.Request.create Params.init_pointer in
-
Params.name_set params name;
-
Capability.call_for_caps t method_id request Results.file_get_pipelined
-
-
let open_ t name =
-
let open API.Client.Directory.Open in
-
let request, params = Capability.Request.create Params.init_pointer in
-
Params.name_set params name;
-
Capability.call_for_caps t method_id request Results.file_get_pipelined
-
-
let delete t name =
-
let open API.Client.Directory.Delete in
-
let request, params = Capability.Request.create Params.init_pointer in
-
Params.name_set params name;
-
Capability.call_for_unit_exn t method_id request
-
-
let size t =
-
let open API.Client.File.Size in
-
let request = Capability.Request.create_no_args () in
-
let results = Capability.call_for_value_exn t method_id request in
-
Stdint.Int64.of_uint64 (Results.size_get results)
-
-
let share t =
-
let open API.Client.File.Share in
-
let request = Capability.Request.create_no_args () in
-
let results = Capability.call_for_value_exn t method_id request in
-
Uri.of_string (Results.uri_get results)
-
-
let opt_set f params = function
-
| None -> ()
-
| Some n -> f params (Stdint.Int64.to_uint64 n)
-
-
let read ?off ?len t =
-
let open API.Client.File.Read in
-
let request, params = Capability.Request.create Params.init_pointer in
-
opt_set Params.off_set params off;
-
opt_set Params.len_set params len;
-
let results = Capability.call_for_value_exn t method_id request in
-
Results.data_get results
-
-
let write ?off ?len t d =
-
let open API.Client.File.Write in
-
let request, params = Capability.Request.create Params.init_pointer in
-
opt_set Params.off_set params off;
-
opt_set Params.len_set params len;
-
Params.data_set params d;
-
Capability.call_for_unit_exn t method_id request
-7
mvp/ocaml/client/storage.mli
···
-
open Capnp_rpc
-
open Bellairs.API.Client
-
-
include
-
Bellairs.Storage
-
with type file = File.t Capability.t
-
and type dir = Directory.t Capability.t
-3
mvp/ocaml/dune
···
-
(library
-
(name bellairs)
-
(libraries schema capnp-rpc))
-12
mvp/ocaml/schema/dune
···
-
(copy_files ../../schema/storage.capnp)
-
-
(rule
-
(targets storage.ml storage.mli)
-
(deps storage.capnp)
-
(action
-
(run capnp compile -o %{bin:capnpc-ocaml} %{deps})))
-
-
(library
-
(name schema)
-
(modules storage)
-
(libraries capnp))
-56
mvp/ocaml/server/directory.ml
···
-
open Capnp_rpc.Std
-
module API = Schema.Storage.MakeRPC (Capnp_rpc)
-
-
let local dir =
-
let module Directory = API.Service.Directory in
-
Directory.local
-
@@ object
-
inherit Directory.service
-
-
method create_impl params release_param_caps =
-
let open Directory.Create in
-
let name = Params.name_get params in
-
release_param_caps ();
-
let file = Impl.create dir name in
-
let file_cap = File.local file in
-
let response, results = Service.Response.create Results.init_pointer in
-
Results.file_set results (Some file_cap);
-
Capability.dec_ref file_cap;
-
Service.return response
-
-
method list_impl _ release_param_caps =
-
let open Directory.List in
-
release_param_caps ();
-
let response, results = Service.Response.create Results.init_pointer in
-
let entries = Impl.list dir in
-
let entries_array =
-
Results.entries_init results (List.length entries)
-
in
-
List.iteri
-
(fun i e ->
-
let entry = Capnp.Array.get entries_array i in
-
let file = File.local e.Impl.file in
-
API.Builder.Directory.Entry.name_set entry e.Impl.name;
-
API.Builder.Directory.Entry.file_set entry (Some file))
-
entries;
-
Service.return response
-
-
method open_impl params _release_param_caps =
-
let open Directory.Open in
-
let name = Params.name_get params in
-
let response, results = Service.Response.create Results.init_pointer in
-
try
-
let file = Impl.open_ dir name in
-
let file_cap = File.local file in
-
Results.file_set results (Some file_cap);
-
Service.return response
-
with Not_found -> Service.fail "File '%s' not found" name
-
-
method delete_impl params release_param_caps =
-
let open Directory.Delete in
-
let name = Params.name_get params in
-
release_param_caps ();
-
let response = Service.Response.create_empty () in
-
Impl.delete dir name;
-
Service.return response
-
end
-4
mvp/ocaml/server/directory.mli
···
-
open Bellairs
-
open Capnp_rpc
-
-
val local : Impl.dir -> API.Service.Directory.t Capability.t
-11
mvp/ocaml/server/dune
···
-
(executable
-
(name server)
-
(libraries
-
bellairs
-
eio_main
-
capnp-rpc
-
logs.fmt
-
fmt.cli
-
logs.cli
-
fmt.tty
-
capnp-rpc-unix))
-48
mvp/ocaml/server/file.ml
···
-
open Bellairs
-
open Capnp_rpc.Std
-
-
let int64_of_uint64 n =
-
match Stdint.Int64.of_uint64 n with -1L -> None | i -> Some i
-
-
let local file =
-
let module File = API.Service.File in
-
File.local
-
@@ object (self)
-
inherit File.service
-
-
method share_impl _params release_param_caps =
-
let open File.Share in
-
release_param_caps ();
-
let response, results = Service.Response.create Results.init_pointer in
-
let uri = Capnp_rpc.Persistence.save_exn (File.local self) in
-
Results.uri_set results (Uri.to_string uri);
-
Service.return response
-
-
method read_impl params release_param_caps =
-
let open File.Read in
-
let off = int64_of_uint64 (Params.off_get params) in
-
let len = int64_of_uint64 (Params.len_get params) in
-
release_param_caps ();
-
let response, results = Service.Response.create Results.init_pointer in
-
let data = Impl.read file ?off ?len in
-
Results.data_set results data;
-
Service.return response
-
-
method write_impl params release_param_caps =
-
let open File.Write in
-
let off = int64_of_uint64 (Params.off_get params) in
-
let len = int64_of_uint64 (Params.len_get params) in
-
let data = Params.data_get params in
-
release_param_caps ();
-
let response = Service.Response.create_empty () in
-
Impl.write file ?off ?len data;
-
Service.return response
-
-
method size_impl _ release_param_caps =
-
let open File.Size in
-
release_param_caps ();
-
let response, results = Service.Response.create Results.init_pointer in
-
let size = Stdint.Int64.to_uint64 (Impl.size file) in
-
Results.size_set results size;
-
Service.return response
-
end
-4
mvp/ocaml/server/file.mli
···
-
open Bellairs
-
open Capnp_rpc
-
-
val local : Impl.file -> API.Service.File.t Capability.t
-49
mvp/ocaml/server/impl.ml
···
-
(* TODO: put the real implementation here -- for now it's just an
-
in-memory database *)
-
-
type file = { mutable content : string }
-
type dir = { files : (string, file) Hashtbl.t }
-
type entry = { name : string; file : file }
-
-
let create { files } name =
-
let file = { content = "" } in
-
Hashtbl.add files name file;
-
file
-
-
let root () = { files = Hashtbl.create 10 }
-
let open_ dir name = Hashtbl.find dir.files name
-
let delete dir name = Hashtbl.remove dir.files name
-
-
let read ?(off = 0L) ?len file =
-
let content_len = String.length file.content in
-
let off = Int64.to_int off in
-
let len =
-
match len with None -> content_len | Some len -> Int64.to_int len
-
in
-
let max_len = content_len - off in
-
let len = if len >= max_len then max_len else len in
-
String.sub file.content off len
-
-
let write ?(off = 0L) ?len file data =
-
let data_len = String.length data in
-
let off = Int64.to_int off in
-
let len = match len with None -> data_len | Some len -> Int64.to_int len in
-
let required_len = off + len in
-
let file_content =
-
if required_len > String.length file.content then (
-
let new_content = Bytes.make required_len '\000' in
-
String.blit file.content 0 new_content 0 (String.length file.content);
-
let new_content = Bytes.unsafe_to_string new_content in
-
file.content <- new_content;
-
new_content)
-
else file.content
-
in
-
String.blit data 0 (Bytes.unsafe_of_string file_content) off len
-
-
let size file = Int64.of_int (String.length file.content)
-
-
let list dir =
-
Hashtbl.fold (fun name file acc -> { name; file } :: acc) dir.files []
-
-
(* this is done in another layer *)
-
let share _ = assert false
-3
mvp/ocaml/server/impl.mli
···
-
include Bellairs.Storage
-
-
val root : unit -> dir
-37
mvp/ocaml/server/server.ml
···
-
open Eio.Std
-
open Capnp_rpc_net
-
-
let cap_file = "storage.cap"
-
-
let serve () config =
-
Switch.run @@ fun sw ->
-
let make_sturdy = Capnp_rpc_unix.Vat_config.sturdy_uri config in
-
let services = Restorer.Table.create ~sw make_sturdy in
-
let restore = Restorer.of_table services in
-
let root_id = Capnp_rpc_unix.Vat_config.derived_id config "root" in
-
let root = Directory.local (Impl.root ()) in
-
Restorer.Table.add services root_id root;
-
let vat = Capnp_rpc_unix.serve ~sw ~restore config in
-
match Capnp_rpc_unix.Cap_file.save_service vat root_id cap_file with
-
| Error (`Msg m) -> failwith m
-
| Ok () ->
-
traceln "Server running. Connect using %S." cap_file;
-
Fiber.await_cancel ()
-
-
open Cmdliner
-
-
let setup_log style_renderer level =
-
Fmt_tty.setup_std_outputs ?style_renderer ();
-
Logs.set_level level;
-
Logs.set_reporter (Logs_fmt.reporter ());
-
()
-
-
let setup_log =
-
Term.(const setup_log $ Fmt_cli.style_renderer () $ Logs_cli.level ())
-
-
let serve_cmd env =
-
let doc = "run the server" in
-
let info = Cmd.info "serve" ~doc in
-
Cmd.v info Term.(const serve $ setup_log $ Capnp_rpc_unix.Vat_config.cmd env)
-
-
let () = exit @@ Eio_main.run @@ fun env -> Cmd.eval (serve_cmd env)
-1
mvp/ocaml/server/server.mli
···
-
(* empty *)
-39
mvp/schema/storage.capnp
···
-
@0xa59e1c95e37fb55d;
-
-
interface Directory {
-
# Represents a directory in the filesystem
-
-
list @0 () -> (entries :List(Entry));
-
# Lists all entries in the directory
-
-
struct Entry {
-
name @0 :Text; # Name of the entry
-
file @1 :File; # Reference to the file object
-
}
-
-
create @1 (name :Text) -> (file :File);
-
# Creates a new file with the given name
-
-
open @2 (name :Text) -> (file :File);
-
# Opens an existing file with the given name
-
-
delete @3 (name :Text);
-
# Deletes a file with the given name
-
}
-
-
interface File {
-
# Represents a file in the filesystem
-
-
read @0 (off :UInt64 = 0, len :UInt64 = 0xffffffffffffffff) -> (data :Data);
-
# Reads data from the file, optionally starting at offset and reading up to len bytes
-
# Default is to read the entire file
-
-
size @1 () -> (size :UInt64);
-
# Returns the size of the file in bytes
-
-
write @2 (off :UInt64 = 0, len :UInt64 = 0xffffffffffffffff, data :Data) -> ();
-
# Write data to the file, optionally starting at offset and reading up to len bytes
-
# Default is to write the entire file
-
-
share @3 () -> (uri: Text);
-
}
-1
mvp-py/.python-version
···
-
3.12.6
mvp-py/README.md

This is a binary file and will not be displayed.

-55
mvp-py/client.py
···
-
"""
-
A Python client for bellairs.quest to access directories, etc.
-
"""
-
-
import asyncio
-
import socket
-
from typing import Any
-
-
import capnp # type: ignore
-
-
capnp.remove_import_hook()
-
-
cp_storage = capnp.load("schema/storage.capnp")
-
-
-
class Directory:
-
"""
-
Wrapper class for the directory. Many of these methods are
-
async, unfortunately.
-
"""
-
-
def __init__(self, addr: str, port: str, family: int):
-
"""Create a directory using the provided address and port"""
-
# family should be AF_UNIX, AF_INET, or AF_INET6. Not sure that capnp
-
# can handle any of the others.
-
# TODO: Hmm should `port` be int?
-
# TODO: If we want SSL, need to create a ssl.context, and pass it in
-
# using `ssl=ctx`
-
self._capnp_client = capnp.TwoPartyClient(addr, port).bootstrap()
-
self._capnp_dir = self._capnp_client.cast_as(cp_storage.Directory)
-
-
async def list(self):
-
result = await self._capnp_dir.list()
-
# Return names for now. Still need to write file
-
return [(e.name, File(e.file)) for e in result.entries]
-
-
-
class File:
-
"""
-
Wrapper class for files
-
"""
-
-
def __init__(self, cobj: Any):
-
# Note: cobj is of type cp_storage.File, but MyPy
-
# cannot deal with types defined in this way.
-
self._capnp_file = cobj
-
-
async def size(self) -> int:
-
result = await self._capnp_file.size()
-
return result.size
-
-
# FIXME: Find a better type than Any
-
async def read(self, offset: int = 0, len: int = 0xFFFFFFFFFFFFFFFF) -> Any:
-
result = await self._capnp_file.read(offset, len)
-
return result.data
-6
mvp-py/main.py
···
-
def main():
-
print("Hello from mvp-py!")
-
-
-
if __name__ == "__main__":
-
main()
-12
mvp-py/pyproject.toml
···
-
[project]
-
name = "mvp-py"
-
version = "0.1.0"
-
description = "Add your description here"
-
readme = "README.md"
-
# Does not work, yet, with 3.13
-
requires-python = ">=3.9.6"
-
dependencies = [
-
"black>=25.1.0",
-
"mypy>=1.15.0",
-
"pycapnp>=2.0.0",
-
]
-1
mvp-py/schema/storage.capnp
···
-
../../mvp/schema/storage.capnp
-271
mvp-py/uv.lock
···
-
version = 1
-
revision = 1
-
requires-python = ">=3.9.6"
-
-
[[package]]
-
name = "black"
-
version = "25.1.0"
-
source = { registry = "https://pypi.org/simple" }
-
dependencies = [
-
{ name = "click" },
-
{ name = "mypy-extensions" },
-
{ name = "packaging" },
-
{ name = "pathspec" },
-
{ name = "platformdirs" },
-
{ name = "tomli", marker = "python_full_version < '3.11'" },
-
{ name = "typing-extensions", marker = "python_full_version < '3.11'" },
-
]
-
sdist = { url = "https://files.pythonhosted.org/packages/94/49/26a7b0f3f35da4b5a65f081943b7bcd22d7002f5f0fb8098ec1ff21cb6ef/black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", size = 649449 }
-
wheels = [
-
{ url = "https://files.pythonhosted.org/packages/4d/3b/4ba3f93ac8d90410423fdd31d7541ada9bcee1df32fb90d26de41ed40e1d/black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32", size = 1629419 },
-
{ url = "https://files.pythonhosted.org/packages/b4/02/0bde0485146a8a5e694daed47561785e8b77a0466ccc1f3e485d5ef2925e/black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da", size = 1461080 },
-
{ url = "https://files.pythonhosted.org/packages/52/0e/abdf75183c830eaca7589144ff96d49bce73d7ec6ad12ef62185cc0f79a2/black-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7", size = 1766886 },
-
{ url = "https://files.pythonhosted.org/packages/dc/a6/97d8bb65b1d8a41f8a6736222ba0a334db7b7b77b8023ab4568288f23973/black-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9", size = 1419404 },
-
{ url = "https://files.pythonhosted.org/packages/7e/4f/87f596aca05c3ce5b94b8663dbfe242a12843caaa82dd3f85f1ffdc3f177/black-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0", size = 1614372 },
-
{ url = "https://files.pythonhosted.org/packages/e7/d0/2c34c36190b741c59c901e56ab7f6e54dad8df05a6272a9747ecef7c6036/black-25.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299", size = 1442865 },
-
{ url = "https://files.pythonhosted.org/packages/21/d4/7518c72262468430ead45cf22bd86c883a6448b9eb43672765d69a8f1248/black-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096", size = 1749699 },
-
{ url = "https://files.pythonhosted.org/packages/58/db/4f5beb989b547f79096e035c4981ceb36ac2b552d0ac5f2620e941501c99/black-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2", size = 1428028 },
-
{ url = "https://files.pythonhosted.org/packages/83/71/3fe4741df7adf015ad8dfa082dd36c94ca86bb21f25608eb247b4afb15b2/black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b", size = 1650988 },
-
{ url = "https://files.pythonhosted.org/packages/13/f3/89aac8a83d73937ccd39bbe8fc6ac8860c11cfa0af5b1c96d081facac844/black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc", size = 1453985 },
-
{ url = "https://files.pythonhosted.org/packages/6f/22/b99efca33f1f3a1d2552c714b1e1b5ae92efac6c43e790ad539a163d1754/black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f", size = 1783816 },
-
{ url = "https://files.pythonhosted.org/packages/18/7e/a27c3ad3822b6f2e0e00d63d58ff6299a99a5b3aee69fa77cd4b0076b261/black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba", size = 1440860 },
-
{ url = "https://files.pythonhosted.org/packages/98/87/0edf98916640efa5d0696e1abb0a8357b52e69e82322628f25bf14d263d1/black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", size = 1650673 },
-
{ url = "https://files.pythonhosted.org/packages/52/e5/f7bf17207cf87fa6e9b676576749c6b6ed0d70f179a3d812c997870291c3/black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", size = 1453190 },
-
{ url = "https://files.pythonhosted.org/packages/e3/ee/adda3d46d4a9120772fae6de454c8495603c37c4c3b9c60f25b1ab6401fe/black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", size = 1782926 },
-
{ url = "https://files.pythonhosted.org/packages/cc/64/94eb5f45dcb997d2082f097a3944cfc7fe87e071907f677e80788a2d7b7a/black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", size = 1442613 },
-
{ url = "https://files.pythonhosted.org/packages/d3/b6/ae7507470a4830dbbfe875c701e84a4a5fb9183d1497834871a715716a92/black-25.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1ee0a0c330f7b5130ce0caed9936a904793576ef4d2b98c40835d6a65afa6a0", size = 1628593 },
-
{ url = "https://files.pythonhosted.org/packages/24/c1/ae36fa59a59f9363017ed397750a0cd79a470490860bc7713967d89cdd31/black-25.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3df5f1bf91d36002b0a75389ca8663510cf0531cca8aa5c1ef695b46d98655f", size = 1460000 },
-
{ url = "https://files.pythonhosted.org/packages/ac/b6/98f832e7a6c49aa3a464760c67c7856363aa644f2f3c74cf7d624168607e/black-25.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9e6827d563a2c820772b32ce8a42828dc6790f095f441beef18f96aa6f8294e", size = 1765963 },
-
{ url = "https://files.pythonhosted.org/packages/ce/e9/2cb0a017eb7024f70e0d2e9bdb8c5a5b078c5740c7f8816065d06f04c557/black-25.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:bacabb307dca5ebaf9c118d2d2f6903da0d62c9faa82bd21a33eecc319559355", size = 1419419 },
-
{ url = "https://files.pythonhosted.org/packages/09/71/54e999902aed72baf26bca0d50781b01838251a462612966e9fc4891eadd/black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", size = 207646 },
-
]
-
-
[[package]]
-
name = "click"
-
version = "8.1.8"
-
source = { registry = "https://pypi.org/simple" }
-
dependencies = [
-
{ name = "colorama", marker = "sys_platform == 'win32'" },
-
]
-
sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 }
-
wheels = [
-
{ url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 },
-
]
-
-
[[package]]
-
name = "colorama"
-
version = "0.4.6"
-
source = { registry = "https://pypi.org/simple" }
-
sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 }
-
wheels = [
-
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
-
]
-
-
[[package]]
-
name = "mvp-py"
-
version = "0.1.0"
-
source = { virtual = "." }
-
dependencies = [
-
{ name = "black" },
-
{ name = "mypy" },
-
{ name = "pycapnp" },
-
]
-
-
[package.metadata]
-
requires-dist = [
-
{ name = "black", specifier = ">=25.1.0" },
-
{ name = "mypy", specifier = ">=1.15.0" },
-
{ name = "pycapnp", specifier = ">=2.0.0" },
-
]
-
-
[[package]]
-
name = "mypy"
-
version = "1.15.0"
-
source = { registry = "https://pypi.org/simple" }
-
dependencies = [
-
{ name = "mypy-extensions" },
-
{ name = "tomli", marker = "python_full_version < '3.11'" },
-
{ name = "typing-extensions" },
-
]
-
sdist = { url = "https://files.pythonhosted.org/packages/ce/43/d5e49a86afa64bd3839ea0d5b9c7103487007d728e1293f52525d6d5486a/mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43", size = 3239717 }
-
wheels = [
-
{ url = "https://files.pythonhosted.org/packages/68/f8/65a7ce8d0e09b6329ad0c8d40330d100ea343bd4dd04c4f8ae26462d0a17/mypy-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13", size = 10738433 },
-
{ url = "https://files.pythonhosted.org/packages/b4/95/9c0ecb8eacfe048583706249439ff52105b3f552ea9c4024166c03224270/mypy-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559", size = 9861472 },
-
{ url = "https://files.pythonhosted.org/packages/84/09/9ec95e982e282e20c0d5407bc65031dfd0f0f8ecc66b69538296e06fcbee/mypy-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be68172e9fd9ad8fb876c6389f16d1c1b5f100ffa779f77b1fb2176fcc9ab95b", size = 11611424 },
-
{ url = "https://files.pythonhosted.org/packages/78/13/f7d14e55865036a1e6a0a69580c240f43bc1f37407fe9235c0d4ef25ffb0/mypy-1.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7be1e46525adfa0d97681432ee9fcd61a3964c2446795714699a998d193f1a3", size = 12365450 },
-
{ url = "https://files.pythonhosted.org/packages/48/e1/301a73852d40c241e915ac6d7bcd7fedd47d519246db2d7b86b9d7e7a0cb/mypy-1.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2e2c2e6d3593f6451b18588848e66260ff62ccca522dd231cd4dd59b0160668b", size = 12551765 },
-
{ url = "https://files.pythonhosted.org/packages/77/ba/c37bc323ae5fe7f3f15a28e06ab012cd0b7552886118943e90b15af31195/mypy-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:6983aae8b2f653e098edb77f893f7b6aca69f6cffb19b2cc7443f23cce5f4828", size = 9274701 },
-
{ url = "https://files.pythonhosted.org/packages/03/bc/f6339726c627bd7ca1ce0fa56c9ae2d0144604a319e0e339bdadafbbb599/mypy-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2922d42e16d6de288022e5ca321cd0618b238cfc5570e0263e5ba0a77dbef56f", size = 10662338 },
-
{ url = "https://files.pythonhosted.org/packages/e2/90/8dcf506ca1a09b0d17555cc00cd69aee402c203911410136cd716559efe7/mypy-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ee2d57e01a7c35de00f4634ba1bbf015185b219e4dc5909e281016df43f5ee5", size = 9787540 },
-
{ url = "https://files.pythonhosted.org/packages/05/05/a10f9479681e5da09ef2f9426f650d7b550d4bafbef683b69aad1ba87457/mypy-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:973500e0774b85d9689715feeffcc980193086551110fd678ebe1f4342fb7c5e", size = 11538051 },
-
{ url = "https://files.pythonhosted.org/packages/e9/9a/1f7d18b30edd57441a6411fcbc0c6869448d1a4bacbaee60656ac0fc29c8/mypy-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a95fb17c13e29d2d5195869262f8125dfdb5c134dc8d9a9d0aecf7525b10c2c", size = 12286751 },
-
{ url = "https://files.pythonhosted.org/packages/72/af/19ff499b6f1dafcaf56f9881f7a965ac2f474f69f6f618b5175b044299f5/mypy-1.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1905f494bfd7d85a23a88c5d97840888a7bd516545fc5aaedff0267e0bb54e2f", size = 12421783 },
-
{ url = "https://files.pythonhosted.org/packages/96/39/11b57431a1f686c1aed54bf794870efe0f6aeca11aca281a0bd87a5ad42c/mypy-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:c9817fa23833ff189db061e6d2eff49b2f3b6ed9856b4a0a73046e41932d744f", size = 9265618 },
-
{ url = "https://files.pythonhosted.org/packages/98/3a/03c74331c5eb8bd025734e04c9840532226775c47a2c39b56a0c8d4f128d/mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd", size = 10793981 },
-
{ url = "https://files.pythonhosted.org/packages/f0/1a/41759b18f2cfd568848a37c89030aeb03534411eef981df621d8fad08a1d/mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f", size = 9749175 },
-
{ url = "https://files.pythonhosted.org/packages/12/7e/873481abf1ef112c582db832740f4c11b2bfa510e829d6da29b0ab8c3f9c/mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464", size = 11455675 },
-
{ url = "https://files.pythonhosted.org/packages/b3/d0/92ae4cde706923a2d3f2d6c39629134063ff64b9dedca9c1388363da072d/mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee", size = 12410020 },
-
{ url = "https://files.pythonhosted.org/packages/46/8b/df49974b337cce35f828ba6fda228152d6db45fed4c86ba56ffe442434fd/mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e", size = 12498582 },
-
{ url = "https://files.pythonhosted.org/packages/13/50/da5203fcf6c53044a0b699939f31075c45ae8a4cadf538a9069b165c1050/mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22", size = 9366614 },
-
{ url = "https://files.pythonhosted.org/packages/6a/9b/fd2e05d6ffff24d912f150b87db9e364fa8282045c875654ce7e32fffa66/mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445", size = 10788592 },
-
{ url = "https://files.pythonhosted.org/packages/74/37/b246d711c28a03ead1fd906bbc7106659aed7c089d55fe40dd58db812628/mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d", size = 9753611 },
-
{ url = "https://files.pythonhosted.org/packages/a6/ac/395808a92e10cfdac8003c3de9a2ab6dc7cde6c0d2a4df3df1b815ffd067/mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5", size = 11438443 },
-
{ url = "https://files.pythonhosted.org/packages/d2/8b/801aa06445d2de3895f59e476f38f3f8d610ef5d6908245f07d002676cbf/mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036", size = 12402541 },
-
{ url = "https://files.pythonhosted.org/packages/c7/67/5a4268782eb77344cc613a4cf23540928e41f018a9a1ec4c6882baf20ab8/mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357", size = 12494348 },
-
{ url = "https://files.pythonhosted.org/packages/83/3e/57bb447f7bbbfaabf1712d96f9df142624a386d98fb026a761532526057e/mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf", size = 9373648 },
-
{ url = "https://files.pythonhosted.org/packages/5a/fa/79cf41a55b682794abe71372151dbbf856e3008f6767057229e6649d294a/mypy-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e601a7fa172c2131bff456bb3ee08a88360760d0d2f8cbd7a75a65497e2df078", size = 10737129 },
-
{ url = "https://files.pythonhosted.org/packages/d3/33/dd8feb2597d648de29e3da0a8bf4e1afbda472964d2a4a0052203a6f3594/mypy-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:712e962a6357634fef20412699a3655c610110e01cdaa6180acec7fc9f8513ba", size = 9856335 },
-
{ url = "https://files.pythonhosted.org/packages/e4/b5/74508959c1b06b96674b364ffeb7ae5802646b32929b7701fc6b18447592/mypy-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95579473af29ab73a10bada2f9722856792a36ec5af5399b653aa28360290a5", size = 11611935 },
-
{ url = "https://files.pythonhosted.org/packages/6c/53/da61b9d9973efcd6507183fdad96606996191657fe79701b2c818714d573/mypy-1.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f8722560a14cde92fdb1e31597760dc35f9f5524cce17836c0d22841830fd5b", size = 12365827 },
-
{ url = "https://files.pythonhosted.org/packages/c1/72/965bd9ee89540c79a25778cc080c7e6ef40aa1eeac4d52cec7eae6eb5228/mypy-1.15.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fbb8da62dc352133d7d7ca90ed2fb0e9d42bb1a32724c287d3c76c58cbaa9c2", size = 12541924 },
-
{ url = "https://files.pythonhosted.org/packages/46/d0/f41645c2eb263e6c77ada7d76f894c580c9ddb20d77f0c24d34273a4dab2/mypy-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:d10d994b41fb3497719bbf866f227b3489048ea4bbbb5015357db306249f7980", size = 9271176 },
-
{ url = "https://files.pythonhosted.org/packages/09/4e/a7d65c7322c510de2c409ff3828b03354a7c43f5a8ed458a7a131b41c7b9/mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e", size = 2221777 },
-
]
-
-
[[package]]
-
name = "mypy-extensions"
-
version = "1.0.0"
-
source = { registry = "https://pypi.org/simple" }
-
sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433 }
-
wheels = [
-
{ url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 },
-
]
-
-
[[package]]
-
name = "packaging"
-
version = "24.2"
-
source = { registry = "https://pypi.org/simple" }
-
sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 }
-
wheels = [
-
{ url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 },
-
]
-
-
[[package]]
-
name = "pathspec"
-
version = "0.12.1"
-
source = { registry = "https://pypi.org/simple" }
-
sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 }
-
wheels = [
-
{ url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 },
-
]
-
-
[[package]]
-
name = "platformdirs"
-
version = "4.3.7"
-
source = { registry = "https://pypi.org/simple" }
-
sdist = { url = "https://files.pythonhosted.org/packages/b6/2d/7d512a3913d60623e7eb945c6d1b4f0bddf1d0b7ada5225274c87e5b53d1/platformdirs-4.3.7.tar.gz", hash = "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351", size = 21291 }
-
wheels = [
-
{ url = "https://files.pythonhosted.org/packages/6d/45/59578566b3275b8fd9157885918fcd0c4d74162928a5310926887b856a51/platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94", size = 18499 },
-
]
-
-
[[package]]
-
name = "pycapnp"
-
version = "2.0.0"
-
source = { registry = "https://pypi.org/simple" }
-
sdist = { url = "https://files.pythonhosted.org/packages/9b/fb/54b46b52c1fa2acd9afd81bd05810c61bb1b05c6084c9625b64bc6d41843/pycapnp-2.0.0.tar.gz", hash = "sha256:503ab9b7b16773590ee226f2460408972c6b1c2cb2d819037115b919bef682be", size = 574848 }
-
wheels = [
-
{ url = "https://files.pythonhosted.org/packages/69/da/562114ce916f139a16018c43a9e0a4ff707fde6a91983ee815141b0f2333/pycapnp-2.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:12fc023da9acd062884c9b394113457908b3c5e26aeb85f668b59c0e84b7b150", size = 1679335 },
-
{ url = "https://files.pythonhosted.org/packages/c3/f7/fd1db2306dc45bf49cc5ceb0c162a247e123cf2b9ae3eaed45f14e7fdc17/pycapnp-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c8f5e4e68a1b59ae73cd77550b95f8719aea624aa424cd77aa193c6d45ea97ab", size = 1523005 },
-
{ url = "https://files.pythonhosted.org/packages/37/b4/22aa3c822826f8fb4955053033a6ab398cae1593d35de7b8e8814690a748/pycapnp-2.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50ff7f45d77dc2ef0c44a0aef41f37433a0c395b6a1db99b7e6f45e0e9237bd4", size = 4699521 },
-
{ url = "https://files.pythonhosted.org/packages/39/3d/b0da69a3021f64111edbed6ff91077658b294f50a6dde5a6ad572a3a2e3e/pycapnp-2.0.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc68ef3d80d9e7e9b96ba2077d8e2effd42f936bda1024f1aedc05022c9401bb", size = 4818053 },
-
{ url = "https://files.pythonhosted.org/packages/67/0d/e668033c6d2d63a661822645ad5112308d6e81d36f0881bfb55e58685518/pycapnp-2.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74a75e5c190e4d722aa0d2702bd04fedc2cb8e0a893031813e7a50cc067a054a", size = 4973514 },
-
{ url = "https://files.pythonhosted.org/packages/b5/1d/60b8ac6ea0aab7b6649993f46daafc08f559e9377fa19933e27ee676d311/pycapnp-2.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:db1bc53cbe5222f4fd0748ba6b53da9ec58e8f7b2219dc9cd50d15266a3fa85c", size = 4839079 },
-
{ url = "https://files.pythonhosted.org/packages/1e/b4/7185210aab0ca0f458db5807c3d7f3bcd6e3642bcc306d5f93027900eca6/pycapnp-2.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a0509ef856239634be21375cbad73dc7cf7fdfb32c03c312ad41e994f0674f7", size = 4859945 },
-
{ url = "https://files.pythonhosted.org/packages/88/19/fc82fe79538d36a9cda3c2c172415b05f770e61de2a3315505d18fa3c956/pycapnp-2.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:48372a19b59e8d533768c12988a92af4ea6c2daa1a8ba1c42202cd0dd24a1d24", size = 5258129 },
-
{ url = "https://files.pythonhosted.org/packages/c0/f7/b6a784268f306e2e67ebff0f7b0b0ee1fd0eefde87a53644ffb6a8bcc71d/pycapnp-2.0.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:46c16a98cec9ae6dce5ebf488bb0c8425484d7710eed1ee008a26b60470ee755", size = 5452125 },
-
{ url = "https://files.pythonhosted.org/packages/79/29/af2ea1f89d7493e6f3dac74d2924fd40e6aaaaefd24fc609e1fa65621396/pycapnp-2.0.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:be91cdb7895c4e2f1e1cd6b701ed66050c285d2c228f476a775bfd76bbd697f1", size = 5551321 },
-
{ url = "https://files.pythonhosted.org/packages/8d/ce/1034d8e30ac5b10e945517ed795470e7f3b1cf67d691eb4a31d6b760ec34/pycapnp-2.0.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:21db83e5f0c3a944b567cd20e4df47dba023e936a45d7057f2a615b8c19356f8", size = 5438794 },
-
{ url = "https://files.pythonhosted.org/packages/6d/61/dc476eb0a2889ec0babc55af7392f8bc1534656a98d241ee54145704215a/pycapnp-2.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:825a8a86e034d66d8df8d82b7bf9fdd3f344bd84ff43a838ec08f08fe7461be0", size = 5425971 },
-
{ url = "https://files.pythonhosted.org/packages/da/2b/fdcfd06e7a804d2f5e80db3f03d8cb879d48a45df7ae74337bcc49c6728c/pycapnp-2.0.0-cp310-cp310-win32.whl", hash = "sha256:13ff9dca5741079d7bbe4e2512634b8ce859b709a1b126481eed404bda0b3d4a", size = 1044616 },
-
{ url = "https://files.pythonhosted.org/packages/e9/b1/30a3ff0e5930a5fdd323fe66d398cc4b21bfaa79355ba3941950d1984295/pycapnp-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:279d9f7c34527d15a62dde0dfc82cb918ed0a900dfa9713960d64bed3f9236a4", size = 1145453 },
-
{ url = "https://files.pythonhosted.org/packages/cb/82/cf311b1a9800b605759a38a0c337a55a639b685427364294e98a0f9b7306/pycapnp-2.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:829c7eb4e5f23dbcac25466110faf72a691035cf87c5d46e5053da15790e428d", size = 1673673 },
-
{ url = "https://files.pythonhosted.org/packages/ae/55/4c03ca95c568776a1f637db9ffdcf302fb63f46e4d2a4f13edd8cb1a5f90/pycapnp-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dab60fbe3e4eaf99ec97918a0a776216c6c149b6d49261383d91c2201adb475d", size = 1513351 },
-
{ url = "https://files.pythonhosted.org/packages/55/98/e4b2dea076f8a2575abc45cd879a91bc9aa975c69ae2ac1cab61d83c5087/pycapnp-2.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c48a0582078bb74d7326d28571db0b8e6919563365537a5a13e8f5360c12bfc", size = 4910666 },
-
{ url = "https://files.pythonhosted.org/packages/1d/ee/3b5a182588f89074f4002fa6247e3f963bb85bc808acd1ac8deed91f1fa7/pycapnp-2.0.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcb5ab54aff857e3711d2c0cc934194aaffacdeb3481daa56863daef07d27941", size = 5007434 },
-
{ url = "https://files.pythonhosted.org/packages/c5/e9/515a2ca7fdc84d57c654280d0b71dfd782fd1773d384c0ec0d56dc6fc35b/pycapnp-2.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9600778036e6fe9dbea68f0c37678c5f4d561d2f2306b3cb741de5e1670ef2ae", size = 5188923 },
-
{ url = "https://files.pythonhosted.org/packages/70/60/5db346e238985a526ba7589ed24f92195dad39e7dec9d85b17a567600b6f/pycapnp-2.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7278ba0262fab8c398e77d634ae7ba026866d44b52cbfc27262be8d396ecacd1", size = 5048105 },
-
{ url = "https://files.pythonhosted.org/packages/e3/ff/02b4a87c9ff9793f26d8f3d95312d902d260c094f216d84e19528a506606/pycapnp-2.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23b2458d43c82302980a96518c96df257429204d2cc02bfff0c8cb6ebb371e01", size = 5063172 },
-
{ url = "https://files.pythonhosted.org/packages/10/a1/35a7e14d765f99cfdcdfdcebc69bdf382f27016944470daa7a03c557f681/pycapnp-2.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dd7755cc3fedc2ad8cc7864a0729471ddeff10c184963fe0f3689e295130f1b2", size = 5408718 },
-
{ url = "https://files.pythonhosted.org/packages/5c/59/8bc8a993c38808c6fd90b10becba8de4a54543e8441bd87ce44ef3b7eee4/pycapnp-2.0.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d47baf6b3db9981625ffc5ff188e089f2ebca8e7e1afb97aa5eb7bebb7bf3650", size = 5596714 },
-
{ url = "https://files.pythonhosted.org/packages/ea/7d/79c481ef77f29e81355e92bb250f0d2a37a76f5fe0ba9433bf6c6c88b6e4/pycapnp-2.0.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b375be92d93fdb6f7ac127ea9390bcec0fed4e485db137b084f9e7114dde7c83", size = 5709896 },
-
{ url = "https://files.pythonhosted.org/packages/59/8d/f2eceeea1e8cae8b8a70a4752af5b772916f455e2ed388d0887e2b57d080/pycapnp-2.0.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:959bfdf1cddb3e5528e2293c4a375382be9a1bf044b073bc2e7eca1eb6b3a9a2", size = 5594823 },
-
{ url = "https://files.pythonhosted.org/packages/2c/86/f8284637b61f83232e5618dd561a66080dd98ce2272d7e3ae89335d4fd97/pycapnp-2.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d873af167cf5cc7578ce5432eefcb442f866c8f7a6c57d188baf8c5e709fa39d", size = 5572564 },
-
{ url = "https://files.pythonhosted.org/packages/b3/b2/7f99d28a9935d1e37ec6955922c57b2be24fe0b74fe25929643686cc11e5/pycapnp-2.0.0-cp311-cp311-win32.whl", hash = "sha256:40ca8018e0b7686d549b920f087049b92a3e6f06976d9f5a8112603fc560cac4", size = 1040268 },
-
{ url = "https://files.pythonhosted.org/packages/1d/37/89ab98961f18cffeae20d98cfc24afcfa85024bc014ecc48b0c4ac264fe0/pycapnp-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:d15cd8e46d541a899c84809095d7d7b3951f43642d1859e7a39bd91910778479", size = 1141758 },
-
{ url = "https://files.pythonhosted.org/packages/ce/d5/0ee84de3ce34a86c373b6cfbea17d5486c2ca942d51efa99a0069723c1e3/pycapnp-2.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0c111ef96676df25b8afef98f369d45f838ad4434e2898e48199eb43ef704efe", size = 1645816 },
-
{ url = "https://files.pythonhosted.org/packages/35/1e/580572083165ba791fac5ae2d8917facb94db6e3f0500421673f55165dac/pycapnp-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0d18906eb1fd1b9f206d93a9591ceedce1d52e7766b66e68f271453f104e9dca", size = 1507892 },
-
{ url = "https://files.pythonhosted.org/packages/d7/ed/46b3cc5d32c525b6a3acb67eb43de2cec692a62775ec1ab66dafe2b7d6ad/pycapnp-2.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5d1ed365ab1beabb8838068907a7190cc0b6f16de3499d783627e670fcc0eb2", size = 4707960 },
-
{ url = "https://files.pythonhosted.org/packages/8e/51/0a0a4d4e44138adb84959478ea4966196c5ad32022f768b9b64d1590cb3e/pycapnp-2.0.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:495b39a7aa2629931bbca27ad743ce591c6c41e8f81792276be424742d9cd1c1", size = 4791780 },
-
{ url = "https://files.pythonhosted.org/packages/28/71/2b59c6ddb253b25b3d01ee6f7b32b0297ac205c7272beeb6d13399054430/pycapnp-2.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50e814fbde072dcc3d868b5b5cbb9b7a66a70bff9ad03942f3be9baf3ca1cfc6", size = 4961068 },
-
{ url = "https://files.pythonhosted.org/packages/c3/b8/b64fdefa59d6d2802b5ee0a9439396c23a3e5954da6909be81f2722a234c/pycapnp-2.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:920fdda62d5fdef7a48339104dff0ceb9dcc21b138491f854457ba3a3d4d63ec", size = 4872917 },
-
{ url = "https://files.pythonhosted.org/packages/c8/55/867595f575eb6cb3662e9a0b50a24b4be42df86f2938003e586f6c81606f/pycapnp-2.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f9142eb4714c152b09dda0b055ea9dd43fd8fd894132e7eb4fa235fb4915edd", size = 4912169 },
-
{ url = "https://files.pythonhosted.org/packages/e4/11/0d36b45e5005ecdf8510081d16c6fb7b22b49651f64af36d138df97980cc/pycapnp-2.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c98f1d0c4d32109d03e42828ce3c65236afc895033633cbed3ca092993702e7b", size = 5201744 },
-
{ url = "https://files.pythonhosted.org/packages/05/29/ad1357998656b7141939e55bb3aea727c7a5478026feed7f8ee8cf52c935/pycapnp-2.0.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4d3250c1875a309d67551843cd8bf3c5e7fccf159b7f5c118a92aee36c0e871c", size = 5351113 },
-
{ url = "https://files.pythonhosted.org/packages/5a/b1/f4c442907948a29b6427dd7436f31d3732bb0d77f5c1dbcad749ba56dac0/pycapnp-2.0.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:174e6babe01f5507111c0ed226cd0b5e9325a9d2850751cfe4a57c1670f13881", size = 5472055 },
-
{ url = "https://files.pythonhosted.org/packages/c1/06/a6eceb8b8015f518c0ccae1de5d1a6e18ed73b62b4b111aff54ce5f4f566/pycapnp-2.0.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:ed38ece414341285695526792e020f391f29f5064b2126d0367c8bdeef28e3e9", size = 5395743 },
-
{ url = "https://files.pythonhosted.org/packages/e7/b0/63f2b0327853ae08158de61b4dfc7fa43ae5a5c00f1d28f769e7c30cdf55/pycapnp-2.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8a20b7dc55ef83a1fa446bf12680bce25caeb8f81788b623b072c3ec820db50d", size = 5405076 },
-
{ url = "https://files.pythonhosted.org/packages/7d/24/e025dd95f1abf34e373fbab8841ac8e5fa62afe3af4a4b0c61bd01354400/pycapnp-2.0.0-cp312-cp312-win32.whl", hash = "sha256:145eea66233fb5ac9152cd1c06b999ddb691815126f87f5cc37b9cda5d569f8a", size = 1030361 },
-
{ url = "https://files.pythonhosted.org/packages/3f/70/a71108ee9d4db9a027b665a2c383202407207174f1956195d5be45aca705/pycapnp-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:b8b03000769b29b36a8810f458b931f0f706f42027ee6676821eff28092d7734", size = 1135121 },
-
{ url = "https://files.pythonhosted.org/packages/4c/e6/c1629e98b05a442e042253753fa1cda1e0dc00a362de35d2d178624f7be7/pycapnp-2.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:87931c9322679c733bd522a0d73704d804d6531a8a5258fd8ec65930bf89f2dd", size = 1691193 },
-
{ url = "https://files.pythonhosted.org/packages/05/a5/6a05da82d34c9c61fb37ee68a372660e5ebab509e353826eaeee9f60729c/pycapnp-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7d08748e55f0f49c86f0a1e2c0f96c4e6880c1c8fd5df98c12c3eae557aa441", size = 1530310 },
-
{ url = "https://files.pythonhosted.org/packages/ba/be/a18d35add098fb1d6ac14377871e427f55a9864e24bfddf1ef954a4f3e06/pycapnp-2.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ffd25a63c92f0ef85bccabc7c2c13fe6da7eadf5525025d49206d967afb670d", size = 4729220 },
-
{ url = "https://files.pythonhosted.org/packages/0c/50/e84a64316cea31342c56ee929c768c94483b59b6d953801fa18c54b60121/pycapnp-2.0.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8b9b9ea78df282f5ce63ccd435b83b83aabb931807066e84d967444ea005571", size = 4830034 },
-
{ url = "https://files.pythonhosted.org/packages/f0/5e/08b144d4dcb1a0391d50ef977686f8bddf24b72f055363f6450fee1c5998/pycapnp-2.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:829b071216ae51c2ea55fd41476adaf3044a303038399276bdba6144b58157c0", size = 5003996 },
-
{ url = "https://files.pythonhosted.org/packages/48/e1/ab0671bafa26f4c18c8867dc290db28e8f97d890d427a824683c56848d31/pycapnp-2.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16b78b58969924dd499c7c24627cf392368a3354fcc900667fcabda2621d8250", size = 4867638 },
-
{ url = "https://files.pythonhosted.org/packages/c2/7b/9514799a66b75a6450aa7c90c1a174425da08b3367fbe49e4a18f464d6d1/pycapnp-2.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a365a7dff8cb05145616aecc04ea73ed493cd630c10d7ef67d833347ba264b6", size = 4885425 },
-
{ url = "https://files.pythonhosted.org/packages/9f/c6/262ad17e252fd79bea2c5842f25c336303e080193811ae511427837cb089/pycapnp-2.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:82ebe35487dcb8061e2f80403d29c20686d1d539562162f1658d36ef43e38cfa", size = 5284082 },
-
{ url = "https://files.pythonhosted.org/packages/4f/ae/d8b3b842ac5eb61381d8633758604e20f852d997143d7057e0c72eb0d45e/pycapnp-2.0.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f496c59face3195f32a50df141a7a042cd3504bd4da123c5dced096eae76699d", size = 5460673 },
-
{ url = "https://files.pythonhosted.org/packages/05/20/c610db47bb419a06f744d0c9768efef7dd9d8af0abd0eb0e00230e2d8e1e/pycapnp-2.0.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f2ed0033b56b1836a8b99de11b939d93aa93d01f5d52650da65447f4f3c03e21", size = 5575099 },
-
{ url = "https://files.pythonhosted.org/packages/4e/56/34a27f16b3c3da1aba7f7967acaaabcfeca3a918392ebc9abc35f250aaee/pycapnp-2.0.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d66097f70b0a0bff5d9431b117d359a0abe46c73ac0eb3b64ad252cf7e99d780", size = 5472640 },
-
{ url = "https://files.pythonhosted.org/packages/ab/04/2ef5a290625d3de72fb10ed576a4840e476750a94cf20287b8bd4c9da930/pycapnp-2.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:245942fe441d5e7a6511110ddea44ea91f0544385ef8afbef7155bec4aaa266f", size = 5449555 },
-
{ url = "https://files.pythonhosted.org/packages/99/e9/11cfcebd14a52dbd61e7c4daf03375125c5a60eb6dc0c47ef2cdbb1c65c8/pycapnp-2.0.0-cp39-cp39-win32.whl", hash = "sha256:1bcbb55fc12ff41d5e456991e9d4d368ca26ba11c65c41bd384f4edf1307b6f7", size = 1053980 },
-
{ url = "https://files.pythonhosted.org/packages/f3/f2/d6ec520029e007d865c94955004c3a830b158327792eca6480f81d084870/pycapnp-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:d4bee40372c02bcce647084faa6a831d9884a80033f77c7aacbaac697c4bbe46", size = 1152622 },
-
]
-
-
[[package]]
-
name = "tomli"
-
version = "2.2.1"
-
source = { registry = "https://pypi.org/simple" }
-
sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175 }
-
wheels = [
-
{ url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077 },
-
{ url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429 },
-
{ url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067 },
-
{ url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030 },
-
{ url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898 },
-
{ url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894 },
-
{ url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319 },
-
{ url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273 },
-
{ url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310 },
-
{ url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309 },
-
{ url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762 },
-
{ url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453 },
-
{ url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486 },
-
{ url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349 },
-
{ url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159 },
-
{ url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243 },
-
{ url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645 },
-
{ url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584 },
-
{ url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875 },
-
{ url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418 },
-
{ url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708 },
-
{ url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582 },
-
{ url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543 },
-
{ url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691 },
-
{ url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170 },
-
{ url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530 },
-
{ url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666 },
-
{ url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954 },
-
{ url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724 },
-
{ url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383 },
-
{ url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 },
-
]
-
-
[[package]]
-
name = "typing-extensions"
-
version = "4.12.2"
-
source = { registry = "https://pypi.org/simple" }
-
sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 }
-
wheels = [
-
{ url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 },
-
]
-1
py-template/.python-version
···
-
3.9.6
-1
py-template/README.md
···
-
This is a uv project to get started with Capnproto
-34
py-template/bellairs.capnp
···
-
@0xa59e1c95e37fb55d;
-
-
interface Directory {
-
# Represents a directory in the filesystem
-
-
list @0 () -> (entries :List(Entry));
-
# Lists all entries in the directory
-
-
struct Entry {
-
name @0 :Text; # Name of the entry
-
file @1 :File; # Reference to the file object
-
}
-
-
create @1 (name :Text) -> (file :File);
-
# Creates a new file with the given name
-
-
open @2 (name :Text) -> (file :File);
-
# Opens an existing file with the given name
-
-
delete @3 (name :Text);
-
# Deletes a file with the given name
-
}
-
-
interface File {
-
# Represents a file in the filesystem
-
-
size @0 () -> (size :UInt64);
-
# Returns the size of the file in bytes
-
-
read @1 (off :UInt64 = 0, len :UInt64 = 0xffffffffffffffff) -> (data :Data);
-
# Reads data from the file, optionally starting at offset and reading up to len bytes
-
# Default is to read the entire file
-
}
-
-58
py-template/client-and-mock-server.py
···
-
import asyncio
-
import socket
-
-
import capnp
-
-
capnp.remove_import_hook()
-
-
bellairs_capnp = capnp.load("bellairs.capnp")
-
-
"""
-
Mock file server so I can test this.
-
"""
-
-
-
class TestServer(bellairs_capnp.File.Server):
-
def __init__(self):
-
self.data = "Voop"
-
-
async def size(self, **kwargs):
-
return len(self.data)
-
-
async def read(self, offset, len, **kwargs):
-
return self.data
-
-
-
async def client(sock):
-
# See https://capnproto.github.io/pycapnp/capnp.html?highlight=twopartyclient#capnp.TwoPartyClient
-
# AP: I am a bit unsure why the only thing available here
-
# is a two-party client, but this works as a hack.
-
client = capnp.TwoPartyClient(sock)
-
cap = client.bootstrap()
-
cap = cap.cast_as(bellairs_capnp.File)
-
result = await cap.size()
-
size = result.size
-
print("Got %d" % size)
-
assert size == 4
-
-
-
async def main():
-
# Create a UNIX socket pair, because the network is
-
# more complex.
-
client_end, server_end = socket.socketpair(socket.AF_UNIX)
-
# Create AsyncIoStreams, which is really a wrapper around
-
# the C++ Capnproto connection. See https://github.com/capnproto/pycapnp/blob/59a639fa977e4a2e19c6cc60b44cbc9926418710/capnp/lib/capnp.pyx#L1314
-
client_end = await capnp.AsyncIoStream.create_connection(sock=client_end)
-
server_end = await capnp.AsyncIoStream.create_connection(sock=server_end)
-
# Create a TwoPartyServer. Better options
-
# are available (e.g., see https://github.com/capnproto/pycapnp/blob/master/examples/async_ssl_server.py#L60), but
-
# I did this for now. I think we will need to use
-
# `AsyncIoStream.create_server` and do some amount
-
# of indirection in there
-
_ = capnp.TwoPartyServer(server_end, bootstrap=TestServer())
-
print("Started file server")
-
await client(client_end)
-
-
-
if __name__ == "__main__":
-
asyncio.run(capnp.run(main()))
-10
py-template/pyproject.toml
···
-
[project]
-
name = "mvp-py"
-
version = "0.1.0"
-
description = "Add your description here"
-
readme = "README.md"
-
requires-python = ">=3.9.6"
-
dependencies = [
-
"black>=25.1.0",
-
"pycapnp>=2.0.0",
-
]
-225
py-template/uv.lock
···
-
version = 1
-
revision = 1
-
requires-python = ">=3.9.6"
-
-
[[package]]
-
name = "black"
-
version = "25.1.0"
-
source = { registry = "https://pypi.org/simple" }
-
dependencies = [
-
{ name = "click" },
-
{ name = "mypy-extensions" },
-
{ name = "packaging" },
-
{ name = "pathspec" },
-
{ name = "platformdirs" },
-
{ name = "tomli", marker = "python_full_version < '3.11'" },
-
{ name = "typing-extensions", marker = "python_full_version < '3.11'" },
-
]
-
sdist = { url = "https://files.pythonhosted.org/packages/94/49/26a7b0f3f35da4b5a65f081943b7bcd22d7002f5f0fb8098ec1ff21cb6ef/black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", size = 649449 }
-
wheels = [
-
{ url = "https://files.pythonhosted.org/packages/4d/3b/4ba3f93ac8d90410423fdd31d7541ada9bcee1df32fb90d26de41ed40e1d/black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32", size = 1629419 },
-
{ url = "https://files.pythonhosted.org/packages/b4/02/0bde0485146a8a5e694daed47561785e8b77a0466ccc1f3e485d5ef2925e/black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da", size = 1461080 },
-
{ url = "https://files.pythonhosted.org/packages/52/0e/abdf75183c830eaca7589144ff96d49bce73d7ec6ad12ef62185cc0f79a2/black-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7", size = 1766886 },
-
{ url = "https://files.pythonhosted.org/packages/dc/a6/97d8bb65b1d8a41f8a6736222ba0a334db7b7b77b8023ab4568288f23973/black-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9", size = 1419404 },
-
{ url = "https://files.pythonhosted.org/packages/7e/4f/87f596aca05c3ce5b94b8663dbfe242a12843caaa82dd3f85f1ffdc3f177/black-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0", size = 1614372 },
-
{ url = "https://files.pythonhosted.org/packages/e7/d0/2c34c36190b741c59c901e56ab7f6e54dad8df05a6272a9747ecef7c6036/black-25.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299", size = 1442865 },
-
{ url = "https://files.pythonhosted.org/packages/21/d4/7518c72262468430ead45cf22bd86c883a6448b9eb43672765d69a8f1248/black-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096", size = 1749699 },
-
{ url = "https://files.pythonhosted.org/packages/58/db/4f5beb989b547f79096e035c4981ceb36ac2b552d0ac5f2620e941501c99/black-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2", size = 1428028 },
-
{ url = "https://files.pythonhosted.org/packages/83/71/3fe4741df7adf015ad8dfa082dd36c94ca86bb21f25608eb247b4afb15b2/black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b", size = 1650988 },
-
{ url = "https://files.pythonhosted.org/packages/13/f3/89aac8a83d73937ccd39bbe8fc6ac8860c11cfa0af5b1c96d081facac844/black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc", size = 1453985 },
-
{ url = "https://files.pythonhosted.org/packages/6f/22/b99efca33f1f3a1d2552c714b1e1b5ae92efac6c43e790ad539a163d1754/black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f", size = 1783816 },
-
{ url = "https://files.pythonhosted.org/packages/18/7e/a27c3ad3822b6f2e0e00d63d58ff6299a99a5b3aee69fa77cd4b0076b261/black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba", size = 1440860 },
-
{ url = "https://files.pythonhosted.org/packages/98/87/0edf98916640efa5d0696e1abb0a8357b52e69e82322628f25bf14d263d1/black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", size = 1650673 },
-
{ url = "https://files.pythonhosted.org/packages/52/e5/f7bf17207cf87fa6e9b676576749c6b6ed0d70f179a3d812c997870291c3/black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", size = 1453190 },
-
{ url = "https://files.pythonhosted.org/packages/e3/ee/adda3d46d4a9120772fae6de454c8495603c37c4c3b9c60f25b1ab6401fe/black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", size = 1782926 },
-
{ url = "https://files.pythonhosted.org/packages/cc/64/94eb5f45dcb997d2082f097a3944cfc7fe87e071907f677e80788a2d7b7a/black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", size = 1442613 },
-
{ url = "https://files.pythonhosted.org/packages/d3/b6/ae7507470a4830dbbfe875c701e84a4a5fb9183d1497834871a715716a92/black-25.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1ee0a0c330f7b5130ce0caed9936a904793576ef4d2b98c40835d6a65afa6a0", size = 1628593 },
-
{ url = "https://files.pythonhosted.org/packages/24/c1/ae36fa59a59f9363017ed397750a0cd79a470490860bc7713967d89cdd31/black-25.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3df5f1bf91d36002b0a75389ca8663510cf0531cca8aa5c1ef695b46d98655f", size = 1460000 },
-
{ url = "https://files.pythonhosted.org/packages/ac/b6/98f832e7a6c49aa3a464760c67c7856363aa644f2f3c74cf7d624168607e/black-25.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9e6827d563a2c820772b32ce8a42828dc6790f095f441beef18f96aa6f8294e", size = 1765963 },
-
{ url = "https://files.pythonhosted.org/packages/ce/e9/2cb0a017eb7024f70e0d2e9bdb8c5a5b078c5740c7f8816065d06f04c557/black-25.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:bacabb307dca5ebaf9c118d2d2f6903da0d62c9faa82bd21a33eecc319559355", size = 1419419 },
-
{ url = "https://files.pythonhosted.org/packages/09/71/54e999902aed72baf26bca0d50781b01838251a462612966e9fc4891eadd/black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", size = 207646 },
-
]
-
-
[[package]]
-
name = "click"
-
version = "8.1.8"
-
source = { registry = "https://pypi.org/simple" }
-
dependencies = [
-
{ name = "colorama", marker = "sys_platform == 'win32'" },
-
]
-
sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 }
-
wheels = [
-
{ url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 },
-
]
-
-
[[package]]
-
name = "colorama"
-
version = "0.4.6"
-
source = { registry = "https://pypi.org/simple" }
-
sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 }
-
wheels = [
-
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
-
]
-
-
[[package]]
-
name = "mvp-py"
-
version = "0.1.0"
-
source = { virtual = "." }
-
dependencies = [
-
{ name = "black" },
-
{ name = "pycapnp" },
-
]
-
-
[package.metadata]
-
requires-dist = [
-
{ name = "black", specifier = ">=25.1.0" },
-
{ name = "pycapnp", specifier = ">=2.0.0" },
-
]
-
-
[[package]]
-
name = "mypy-extensions"
-
version = "1.0.0"
-
source = { registry = "https://pypi.org/simple" }
-
sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433 }
-
wheels = [
-
{ url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 },
-
]
-
-
[[package]]
-
name = "packaging"
-
version = "24.2"
-
source = { registry = "https://pypi.org/simple" }
-
sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 }
-
wheels = [
-
{ url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 },
-
]
-
-
[[package]]
-
name = "pathspec"
-
version = "0.12.1"
-
source = { registry = "https://pypi.org/simple" }
-
sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 }
-
wheels = [
-
{ url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 },
-
]
-
-
[[package]]
-
name = "platformdirs"
-
version = "4.3.7"
-
source = { registry = "https://pypi.org/simple" }
-
sdist = { url = "https://files.pythonhosted.org/packages/b6/2d/7d512a3913d60623e7eb945c6d1b4f0bddf1d0b7ada5225274c87e5b53d1/platformdirs-4.3.7.tar.gz", hash = "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351", size = 21291 }
-
wheels = [
-
{ url = "https://files.pythonhosted.org/packages/6d/45/59578566b3275b8fd9157885918fcd0c4d74162928a5310926887b856a51/platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94", size = 18499 },
-
]
-
-
[[package]]
-
name = "pycapnp"
-
version = "2.0.0"
-
source = { registry = "https://pypi.org/simple" }
-
sdist = { url = "https://files.pythonhosted.org/packages/9b/fb/54b46b52c1fa2acd9afd81bd05810c61bb1b05c6084c9625b64bc6d41843/pycapnp-2.0.0.tar.gz", hash = "sha256:503ab9b7b16773590ee226f2460408972c6b1c2cb2d819037115b919bef682be", size = 574848 }
-
wheels = [
-
{ url = "https://files.pythonhosted.org/packages/69/da/562114ce916f139a16018c43a9e0a4ff707fde6a91983ee815141b0f2333/pycapnp-2.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:12fc023da9acd062884c9b394113457908b3c5e26aeb85f668b59c0e84b7b150", size = 1679335 },
-
{ url = "https://files.pythonhosted.org/packages/c3/f7/fd1db2306dc45bf49cc5ceb0c162a247e123cf2b9ae3eaed45f14e7fdc17/pycapnp-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c8f5e4e68a1b59ae73cd77550b95f8719aea624aa424cd77aa193c6d45ea97ab", size = 1523005 },
-
{ url = "https://files.pythonhosted.org/packages/37/b4/22aa3c822826f8fb4955053033a6ab398cae1593d35de7b8e8814690a748/pycapnp-2.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50ff7f45d77dc2ef0c44a0aef41f37433a0c395b6a1db99b7e6f45e0e9237bd4", size = 4699521 },
-
{ url = "https://files.pythonhosted.org/packages/39/3d/b0da69a3021f64111edbed6ff91077658b294f50a6dde5a6ad572a3a2e3e/pycapnp-2.0.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc68ef3d80d9e7e9b96ba2077d8e2effd42f936bda1024f1aedc05022c9401bb", size = 4818053 },
-
{ url = "https://files.pythonhosted.org/packages/67/0d/e668033c6d2d63a661822645ad5112308d6e81d36f0881bfb55e58685518/pycapnp-2.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74a75e5c190e4d722aa0d2702bd04fedc2cb8e0a893031813e7a50cc067a054a", size = 4973514 },
-
{ url = "https://files.pythonhosted.org/packages/b5/1d/60b8ac6ea0aab7b6649993f46daafc08f559e9377fa19933e27ee676d311/pycapnp-2.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:db1bc53cbe5222f4fd0748ba6b53da9ec58e8f7b2219dc9cd50d15266a3fa85c", size = 4839079 },
-
{ url = "https://files.pythonhosted.org/packages/1e/b4/7185210aab0ca0f458db5807c3d7f3bcd6e3642bcc306d5f93027900eca6/pycapnp-2.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a0509ef856239634be21375cbad73dc7cf7fdfb32c03c312ad41e994f0674f7", size = 4859945 },
-
{ url = "https://files.pythonhosted.org/packages/88/19/fc82fe79538d36a9cda3c2c172415b05f770e61de2a3315505d18fa3c956/pycapnp-2.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:48372a19b59e8d533768c12988a92af4ea6c2daa1a8ba1c42202cd0dd24a1d24", size = 5258129 },
-
{ url = "https://files.pythonhosted.org/packages/c0/f7/b6a784268f306e2e67ebff0f7b0b0ee1fd0eefde87a53644ffb6a8bcc71d/pycapnp-2.0.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:46c16a98cec9ae6dce5ebf488bb0c8425484d7710eed1ee008a26b60470ee755", size = 5452125 },
-
{ url = "https://files.pythonhosted.org/packages/79/29/af2ea1f89d7493e6f3dac74d2924fd40e6aaaaefd24fc609e1fa65621396/pycapnp-2.0.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:be91cdb7895c4e2f1e1cd6b701ed66050c285d2c228f476a775bfd76bbd697f1", size = 5551321 },
-
{ url = "https://files.pythonhosted.org/packages/8d/ce/1034d8e30ac5b10e945517ed795470e7f3b1cf67d691eb4a31d6b760ec34/pycapnp-2.0.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:21db83e5f0c3a944b567cd20e4df47dba023e936a45d7057f2a615b8c19356f8", size = 5438794 },
-
{ url = "https://files.pythonhosted.org/packages/6d/61/dc476eb0a2889ec0babc55af7392f8bc1534656a98d241ee54145704215a/pycapnp-2.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:825a8a86e034d66d8df8d82b7bf9fdd3f344bd84ff43a838ec08f08fe7461be0", size = 5425971 },
-
{ url = "https://files.pythonhosted.org/packages/da/2b/fdcfd06e7a804d2f5e80db3f03d8cb879d48a45df7ae74337bcc49c6728c/pycapnp-2.0.0-cp310-cp310-win32.whl", hash = "sha256:13ff9dca5741079d7bbe4e2512634b8ce859b709a1b126481eed404bda0b3d4a", size = 1044616 },
-
{ url = "https://files.pythonhosted.org/packages/e9/b1/30a3ff0e5930a5fdd323fe66d398cc4b21bfaa79355ba3941950d1984295/pycapnp-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:279d9f7c34527d15a62dde0dfc82cb918ed0a900dfa9713960d64bed3f9236a4", size = 1145453 },
-
{ url = "https://files.pythonhosted.org/packages/cb/82/cf311b1a9800b605759a38a0c337a55a639b685427364294e98a0f9b7306/pycapnp-2.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:829c7eb4e5f23dbcac25466110faf72a691035cf87c5d46e5053da15790e428d", size = 1673673 },
-
{ url = "https://files.pythonhosted.org/packages/ae/55/4c03ca95c568776a1f637db9ffdcf302fb63f46e4d2a4f13edd8cb1a5f90/pycapnp-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dab60fbe3e4eaf99ec97918a0a776216c6c149b6d49261383d91c2201adb475d", size = 1513351 },
-
{ url = "https://files.pythonhosted.org/packages/55/98/e4b2dea076f8a2575abc45cd879a91bc9aa975c69ae2ac1cab61d83c5087/pycapnp-2.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c48a0582078bb74d7326d28571db0b8e6919563365537a5a13e8f5360c12bfc", size = 4910666 },
-
{ url = "https://files.pythonhosted.org/packages/1d/ee/3b5a182588f89074f4002fa6247e3f963bb85bc808acd1ac8deed91f1fa7/pycapnp-2.0.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcb5ab54aff857e3711d2c0cc934194aaffacdeb3481daa56863daef07d27941", size = 5007434 },
-
{ url = "https://files.pythonhosted.org/packages/c5/e9/515a2ca7fdc84d57c654280d0b71dfd782fd1773d384c0ec0d56dc6fc35b/pycapnp-2.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9600778036e6fe9dbea68f0c37678c5f4d561d2f2306b3cb741de5e1670ef2ae", size = 5188923 },
-
{ url = "https://files.pythonhosted.org/packages/70/60/5db346e238985a526ba7589ed24f92195dad39e7dec9d85b17a567600b6f/pycapnp-2.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7278ba0262fab8c398e77d634ae7ba026866d44b52cbfc27262be8d396ecacd1", size = 5048105 },
-
{ url = "https://files.pythonhosted.org/packages/e3/ff/02b4a87c9ff9793f26d8f3d95312d902d260c094f216d84e19528a506606/pycapnp-2.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23b2458d43c82302980a96518c96df257429204d2cc02bfff0c8cb6ebb371e01", size = 5063172 },
-
{ url = "https://files.pythonhosted.org/packages/10/a1/35a7e14d765f99cfdcdfdcebc69bdf382f27016944470daa7a03c557f681/pycapnp-2.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dd7755cc3fedc2ad8cc7864a0729471ddeff10c184963fe0f3689e295130f1b2", size = 5408718 },
-
{ url = "https://files.pythonhosted.org/packages/5c/59/8bc8a993c38808c6fd90b10becba8de4a54543e8441bd87ce44ef3b7eee4/pycapnp-2.0.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d47baf6b3db9981625ffc5ff188e089f2ebca8e7e1afb97aa5eb7bebb7bf3650", size = 5596714 },
-
{ url = "https://files.pythonhosted.org/packages/ea/7d/79c481ef77f29e81355e92bb250f0d2a37a76f5fe0ba9433bf6c6c88b6e4/pycapnp-2.0.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b375be92d93fdb6f7ac127ea9390bcec0fed4e485db137b084f9e7114dde7c83", size = 5709896 },
-
{ url = "https://files.pythonhosted.org/packages/59/8d/f2eceeea1e8cae8b8a70a4752af5b772916f455e2ed388d0887e2b57d080/pycapnp-2.0.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:959bfdf1cddb3e5528e2293c4a375382be9a1bf044b073bc2e7eca1eb6b3a9a2", size = 5594823 },
-
{ url = "https://files.pythonhosted.org/packages/2c/86/f8284637b61f83232e5618dd561a66080dd98ce2272d7e3ae89335d4fd97/pycapnp-2.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d873af167cf5cc7578ce5432eefcb442f866c8f7a6c57d188baf8c5e709fa39d", size = 5572564 },
-
{ url = "https://files.pythonhosted.org/packages/b3/b2/7f99d28a9935d1e37ec6955922c57b2be24fe0b74fe25929643686cc11e5/pycapnp-2.0.0-cp311-cp311-win32.whl", hash = "sha256:40ca8018e0b7686d549b920f087049b92a3e6f06976d9f5a8112603fc560cac4", size = 1040268 },
-
{ url = "https://files.pythonhosted.org/packages/1d/37/89ab98961f18cffeae20d98cfc24afcfa85024bc014ecc48b0c4ac264fe0/pycapnp-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:d15cd8e46d541a899c84809095d7d7b3951f43642d1859e7a39bd91910778479", size = 1141758 },
-
{ url = "https://files.pythonhosted.org/packages/ce/d5/0ee84de3ce34a86c373b6cfbea17d5486c2ca942d51efa99a0069723c1e3/pycapnp-2.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0c111ef96676df25b8afef98f369d45f838ad4434e2898e48199eb43ef704efe", size = 1645816 },
-
{ url = "https://files.pythonhosted.org/packages/35/1e/580572083165ba791fac5ae2d8917facb94db6e3f0500421673f55165dac/pycapnp-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0d18906eb1fd1b9f206d93a9591ceedce1d52e7766b66e68f271453f104e9dca", size = 1507892 },
-
{ url = "https://files.pythonhosted.org/packages/d7/ed/46b3cc5d32c525b6a3acb67eb43de2cec692a62775ec1ab66dafe2b7d6ad/pycapnp-2.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5d1ed365ab1beabb8838068907a7190cc0b6f16de3499d783627e670fcc0eb2", size = 4707960 },
-
{ url = "https://files.pythonhosted.org/packages/8e/51/0a0a4d4e44138adb84959478ea4966196c5ad32022f768b9b64d1590cb3e/pycapnp-2.0.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:495b39a7aa2629931bbca27ad743ce591c6c41e8f81792276be424742d9cd1c1", size = 4791780 },
-
{ url = "https://files.pythonhosted.org/packages/28/71/2b59c6ddb253b25b3d01ee6f7b32b0297ac205c7272beeb6d13399054430/pycapnp-2.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50e814fbde072dcc3d868b5b5cbb9b7a66a70bff9ad03942f3be9baf3ca1cfc6", size = 4961068 },
-
{ url = "https://files.pythonhosted.org/packages/c3/b8/b64fdefa59d6d2802b5ee0a9439396c23a3e5954da6909be81f2722a234c/pycapnp-2.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:920fdda62d5fdef7a48339104dff0ceb9dcc21b138491f854457ba3a3d4d63ec", size = 4872917 },
-
{ url = "https://files.pythonhosted.org/packages/c8/55/867595f575eb6cb3662e9a0b50a24b4be42df86f2938003e586f6c81606f/pycapnp-2.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f9142eb4714c152b09dda0b055ea9dd43fd8fd894132e7eb4fa235fb4915edd", size = 4912169 },
-
{ url = "https://files.pythonhosted.org/packages/e4/11/0d36b45e5005ecdf8510081d16c6fb7b22b49651f64af36d138df97980cc/pycapnp-2.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c98f1d0c4d32109d03e42828ce3c65236afc895033633cbed3ca092993702e7b", size = 5201744 },
-
{ url = "https://files.pythonhosted.org/packages/05/29/ad1357998656b7141939e55bb3aea727c7a5478026feed7f8ee8cf52c935/pycapnp-2.0.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4d3250c1875a309d67551843cd8bf3c5e7fccf159b7f5c118a92aee36c0e871c", size = 5351113 },
-
{ url = "https://files.pythonhosted.org/packages/5a/b1/f4c442907948a29b6427dd7436f31d3732bb0d77f5c1dbcad749ba56dac0/pycapnp-2.0.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:174e6babe01f5507111c0ed226cd0b5e9325a9d2850751cfe4a57c1670f13881", size = 5472055 },
-
{ url = "https://files.pythonhosted.org/packages/c1/06/a6eceb8b8015f518c0ccae1de5d1a6e18ed73b62b4b111aff54ce5f4f566/pycapnp-2.0.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:ed38ece414341285695526792e020f391f29f5064b2126d0367c8bdeef28e3e9", size = 5395743 },
-
{ url = "https://files.pythonhosted.org/packages/e7/b0/63f2b0327853ae08158de61b4dfc7fa43ae5a5c00f1d28f769e7c30cdf55/pycapnp-2.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8a20b7dc55ef83a1fa446bf12680bce25caeb8f81788b623b072c3ec820db50d", size = 5405076 },
-
{ url = "https://files.pythonhosted.org/packages/7d/24/e025dd95f1abf34e373fbab8841ac8e5fa62afe3af4a4b0c61bd01354400/pycapnp-2.0.0-cp312-cp312-win32.whl", hash = "sha256:145eea66233fb5ac9152cd1c06b999ddb691815126f87f5cc37b9cda5d569f8a", size = 1030361 },
-
{ url = "https://files.pythonhosted.org/packages/3f/70/a71108ee9d4db9a027b665a2c383202407207174f1956195d5be45aca705/pycapnp-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:b8b03000769b29b36a8810f458b931f0f706f42027ee6676821eff28092d7734", size = 1135121 },
-
{ url = "https://files.pythonhosted.org/packages/4c/e6/c1629e98b05a442e042253753fa1cda1e0dc00a362de35d2d178624f7be7/pycapnp-2.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:87931c9322679c733bd522a0d73704d804d6531a8a5258fd8ec65930bf89f2dd", size = 1691193 },
-
{ url = "https://files.pythonhosted.org/packages/05/a5/6a05da82d34c9c61fb37ee68a372660e5ebab509e353826eaeee9f60729c/pycapnp-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7d08748e55f0f49c86f0a1e2c0f96c4e6880c1c8fd5df98c12c3eae557aa441", size = 1530310 },
-
{ url = "https://files.pythonhosted.org/packages/ba/be/a18d35add098fb1d6ac14377871e427f55a9864e24bfddf1ef954a4f3e06/pycapnp-2.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ffd25a63c92f0ef85bccabc7c2c13fe6da7eadf5525025d49206d967afb670d", size = 4729220 },
-
{ url = "https://files.pythonhosted.org/packages/0c/50/e84a64316cea31342c56ee929c768c94483b59b6d953801fa18c54b60121/pycapnp-2.0.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8b9b9ea78df282f5ce63ccd435b83b83aabb931807066e84d967444ea005571", size = 4830034 },
-
{ url = "https://files.pythonhosted.org/packages/f0/5e/08b144d4dcb1a0391d50ef977686f8bddf24b72f055363f6450fee1c5998/pycapnp-2.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:829b071216ae51c2ea55fd41476adaf3044a303038399276bdba6144b58157c0", size = 5003996 },
-
{ url = "https://files.pythonhosted.org/packages/48/e1/ab0671bafa26f4c18c8867dc290db28e8f97d890d427a824683c56848d31/pycapnp-2.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16b78b58969924dd499c7c24627cf392368a3354fcc900667fcabda2621d8250", size = 4867638 },
-
{ url = "https://files.pythonhosted.org/packages/c2/7b/9514799a66b75a6450aa7c90c1a174425da08b3367fbe49e4a18f464d6d1/pycapnp-2.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a365a7dff8cb05145616aecc04ea73ed493cd630c10d7ef67d833347ba264b6", size = 4885425 },
-
{ url = "https://files.pythonhosted.org/packages/9f/c6/262ad17e252fd79bea2c5842f25c336303e080193811ae511427837cb089/pycapnp-2.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:82ebe35487dcb8061e2f80403d29c20686d1d539562162f1658d36ef43e38cfa", size = 5284082 },
-
{ url = "https://files.pythonhosted.org/packages/4f/ae/d8b3b842ac5eb61381d8633758604e20f852d997143d7057e0c72eb0d45e/pycapnp-2.0.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f496c59face3195f32a50df141a7a042cd3504bd4da123c5dced096eae76699d", size = 5460673 },
-
{ url = "https://files.pythonhosted.org/packages/05/20/c610db47bb419a06f744d0c9768efef7dd9d8af0abd0eb0e00230e2d8e1e/pycapnp-2.0.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f2ed0033b56b1836a8b99de11b939d93aa93d01f5d52650da65447f4f3c03e21", size = 5575099 },
-
{ url = "https://files.pythonhosted.org/packages/4e/56/34a27f16b3c3da1aba7f7967acaaabcfeca3a918392ebc9abc35f250aaee/pycapnp-2.0.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d66097f70b0a0bff5d9431b117d359a0abe46c73ac0eb3b64ad252cf7e99d780", size = 5472640 },
-
{ url = "https://files.pythonhosted.org/packages/ab/04/2ef5a290625d3de72fb10ed576a4840e476750a94cf20287b8bd4c9da930/pycapnp-2.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:245942fe441d5e7a6511110ddea44ea91f0544385ef8afbef7155bec4aaa266f", size = 5449555 },
-
{ url = "https://files.pythonhosted.org/packages/99/e9/11cfcebd14a52dbd61e7c4daf03375125c5a60eb6dc0c47ef2cdbb1c65c8/pycapnp-2.0.0-cp39-cp39-win32.whl", hash = "sha256:1bcbb55fc12ff41d5e456991e9d4d368ca26ba11c65c41bd384f4edf1307b6f7", size = 1053980 },
-
{ url = "https://files.pythonhosted.org/packages/f3/f2/d6ec520029e007d865c94955004c3a830b158327792eca6480f81d084870/pycapnp-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:d4bee40372c02bcce647084faa6a831d9884a80033f77c7aacbaac697c4bbe46", size = 1152622 },
-
]
-
-
[[package]]
-
name = "tomli"
-
version = "2.2.1"
-
source = { registry = "https://pypi.org/simple" }
-
sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175 }
-
wheels = [
-
{ url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077 },
-
{ url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429 },
-
{ url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067 },
-
{ url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030 },
-
{ url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898 },
-
{ url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894 },
-
{ url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319 },
-
{ url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273 },
-
{ url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310 },
-
{ url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309 },
-
{ url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762 },
-
{ url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453 },
-
{ url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486 },
-
{ url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349 },
-
{ url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159 },
-
{ url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243 },
-
{ url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645 },
-
{ url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584 },
-
{ url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875 },
-
{ url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418 },
-
{ url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708 },
-
{ url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582 },
-
{ url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543 },
-
{ url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691 },
-
{ url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170 },
-
{ url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530 },
-
{ url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666 },
-
{ url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954 },
-
{ url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724 },
-
{ url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383 },
-
{ url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 },
-
]
-
-
[[package]]
-
name = "typing-extensions"
-
version = "4.12.2"
-
source = { registry = "https://pypi.org/simple" }
-
sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 }
-
wheels = [
-
{ url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 },
-
]
-4
site/bluesky-icon.svg
···
-
<svg width="100%" height="100%" viewBox="0 0 600 530" version="1.1" xmlns="http://www.w3.org/2000/svg" class="size-4">
-
<path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z"
-
fill="currentColor"/>
-
</svg>
-234
site/index.html
···
-
<!DOCTYPE html>
-
<html lang="en">
-
<head>
-
<meta charset="UTF-8">
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
-
<title>A Human Approach to Computational Science</title>
-
<link rel="stylesheet" href="styles.css">
-
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
-
</head>
-
<body>
-
<header>
-
<nav>
-
<div class="logo">The Bellairs Manifesto</div>
-
<div class="nav-container">
-
<ul class="main-nav">
-
<li><a href="#manifesto">Manifesto</a></li>
-
<li><a href="#usecases">Actions</a></li>
-
<li><a href="#about">About</a></li>
-
<li><a href="#timeline">Timeline</a></li>
-
</ul>
-
<ul class="social-nav">
-
<li class="social-icon"><a href="https://matrix.to/#/#bellairs-discuss:recoil.org" target="_blank" aria-label="Matrix">
-
<img src="matrix-icon.svg" alt="Matrix" width="20" height="20" class="matrix-icon">
-
</a></li>
-
<li class="social-icon"><a href="https://bsky.app/profile/bellairs.quest" target="_blank" aria-label="Bluesky">
-
<img src="bluesky-icon.svg" alt="Bluesky" width="20" height="20" class="bsky-icon">
-
</a></li>
-
</ul>
-
</div>
-
</nav>
-
</header>
-
-
<section id="hero">
-
<div class="container">
-
<h2>A Human Approach to Computational Science</h2>
-
<p class="byline">Our vision is a world where everybody can access tools to explore, participate in and benefit from computational science.</p>
-
<a href="#manifesto" class="cta-button">Read the Manifesto</a>
-
</div>
-
</section>
-
-
<section id="manifesto">
-
<div class="container">
-
<h2>Manifesto</h2>
-
<div class="byline">March 2025 Participants: <a href="https://anil.recoil.org" target="_blank">Anil Madhavapeddy</a>, <a href="https://www.cs.cornell.edu/~jnfoster/" target="_blank">Nate Foster</a>, <a href="https://cs.nyu.edu/~apanda/" target="_blank">Aurojit Panda</a>, <a href="https://cseweb.ucsd.edu/~mcoblenz/" target="_blank">Michael Coblenz</a>, <a href="https://www.cst.cam.ac.uk/people/mte24" target="_blank">Mark Elvers</a>, <a href="https://gazagnaire.org" target="_blank">Thomas Gazagnaire</a>, <a href="https://web.eecs.umich.edu/~comar/" target="_blank">Cyrus Omar</a>, <a href="https://www.jonmsterling.com" target="_blank">Jonathan Sterling</a>, <a href="https://www.ianbrown.tech" target="_blank">Ian Brown</a>, and <a href="#about">more signing up</a> since.</div>
-
-
<p><a href="https://en.wikipedia.org/wiki/Computational_science">Computational science</a> uses large-scale computation and data to gain insights into complex natural problems ranging from the microscopic to the planetary scale. The legitimacy of computational science emerges from a continuous process of hypothesising, experimentation and recombination of code across these datasets.</p>
-
<p>We've asked ourselves how we might recenter computational science on the numerous people involved in this process, and so propose the following first set of three principles to start the conversation. We <a href="#about">invite</a> interested people to join our exploration.</p>
-
-
<div class="principle">
-
<h3>1. Rehumanising science for all</h3>
-
<p>Science is a human endeavor shaped by contributions from many individuals, and scientific insights stem from and flow through people. All stakeholders, such as academics, curators, traditional knowledge holders, journalists, reviewers, policymakers, and citizens, should be included in and benefit from the process. <span class="aim">We aim to build digital infrastructure to both support inquisitive scientific exploration and also to distribute the benefits of evidence-driven actions across society.</span></p>
-
</div>
-
-
<div class="principle">
-
<h3>2. Melding institutions and crowds</h3>
-
<p>Opening the door to public participation in the scientific discourse means broadening access to data and the skills required to analyse it. Today, large institutions play the important role of bringing together researchers under one roof, but emerging digital infrastructure promises new opportunities for participation across institutional and geographic boundaries. <span class="aim">We aim to decouple access to the tools for science from institutional affiliation, and thus reduce the barrier to meaningful participation.</span></p>
-
</div>
-
-
<div class="principle">
-
<h3>3. Supporting positive scientific feedback loops</h3>
-
<p>We get a maximal return on investments in science when academics, journalists, politicians, curators and others all collaborate effectively across their respective specialisms. <span class="aim">We aim to empower creators from all walks of life to create, share and review datasets towards the accumulation of reliable evidence, and incentivize the responsible, ongoing curation of datasets.</p>
-
</div>
-
-
<p>Modern computational science should leverage both traditional and community-centered sources of insights and data, and enable such groups to take full advantage of digital resources. We want to develop these in an open and collaborative process that follows the principles above. We <a href="#about">invite</a> you to work with us!</p>
-
-
-
<blockquote>Our vision is a world where everybody can access tools to explore, participate in and benefit from computational science.</blockquote>
-
</div>
-
-
-
-
</section>
-
-
<section id="usecases">
-
<div class="container">
-
<h2>Reinforcing Use Cases</h2>
-
<p>We are identifying use cases that can be used to help design and iterate on systems towards implementing our manifesto. The use cases are intended to represent needs that different kinds of scientists have. There will be many other additional use cases to bring to light concerns that may not be represented here. Please consider contributing yours!</p>
-
-
<div class="usecase">
-
<h3>1. Conservation and sensing</h3>
-
<p>Some large-scale research projects require acquiring, aggregating, manipulating, analyzing, and reporting on a multitude of data sets. Sometimes, the outputs may even connect to real-time systems, such as data dashboards or sensor networks, which need to be configured as a result of the analysis.</p>
-
<p>We explore how to balance open science with necessary privacy for sensitive ecological data.</p>
-
<p class="investigators"><strong>Investigators:</strong> <a href="https://cseweb.ucsd.edu/~mcoblenz/" target="_blank">Michael Coblenz</a>, <a href="https://anil.recoil.org" target="_blank">Anil Madhavapeddy</a>, <a href="https://web.eecs.umich.edu/~comar/" target="_blank">Cyrus Omar</a></p>
-
<p><a href="usecase-conservation.html" class="cta-button">Read More</a></p>
-
</div>
-
-
<div class="usecase">
-
<h3>2. Breaking Specialist Training out of the University</h3>
-
<p>Meaningful participation in important scientific discourses requires specialist knowledge, but access to specialized training is currently centralized in universities and gated behind tuition fees and time barriers.</p>
-
<p>We aim to build sustainable infrastructure for a decentralized network of publicly accessible courseware.</p>
-
<p class="investigators"><strong>Investigators:</strong> <a href="https://www.jonmsterling.com" target="_blank">Jonathan Sterling</a>, <a href="https://anil.recoil.org" target="_blank">Anil Madhavapeddy</a></p>
-
<p><a href="usecase-training.html" class="cta-button">Read More</a></p>
-
</div>
-
-
<div class="usecase">
-
<h3>3. Collaboration in the Small</h3>
-
<p>Many research projects require inputs from other researchers, including those in different areas. Finding, using, and extending other researchers' digital artifacts is challenging today.</p>
-
<p>We're developing systems to make it easier to discover digital artifacts, track contributions, and reduce friction for sharing between research groups.</p>
-
<p class="investigators"><strong>Investigators:</strong> <a href="https://cseweb.ucsd.edu/~mcoblenz/" target="_blank">Michael Coblenz</a></p>
-
<p><a href="usecase-collaboration.html" class="cta-button">Read More</a></p>
-
</div>
-
</div>
-
</section>
-
-
<section id="about">
-
<div class="container">
-
<h2>About</h2>
-
<h3>Participants</h3>
-
<div class="participants">
-
<ul>
-
<li class="original"><a href="https://anil.recoil.org" target="_blank">Anil Madhavapeddy</a></li>
-
<li class="original"><a href="https://www.cs.cornell.edu/~jnfoster/" target="_blank">Nate Foster</a></li>
-
<li class="original"><a href="https://cs.nyu.edu/~apanda/" target="_blank">Aurojit Panda</a></li>
-
<li class="original"><a href="https://cseweb.ucsd.edu/~mcoblenz/" target="_blank">Michael Coblenz</a></li>
-
<li class="original"><a href="https://www.cst.cam.ac.uk/people/mte24" target="_blank">Mark Elvers</a></li>
-
<li class="original"><a href="https://gazagnaire.org" target="_blank">Thomas Gazagnaire</a></li>
-
<li class="original"><a href="https://web.eecs.umich.edu/~comar/" target="_blank">Cyrus Omar</a></li>
-
<li class="original"><a href="https://www.jonmsterling.com" target="_blank">Jonathan Sterling</a></li>
-
<li class="original"><a href="https://www.ianbrown.tech" target="_blank">Ian Brown</a></li>
-
<li><a href="https://dorchard.github.io" target="_blank">Dominic Orchard</a></li>
-
<li><a href="https://profiles.imperial.ac.uk/h.haddadi" target="_blank">Hamed Haddadi</a></li>
-
<li><a href="https://www.cst.cam.ac.uk/people/jac22" target="_blank">Jon Crowcroft</a></li>
-
<li><a href="https://dynamicaspects.org/research/" target="_blank">Roly Perera</a></li>
-
<li><a href="https://www.cst.cam.ac.uk/people/efs20" target="_blank">Emily Shuckburgh</a></li>
-
<li><a href="https://www.cfse.cam.ac.uk/directory/marla_fuchs" target="_blank">Marla Fuchs</a></li>
-
</ul>
-
</div>
-
-
<h3>Join the Conversation</h3>
-
<p>We'd love to have you on board as well; we recognise that we need lots of input and participation from diverse stakeholders across disciplines, and so we invite you to join our exploration and contribute to this open collaboration. Just get in touch with any of the participants above and we can add you to the list above. We're using Matrix to stay connected as well.</p>
-
<div class="social-links">
-
<a href="https://matrix.to/#/#bellairs-discuss:recoil.org" class="matrix-link">
-
<img src="matrix-icon.svg" alt="Matrix" width="20" height="20" class="matrix-icon">
-
Join our Matrix Channel
-
</a>
-
<a href="https://bsky.app/profile/bellairs.quest" target="_blank" class="bluesky-link">
-
<img src="bluesky-icon.svg" alt="Bluesky" width="20" height="20" class="bsky-icon">
-
Follow on Bluesky
-
</a>
-
</div>
-
</div>
-
</section>
-
-
<section id="timeline">
-
<div class="container">
-
<h2>Timeline</h2>
-
<div class="timeline-separator">
-
<span>Upcoming Events</span>
-
</div>
-
<div class="timeline">
-
<div class="timeline-item future">
-
<div class="timeline-date">October 2025</div>
-
<div class="timeline-content">
-
<p><a href="https://conf.researchr.org/home/icfp-splash-2025/propl-2025" target="_blank">Programming for the Planet</a> (PROPL) will bring us together again to refine the manifesto and continue designing our systems for decentralised science.</p>
-
</div>
-
</div>
-
</div>
-
<div class="timeline-separator">
-
<span>Past Events</span>
-
</div>
-
<div class="timeline">
-
<div class="timeline-item">
-
<div class="timeline-date">March 2025</div>
-
<div class="timeline-content">
-
<p>We held the Bellairs research summit on planetary computing, where we launched the first version of the manifesto towards human computational science.</p>
-
</div>
-
</div>
-
<div class="timeline-item">
-
<div class="timeline-date">March 2025</div>
-
<div class="timeline-content">
-
<p><a href="https://www.jonmsterling.com" target="_blank">Jon Sterling</a> publishes the <a href="https://www.forester-notes.org/OYOJ.xml" target="_blank">Forester 5.0</a> design for global identity.</p>
-
</div>
-
</div>
-
<div class="timeline-item">
-
<div class="timeline-date">February 2025</div>
-
<div class="timeline-content">
-
<p><a href="https://www.ianbrown.tech" target="_blank">Ian Brown</a> contrasts <a href="https://www.ianbrown.tech/2025/02/18/fleeing-the-hellsite-mastodon-vs-bluesky/" target="_blank">Mastodon vs BlueSky</a> in a deep-dive of their architectures.</p>
-
</div>
-
</div>
-
<div class="timeline-item">
-
<div class="timeline-date">January 2025</div>
-
<div class="timeline-content">
-
<p><a href="https://gazagnaire.org" target="_blank">Thomas Gazagnaire</a> launches <a href="https://parsimoni.co/blog/2025-02-11-parsimoni-to-demonstrate-its-spaceos-in-orbit-on-clustergate-1.html" target="_blank">SpaceOS</a> to perform scientific computation in orbit.</p>
-
</div>
-
</div>
-
<div class="timeline-item">
-
<div class="timeline-date">September 2024</div>
-
<div class="timeline-content">
-
<p><a href="https://www.cst.cam.ac.uk/people/mte24" target="_blank">Mark Elvers</a> operates the first capability-based <a href="https://tarides.com/blog/2023-08-02-obuilder-on-macos/" target="_blank">distributed build platform</a> for open source software.</p>
-
</div>
-
</div>
-
<div class="timeline-item">
-
<div class="timeline-date">August 2024</div>
-
<div class="timeline-content">
-
<p><a href="https://cs.nyu.edu/~apanda/" target="_blank">Aurojit Panda</a> rethinks the <a href="https://cs.nyu.edu/~apanda/assets/papers/ie-sigcomm24.pdf" target="_blank">architecture of edge Internet services</a> to bring back end-to-end simplicity.</p>
-
</div>
-
</div>
-
<div class="timeline-item">
-
<div class="timeline-date">April 2024</div>
-
<div class="timeline-content">
-
<p><a href="https://cseweb.ucsd.edu/~mcoblenz/" target="_blank">Michael Coblenz</a> designs a <a href="https://dl.acm.org/doi/10.1145/3597503.3639139" target="_blank">theory of scientific programming efficacy</a>.</p>
-
</div>
-
</div>
-
<div class="timeline-item">
-
<div class="timeline-date">March 2024</div>
-
<div class="timeline-content">
-
<p><a href="https://web.eecs.umich.edu/~comar/" target="_blank">Cyrus Omar</a> talks about <a href="https://watch.eeg.cl.cam.ac.uk/w/3nGExywoVm6XFRBA2zYxSL" target="_blank">building live programming interfaces for planetary computing</a> at <a href="https://propl.dev" target="_blank">PROPL 2024</a>.</p>
-
</div>
-
</div>
-
<div class="timeline-item">
-
<div class="timeline-date">February 2024</div>
-
<div class="timeline-content">
-
<p><a href="https://anil.recoil.org" target="_blank">Anil Madhavapeddy</a> makes the case for <a href="https://arxiv.org/pdf/2303.04501" target="_blank">planetary computing for data-driven environmental policy-making</a> to handle the ingestion, transformation, analysis and publication of environmental data products.</p>
-
</div>
-
</div>
-
<div class="timeline-item">
-
<div class="timeline-date">August 2023</div>
-
<div class="timeline-content">
-
<p><a href="https://www.cs.cornell.edu/~jnfoster/" target="_blank">Nate Foster</a> considers how programming languages might help to <a href="https://yjolt.org/programming-language-future-interests" target="_blank">capture property conveyancing</a>, sparking an interest in the legal applications of ownership.</p>
-
</div>
-
</div>
-
</div>
-
</div>
-
</section>
-
-
<footer>
-
<div class="container">
-
<p class="disclaimer">&copy; 2025 in the public domain. This site is not directly affiliated with the <a href="https://www.mcgill.ca/bellairs/" target="_blank">Bellairs Research Institute</a>, but we are grateful to them for hosting our research symposium that made this manifesto possible.</p>
-
</div>
-
</footer>
-
-
<script src="scripts.js"></script>
-
</body>
-
</html>
-2
site/matrix-icon.svg
···
-
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
-
<svg fill="#000000" width="800px" height="800px" viewBox="0 0 24 24" role="img" xmlns="http://www.w3.org/2000/svg"><title>Matrix icon</title><path d="M.632.55v22.9H2.28V24H0V0h2.28v.55zm7.043 7.26v1.157h.033c.309-.443.683-.784 1.117-1.024.433-.245.936-.365 1.5-.365.54 0 1.033.107 1.481.314.448.208.785.582 1.02 1.108.254-.374.6-.706 1.034-.992.434-.287.95-.43 1.546-.43.453 0 .872.056 1.26.167.388.11.716.286.993.53.276.245.489.559.646.951.152.392.23.863.23 1.417v5.728h-2.349V11.52c0-.286-.01-.559-.032-.812a1.755 1.755 0 0 0-.18-.66 1.106 1.106 0 0 0-.438-.448c-.194-.11-.457-.166-.785-.166-.332 0-.6.064-.803.189a1.38 1.38 0 0 0-.48.499 1.946 1.946 0 0 0-.231.696 5.56 5.56 0 0 0-.06.785v4.768h-2.35v-4.8c0-.254-.004-.503-.018-.752a2.074 2.074 0 0 0-.143-.688 1.052 1.052 0 0 0-.415-.503c-.194-.125-.476-.19-.854-.19-.111 0-.259.024-.439.074-.18.051-.36.143-.53.282-.171.138-.319.337-.439.595-.12.259-.18.6-.18 1.02v4.966H5.46V7.81zm15.693 15.64V.55H21.72V0H24v24h-2.28v-.55z"/></svg>
-104
site/scripts.js
···
-
document.addEventListener('DOMContentLoaded', function() {
-
// Smooth scrolling for navigation links
-
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
-
anchor.addEventListener('click', function(e) {
-
e.preventDefault();
-
-
document.querySelector(this.getAttribute('href')).scrollIntoView({
-
behavior: 'smooth'
-
});
-
});
-
});
-
-
// Add CSS for animations
-
const style = document.createElement('style');
-
style.textContent = `
-
.timeline-item {
-
opacity: 0;
-
transform: translateY(50px);
-
transition: opacity 0.6s ease, transform 0.6s ease;
-
}
-
-
.timeline-item.animate {
-
opacity: 1;
-
transform: translateY(0);
-
}
-
-
.timeline-item:nth-child(even) {
-
transform: translateY(50px);
-
}
-
-
.timeline-item:nth-child(even).animate {
-
transform: translateY(0);
-
}
-
-
.timeline-item:nth-child(1) {
-
transition-delay: 0.1s;
-
}
-
-
.timeline-item:nth-child(2) {
-
transition-delay: 0.2s;
-
}
-
-
.timeline-item:nth-child(3) {
-
transition-delay: 0.3s;
-
}
-
-
.timeline-item:nth-child(4) {
-
transition-delay: 0.4s;
-
}
-
-
.timeline-item:nth-child(5) {
-
transition-delay: 0.5s;
-
}
-
-
.timeline-item:nth-child(6) {
-
transition-delay: 0.6s;
-
}
-
`;
-
document.head.appendChild(style);
-
-
// Animate timeline elements on scroll
-
const timelineItems = document.querySelectorAll('.timeline-item');
-
-
function animateOnScroll() {
-
timelineItems.forEach(item => {
-
const itemPosition = item.getBoundingClientRect().top;
-
const screenPosition = window.innerHeight / 1.2;
-
-
if (itemPosition < screenPosition) {
-
item.classList.add('animate');
-
}
-
});
-
}
-
-
// Initial animation setup
-
setTimeout(() => {
-
animateOnScroll();
-
}, 300);
-
-
// Check on scroll
-
window.addEventListener('scroll', animateOnScroll);
-
-
// Function to add new timeline items
-
window.addTimelineItem = function(date, title, content) {
-
const timeline = document.querySelector('.timeline');
-
const timelineItem = document.createElement('div');
-
timelineItem.classList.add('timeline-item');
-
-
timelineItem.innerHTML = `
-
<div class="timeline-date">${date}</div>
-
<div class="timeline-content">
-
<h3>${title}</h3>
-
<p>${content}</p>
-
</div>
-
`;
-
-
timeline.appendChild(timelineItem);
-
-
// Update animation elements
-
setTimeout(() => {
-
animateOnScroll();
-
}, 100);
-
};
-
});
-797
site/styles.css
···
-
/* Base styles */
-
:root {
-
--primary-color: #3498db;
-
--og-color: #f3fffa;
-
--secondary-color: #2c3e50;
-
--accent-color: #e74c3c;
-
--light-color: #ecf0f1;
-
--dark-color: #2c3e50;
-
--text-color: #333;
-
--transition-speed: 0.3s;
-
}
-
-
* {
-
margin: 0;
-
padding: 0;
-
box-sizing: border-box;
-
}
-
-
html {
-
scroll-behavior: smooth;
-
}
-
-
body {
-
font-family: 'Helvetica Neue', Arial, sans-serif;
-
line-height: 1.6;
-
color: var(--text-color);
-
background-color: var(--light-color);
-
font-size: 18px; /* Increased base font size */
-
}
-
-
.aim {
-
font-weight: 500;
-
color: #000040;
-
}
-
-
.container {
-
max-width: 1000px;
-
margin: 0 auto;
-
padding: 0 20px;
-
}
-
-
h1, h2, h3, h4 {
-
margin-bottom: 20px;
-
color: var(--secondary-color);
-
}
-
-
p {
-
margin-bottom: 20px;
-
font-size: 1.1rem; /* Larger paragraph text */
-
line-height: 1.8;
-
max-width: 100%;
-
}
-
-
a {
-
color: var(--primary-color);
-
text-decoration: none;
-
transition: all var(--transition-speed) ease;
-
}
-
-
a:hover {
-
color: var(--accent-color);
-
}
-
-
/* Navigation */
-
header {
-
background-color: var(--secondary-color);
-
position: fixed;
-
top: 0;
-
left: 0;
-
right: 0;
-
z-index: 1000;
-
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
-
}
-
-
nav {
-
display: flex;
-
justify-content: space-between;
-
align-items: center;
-
padding: 20px;
-
max-width: 1000px;
-
margin: 0 auto;
-
}
-
-
.logo {
-
color: white;
-
font-size: 1.5rem;
-
font-weight: bold;
-
}
-
-
.nav-container {
-
display: flex;
-
align-items: center;
-
}
-
-
nav ul {
-
display: flex;
-
list-style: none;
-
}
-
-
.main-nav {
-
margin-right: 30px;
-
}
-
-
.social-nav {
-
border-left: 1px solid rgba(255, 255, 255, 0.2);
-
padding-left: 20px;
-
}
-
-
nav ul li {
-
margin-left: 30px;
-
}
-
-
.main-nav li:first-child {
-
margin-left: 0;
-
}
-
-
nav ul li.social-icon {
-
margin-left: 15px;
-
}
-
-
.social-nav li:first-child {
-
margin-left: 0;
-
}
-
-
nav ul li a {
-
color: white;
-
position: relative;
-
}
-
-
nav ul li a:after {
-
content: '';
-
position: absolute;
-
width: 0;
-
height: 2px;
-
background: var(--accent-color);
-
bottom: -5px;
-
left: 0;
-
transition: width var(--transition-speed) ease;
-
}
-
-
nav ul li a:hover:after {
-
width: 100%;
-
}
-
-
/* Hero Section */
-
#hero {
-
background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
-
color: white;
-
text-align: center;
-
padding: 150px 20px 100px;
-
margin-top: 60px;
-
}
-
-
#hero h2 {
-
font-size: 3rem;
-
margin-bottom: 30px;
-
color: white;
-
line-height: 1.2;
-
max-width: 700px;
-
margin-left: auto;
-
margin-right: auto;
-
}
-
-
#hero .byline {
-
font-size: 1.5rem;
-
margin-bottom: 40px;
-
}
-
-
.cta-button {
-
display: inline-block;
-
background-color: var(--accent-color);
-
color: white;
-
padding: 15px 30px;
-
border-radius: 5px;
-
font-weight: bold;
-
transition: background-color var(--transition-speed) ease;
-
}
-
-
.cta-button:hover {
-
background-color: #c0392b;
-
color: white;
-
}
-
-
/* Section Styles */
-
section {
-
padding: 80px 0;
-
}
-
-
section h2 {
-
font-size: 2.5rem;
-
text-align: center;
-
margin-bottom: 50px;
-
position: relative;
-
}
-
-
section h2:after {
-
content: '';
-
position: absolute;
-
width: 100px;
-
height: 3px;
-
background-color: var(--accent-color);
-
bottom: -15px;
-
left: 50%;
-
transform: translateX(-50%);
-
}
-
-
/* Manifesto Section */
-
#manifesto {
-
background-color: white;
-
}
-
-
#manifesto .byline {
-
font-size: 1.2rem;
-
text-align: center;
-
margin-bottom: 30px;
-
}
-
-
#manifesto .byline a {
-
color: var(--primary-color);
-
text-decoration: none;
-
transition: color 0.3s ease;
-
}
-
-
#manifesto .byline a:hover {
-
color: var(--accent-color);
-
text-decoration: underline;
-
}
-
-
blockquote {
-
font-size: 1.5rem;
-
font-style: italic;
-
border-left: 5px solid var(--primary-color);
-
padding-left: 20px;
-
margin: 30px 0;
-
color: var(--primary-color);
-
}
-
-
.closing-quote {
-
text-align: center;
-
border-left: none;
-
padding: 25px 20px;
-
margin: 40px auto 20px;
-
max-width: 800px;
-
color: var(--accent-color);
-
font-weight: 400;
-
background-color: rgba(231, 76, 60, 0.05);
-
border-radius: 8px;
-
}
-
-
.principle {
-
margin-bottom: 40px;
-
padding: 20px;
-
border-radius: 5px;
-
background-color: rgba(236, 240, 241, 0.5);
-
transition: transform var(--transition-speed) ease;
-
}
-
-
.principle:hover {
-
transform: translateY(-5px);
-
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1);
-
}
-
-
.principle h3 {
-
color: var(--primary-color);
-
}
-
-
/* Use Cases Section */
-
#usecases {
-
background-color: #f9f9f9;
-
}
-
-
.usecase {
-
margin-bottom: 50px;
-
padding: 30px;
-
border-radius: 5px;
-
background-color: white;
-
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05);
-
transition: transform var(--transition-speed) ease;
-
}
-
-
.usecase:hover {
-
transform: translateY(-5px);
-
box-shadow: 0 15px 30px rgba(0, 0, 0, 0.1);
-
}
-
-
.usecase h3 {
-
color: var(--primary-color);
-
margin-bottom: 15px;
-
}
-
-
.usecase ul {
-
margin-left: 20px;
-
margin-bottom: 20px;
-
}
-
-
.usecase .cta-button {
-
display: inline-block;
-
background-color: var(--primary-color);
-
color: white;
-
padding: 8px 20px;
-
border-radius: 5px;
-
font-weight: bold;
-
font-size: 0.9rem;
-
margin-top: 10px;
-
transition: background-color var(--transition-speed) ease;
-
}
-
-
.usecase .cta-button:hover {
-
background-color: var(--accent-color);
-
color: white;
-
text-decoration: none;
-
}
-
-
.investigators {
-
font-style: italic;
-
color: var(--primary-color);
-
border-top: 1px solid #eee;
-
padding-top: 10px;
-
margin-top: 15px;
-
}
-
-
/* Use Case Detail Page */
-
#usecase-detail {
-
background-color: #f9f9f9;
-
margin-top: 60px;
-
padding-top: 80px;
-
}
-
-
.back-link {
-
margin-top: 30px;
-
margin-bottom: 20px;
-
}
-
-
.back-link a {
-
display: inline-block;
-
color: var(--primary-color);
-
font-weight: 500;
-
transition: color var(--transition-speed) ease;
-
}
-
-
.back-link a:hover {
-
color: var(--accent-color);
-
text-decoration: underline;
-
}
-
-
.investigators a {
-
color: var(--primary-color);
-
text-decoration: none;
-
transition: color 0.3s ease;
-
}
-
-
.investigators a:hover {
-
color: var(--accent-color);
-
text-decoration: underline;
-
}
-
-
/* Timeline Section */
-
#timeline {
-
background-color: white;
-
padding-bottom: 100px;
-
}
-
-
.timeline-separator {
-
text-align: center;
-
position: relative;
-
margin: 30px auto 40px;
-
max-width: 800px;
-
}
-
-
.timeline-separator:before {
-
content: '';
-
position: absolute;
-
width: 100%;
-
height: 1px;
-
background-color: #e0e0e0;
-
top: 50%;
-
left: 0;
-
z-index: 1;
-
}
-
-
.timeline-separator span {
-
display: inline-block;
-
padding: 10px 20px;
-
background-color: white;
-
color: var(--secondary-color);
-
font-weight: bold;
-
position: relative;
-
z-index: 2;
-
border-radius: 20px;
-
box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1);
-
font-size: 1.1rem;
-
}
-
-
.timeline-separator:first-of-type span {
-
color: #27ae60;
-
box-shadow: 0 3px 10px rgba(39, 174, 96, 0.15);
-
}
-
-
.timeline {
-
position: relative;
-
max-width: 800px;
-
margin: 0 auto;
-
}
-
-
.timeline:before {
-
content: '';
-
position: absolute;
-
top: 0;
-
bottom: 0;
-
left: 50%;
-
width: 4px;
-
background: linear-gradient(to bottom, var(--primary-color), var(--accent-color));
-
transform: translateX(-50%);
-
border-radius: 4px;
-
}
-
-
.timeline-item.future:after {
-
border-color: #27ae60;
-
border-width: 3px;
-
}
-
-
.timeline-item.future .timeline-content {
-
background-color: #f9fffc;
-
box-shadow: 0 5px 25px rgba(39, 174, 96, 0.15);
-
}
-
-
.timeline-item.future .timeline-content:before {
-
border-right-color: #f9fffc;
-
}
-
-
.timeline-item.future:nth-child(even) .timeline-content:before {
-
border-left-color: #f9fffc;
-
}
-
-
.timeline-item.future .timeline-date {
-
color: #27ae60;
-
}
-
-
.timeline-item {
-
position: relative;
-
margin-bottom: 70px;
-
display: flex;
-
justify-content: flex-start;
-
align-items: center;
-
width: 48%;
-
margin-right: 2%;
-
}
-
-
.timeline-item:nth-child(even) {
-
margin-left: 52%;
-
margin-right: 0;
-
width: 48%;
-
}
-
-
.timeline-item:after {
-
content: '';
-
position: absolute;
-
width: 16px;
-
height: 16px;
-
background-color: white;
-
border: 3px solid var(--primary-color);
-
top: 20px;
-
border-radius: 50%;
-
z-index: 2;
-
right: auto;
-
left: calc(104%);
-
transform: translateX(-50%);
-
}
-
-
.timeline-item:nth-child(even):after {
-
left: -4%;
-
right: auto;
-
transform: translateX(-50%);
-
}
-
-
.timeline-date {
-
position: absolute;
-
width: 170px;
-
text-align: right;
-
left: -200px;
-
color: var(--primary-color);
-
font-weight: bold;
-
font-size: 1.1rem;
-
}
-
-
.timeline-item:nth-child(even) .timeline-date {
-
right: -200px;
-
left: auto;
-
text-align: left;
-
}
-
-
.timeline-content {
-
background-color: #f9f9f9;
-
padding: 20px 25px;
-
border-radius: 8px;
-
box-shadow: 0 5px 25px rgba(0, 0, 0, 0.1);
-
position: relative;
-
width: 100%;
-
transition: transform 0.3s ease, box-shadow 0.3s ease;
-
}
-
-
.timeline-content:hover {
-
transform: translateY(-5px);
-
box-shadow: 0 15px 35px rgba(0, 0, 0, 0.15);
-
}
-
-
.timeline-content p {
-
font-size: 1.15rem;
-
line-height: 1.6;
-
margin: 0;
-
font-weight: 400;
-
}
-
-
.timeline-content a {
-
color: var(--primary-color);
-
text-decoration: none;
-
font-weight: 500;
-
transition: color 0.3s ease;
-
}
-
-
.timeline-content a:hover {
-
color: var(--accent-color);
-
text-decoration: underline;
-
}
-
-
.timeline-content:before {
-
content: '';
-
position: absolute;
-
top: 20px;
-
right: 100%;
-
border: 12px solid transparent;
-
border-right-color: #f9f9f9;
-
margin-right: -1px;
-
}
-
-
.timeline-item:nth-child(even) .timeline-content:before {
-
left: 100%;
-
right: auto;
-
border-color: transparent;
-
border-left-color: #f9f9f9;
-
margin-left: -1px;
-
}
-
-
/* About Section */
-
#about {
-
background-color: #f9f9f9;
-
text-align: center;
-
}
-
-
.participants ul {
-
display: flex;
-
flex-wrap: wrap;
-
justify-content: center;
-
list-style: none;
-
margin-bottom: 40px;
-
}
-
-
.participants li {
-
margin: 10px 20px;
-
padding: 10px 20px;
-
background-color: white;
-
border-radius: 5px;
-
box-shadow: 0 3px 10px rgba(0, 0, 0, 0.05);
-
transition: transform var(--transition-speed) ease;
-
font-size: 1.1rem;
-
}
-
-
.participants li:hover {
-
transform: translateY(-5px);
-
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1);
-
}
-
-
.participants li a {
-
color: var(--secondary-color);
-
font-weight: 500;
-
text-decoration: none;
-
transition: color 0.3s ease;
-
}
-
-
.participants li a:hover {
-
color: black;
-
text-decoration: underline;
-
}
-
-
.participants li.original {
-
background-color: var(--og-color);
-
}
-
-
.participants li.original a {
-
color: black;
-
}
-
-
.participants li.original:hover {
-
background-color: var(--og-color);
-
}
-
-
.social-icon a {
-
display: inline-block;
-
color: white;
-
transition: all var(--transition-speed) ease;
-
line-height: normal;
-
}
-
-
.social-icon img.bsky-icon,
-
.social-icon img.matrix-icon {
-
position: relative;
-
top: 3px;
-
filter: invert(1);
-
vertical-align: baseline;
-
}
-
-
.social-icon a:hover {
-
opacity: 0.8;
-
}
-
-
.social-links {
-
display: flex;
-
gap: 15px;
-
margin-top: 20px;
-
justify-content: center;
-
flex-wrap: wrap;
-
}
-
-
.matrix-link, .bluesky-link {
-
display: inline-flex;
-
align-items: center;
-
padding: 10px 20px;
-
color: white;
-
border-radius: 5px;
-
transition: background-color var(--transition-speed) ease;
-
font-weight: 500;
-
}
-
-
.matrix-link {
-
background-color: var(--primary-color);
-
}
-
-
.bluesky-link {
-
background-color: #0085FF;
-
}
-
-
.bluesky-link img.bsky-icon,
-
.matrix-link img.matrix-icon {
-
margin-right: 8px;
-
position: relative;
-
top: 4px;
-
vertical-align: baseline;
-
}
-
-
.matrix-link:hover {
-
background-color: #2980b9;
-
color: white;
-
}
-
-
.bluesky-link:hover {
-
background-color: #0066CC;
-
color: white;
-
}
-
-
/* Footer */
-
footer {
-
background-color: var(--secondary-color);
-
color: white;
-
text-align: center;
-
padding: 30px 0;
-
}
-
-
footer .disclaimer {
-
font-size: 0.85rem;
-
opacity: 0.85;
-
max-width: 800px;
-
margin: 10px auto 0;
-
line-height: 1.5;
-
}
-
-
footer .disclaimer a {
-
color: white;
-
text-decoration: underline;
-
opacity: 0.9;
-
transition: opacity 0.3s ease;
-
}
-
-
footer .disclaimer a:hover {
-
opacity: 1;
-
color: white;
-
}
-
-
/* Responsive styles */
-
@media (max-width: 768px) {
-
nav {
-
flex-direction: column;
-
padding: 15px;
-
}
-
-
.logo {
-
display: none;
-
}
-
-
.nav-container {
-
flex-direction: row;
-
width: 100%;
-
justify-content: center;
-
}
-
-
.main-nav {
-
margin-right: 0;
-
margin-top: 0;
-
flex-wrap: wrap;
-
justify-content: center;
-
}
-
-
.social-nav {
-
display: none;
-
}
-
-
nav ul li {
-
margin: 10px;
-
}
-
-
nav ul li.social-icon {
-
margin: 10px;
-
}
-
-
#hero {
-
padding: 120px 20px 100px;
-
margin-top: 40px;
-
}
-
-
#hero h2 {
-
font-size: 2.2rem;
-
padding: 0 10px;
-
}
-
-
.timeline-separator {
-
margin: 40px auto 30px;
-
}
-
-
.timeline-separator span {
-
padding: 8px 15px;
-
font-size: 1rem;
-
}
-
-
.timeline:before {
-
left: 30px;
-
}
-
-
.timeline-item, .timeline-item:nth-child(even) {
-
width: calc(100% - 60px);
-
margin-left: 0;
-
margin-right: 0;
-
padding-left: 60px;
-
}
-
-
.timeline:before {
-
left: 30px;
-
transform: translateX(-50%);
-
}
-
-
.timeline-item:after, .timeline-item:nth-child(even):after {
-
left: 30px;
-
right: auto;
-
transform: translateX(-50%);
-
}
-
-
.timeline-date, .timeline-item:nth-child(even) .timeline-date {
-
left: 40px;
-
right: auto;
-
text-align: left;
-
top: -30px;
-
width: auto;
-
}
-
-
.timeline-content:before, .timeline-item:nth-child(even) .timeline-content:before {
-
left: -20px;
-
right: auto;
-
border-color: transparent;
-
border-right-color: #f9f9f9;
-
}
-
-
.timeline-item.future .timeline-content:before {
-
border-right-color: #f9fffc;
-
}
-
-
.timeline-content {
-
font-size: 0.95rem;
-
padding-top: 30px;
-
}
-
-
.timeline-content h3 {
-
font-size: 1.2rem;
-
}
-
-
.participants ul {
-
flex-direction: column;
-
align-items: center;
-
}
-
}
-63
site/usecase-collaboration.html
···
-
<!DOCTYPE html>
-
<html lang="en">
-
<head>
-
<meta charset="UTF-8">
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
-
<title>Collaboration in the Small - A Human Approach to Computational Science</title>
-
<link rel="stylesheet" href="styles.css">
-
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
-
</head>
-
<body>
-
<header>
-
<nav>
-
<div class="logo">The Bellairs Manifesto</div>
-
<div class="nav-container">
-
<ul class="main-nav">
-
<li><a href="index.html#manifesto">Manifesto</a></li>
-
<li><a href="index.html#usecases">Actions</a></li>
-
<li><a href="index.html#timeline">Timeline</a></li>
-
<li><a href="index.html#about">About</a></li>
-
</ul>
-
<ul class="social-nav">
-
<li class="social-icon"><a href="https://matrix.to/#/#bellairs-discuss:recoil.org" target="_blank" aria-label="Matrix">
-
<img src="matrix-icon.svg" alt="Matrix" width="20" height="20" class="matrix-icon">
-
</a></li>
-
<li class="social-icon"><a href="https://bsky.app/profile/bellairs.quest" target="_blank" aria-label="Bluesky">
-
<img src="bluesky-icon.svg" alt="Bluesky" width="20" height="20" class="bsky-icon">
-
</a></li>
-
</ul>
-
</div>
-
</nav>
-
</header>
-
-
<section id="usecase-detail">
-
<div class="container">
-
<h2>Use Case: Collaboration in the Small</h2>
-
-
<div class="usecase">
-
<p>Many research projects necessitate the involvement of inputs from other researchers, including those in a different area. For example:</p>
-
<ul>
-
<li>Research on schedulers depends on the availability of traces (e.g., from large ML clusters or servers running databases for web servers) that are not readily available to the average computer systems researcher. At the same time, these traces are considered sensitive (because they reveal information about cluster size and machine specification) and are not often posted online.</li>
-
<li>Research on verification and testing requires system specifications, which need to be validated by the programmers who built the software but are not experts in verification. Few groups have sufficient expertise to both write specifications for real-world software and use them for verification tasks, and collaboration is thus key to these efforts.</li>
-
<li>Research that extends prior work, which constructs data or analysis artifacts, and would benefit from starting from these artifacts.</li>
-
</ul>
-
<p>However, finding other researchers' digital artifacts, and then using (or extending) them is challenging today: we have relatively few mechanisms to discover existing digital artifacts (the ones we have usually require serendipitously reading a research paper or website that describes the artifact); no mechanisms to ensure that contributions from publicly available artifacts are recognized; and nearly no good mechanism to share artifacts among a small set of research groups (each of which might have an evolving set of individual participants).</p>
-
<p>We will address these challenges by developing systems that make it easier to discover digital artifacts, make it easier to track the contributions of each artifact's provider, and reduce friction for sharing artifacts between research groups.</p>
-
<p class="investigators"><strong>Investigators:</strong> <a href="https://cseweb.ucsd.edu/~mcoblenz/" target="_blank">Michael Coblenz</a></p>
-
</div>
-
-
<div class="back-link">
-
<a href="index.html#usecases">&larr; Back to all use cases</a>
-
</div>
-
</div>
-
</section>
-
-
<footer>
-
<div class="container">
-
<p class="disclaimer">&copy; 2025 in the public domain. This site is not directly affiliated with the <a href="https://www.mcgill.ca/bellairs/" target="_blank">Bellairs Research Institute</a>, but we are grateful to them for hosting our research symposium that made this manifesto possible.</p>
-
</div>
-
</footer>
-
-
<script src="scripts.js"></script>
-
</body>
-
</html>
-57
site/usecase-conservation.html
···
-
<!DOCTYPE html>
-
<html lang="en">
-
<head>
-
<meta charset="UTF-8">
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
-
<title>Conservation and Sensing - A Human Approach to Computational Science</title>
-
<link rel="stylesheet" href="styles.css">
-
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
-
</head>
-
<body>
-
<header>
-
<nav>
-
<div class="logo">The Bellairs Manifesto</div>
-
<div class="nav-container">
-
<ul class="main-nav">
-
<li><a href="index.html#manifesto">Manifesto</a></li>
-
<li><a href="index.html#usecases">Actions</a></li>
-
<li><a href="index.html#timeline">Timeline</a></li>
-
<li><a href="index.html#about">About</a></li>
-
</ul>
-
<ul class="social-nav">
-
<li class="social-icon"><a href="https://matrix.to/#/#bellairs-discuss:recoil.org" target="_blank" aria-label="Matrix">
-
<img src="matrix-icon.svg" alt="Matrix" width="20" height="20" class="matrix-icon">
-
</a></li>
-
<li class="social-icon"><a href="https://bsky.app/profile/bellairs.quest" target="_blank" aria-label="Bluesky">
-
<img src="bluesky-icon.svg" alt="Bluesky" width="20" height="20" class="bsky-icon">
-
</a></li>
-
</ul>
-
</div>
-
</nav>
-
</header>
-
-
<section id="usecase-detail">
-
<div class="container">
-
<h2>Use Case: Conservation and Sensing</h2>
-
-
<div class="usecase">
-
<p>Some large-scale research projects require acquiring, aggregating, manipulating, analyzing, and reporting on a multitude of data sets. Sometimes, the outputs may even connect to real-time systems, such as data dashboards or sensor networks, which need to be configured as a result of the analysis. For example, the IUCN Red List of Threatened Species is derived from a multitude of data regarding species sightings, habitat loss, and climate predictions. Among this data is output from the Centre for Earth Observation, which itself constructs complex models that assimilate data. As another example, a network of sensing buoys may receive control inputs from a control system that sends commands on the basis of weather predictions and mission inputs.</p>
-
<p>Some inputs must be protected. For example, locations of threatened species may be useful in the analysis but need to be kept private lest poachers destroy those populations. Thus, although this scenario benefits from openness and transparency in general, not everything can be made public.</p>
-
<p class="investigators"><strong>Investigators:</strong> <a href="https://cseweb.ucsd.edu/~mcoblenz/" target="_blank">Michael Coblenz</a>, <a href="https://anil.recoil.org" target="_blank">Anil Madhavapeddy</a>, <a href="https://web.eecs.umich.edu/~comar/" target="_blank">Cyrus Omar</a></p>
-
</div>
-
-
<div class="back-link">
-
<a href="index.html#usecases">&larr; Back to all use cases</a>
-
</div>
-
</div>
-
</section>
-
-
<footer>
-
<div class="container">
-
<p class="disclaimer">&copy; 2025 in the public domain. This site is not directly affiliated with the <a href="https://www.mcgill.ca/bellairs/" target="_blank">Bellairs Research Institute</a>, but we are grateful to them for hosting our research symposium that made this manifesto possible.</p>
-
</div>
-
</footer>
-
-
<script src="scripts.js"></script>
-
</body>
-
</html>
-57
site/usecase-training.html
···
-
<!DOCTYPE html>
-
<html lang="en">
-
<head>
-
<meta charset="UTF-8">
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
-
<title>Breaking Specialist Training out of the University - A Human Approach to Computational Science</title>
-
<link rel="stylesheet" href="styles.css">
-
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
-
</head>
-
<body>
-
<header>
-
<nav>
-
<div class="logo">The Bellairs Manifesto</div>
-
<div class="nav-container">
-
<ul class="main-nav">
-
<li><a href="index.html#manifesto">Manifesto</a></li>
-
<li><a href="index.html#usecases">Actions</a></li>
-
<li><a href="index.html#timeline">Timeline</a></li>
-
<li><a href="index.html#about">About</a></li>
-
</ul>
-
<ul class="social-nav">
-
<li class="social-icon"><a href="https://matrix.to/#/#bellairs-discuss:recoil.org" target="_blank" aria-label="Matrix">
-
<img src="matrix-icon.svg" alt="Matrix" width="20" height="20" class="matrix-icon">
-
</a></li>
-
<li class="social-icon"><a href="https://bsky.app/profile/bellairs.quest" target="_blank" aria-label="Bluesky">
-
<img src="bluesky-icon.svg" alt="Bluesky" width="20" height="20" class="bsky-icon">
-
</a></li>
-
</ul>
-
</div>
-
</nav>
-
</header>
-
-
<section id="usecase-detail">
-
<div class="container">
-
<h2>Use Case: Breaking Specialist Training out of the University</h2>
-
-
<div class="usecase">
-
<p>Meaningful participation in important scientific discourses requires specialist knowledge. For example, to evaluate the safety of a plan to deploy machine learning in public infrastructure, some understanding of current techniques and their range of applicability is required; likewise, climate data cannot be meaningfully analysed by someone who lacks prior experience in statistics. Access to specialist training of this kind is presently centralised in the universities and gated behind tuition fees and time barriers.</p>
-
<p>We will answer the erosion of public trust in the scientific process with a credible invitation: join us, learn our methods, and contribute to the discourse. To that end, we aim to build sustainable infrastructure for a decentralised network of publicly accessible online courseware, textbooks, tutorials, and social media that will serve as the roots of a new and serious partnership between the public and the scientific community.</p>
-
<p class="investigators"><strong>Investigators:</strong> <a href="https://www.jonmsterling.com" target="_blank">Jonathan Sterling</a>, <a href="https://anil.recoil.org" target="_blank">Anil Madhavapeddy</a></p>
-
</div>
-
-
<div class="back-link">
-
<a href="index.html#usecases">&larr; Back to all use cases</a>
-
</div>
-
</div>
-
</section>
-
-
<footer>
-
<div class="container">
-
<p class="disclaimer">&copy; 2025 in the public domain. This site is not directly affiliated with the <a href="https://www.mcgill.ca/bellairs/" target="_blank">Bellairs Research Institute</a>, but we are grateful to them for hosting our research symposium that made this manifesto possible.</p>
-
</div>
-
</footer>
-
-
<script src="scripts.js"></script>
-
</body>
-
</html>