Online readers: see Speaker Notes
LinuxFest
Northwest
2018
LinuxFest Northwest 2018
Perkeep:
your personal storage system for life
Brad Fitzpatrick, Mathieu Lonjaret
2018-04-28
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Hello again!
Who saw our talk here in 2016?
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Agenda
What is Perkeep?
Why Perkeep?�How does it work?
The Project
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Agenda
What is Perkeep?
Why Perkeep?�How does it work?
The Project
LinuxFest Northwest 2018
LinuxFest Northwest 2018
What is Perkeep?
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Blob storage
API
Indexing
OpenPGP
verify
Search
OpenPGP
signing
Web UI
CLI
Apps
Importers
FUSE
Mobile
Schema
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Blob storage
API
Indexing
OpenPGP
verify
Search
OpenPGP
signing
Web UI
CLI
Apps
Importers
FUSE
Mobile
Schema
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Blob storage
API
Indexing
OpenPGP
verify
Search
OpenPGP
signing
Web UI
CLI
Apps
Importers
FUSE
Mobile
Schema
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Blob storage
API
Indexing
OpenPGP
verify
Search
OpenPGP
signing
Web UI
CLI
Apps
Importers
FUSE
Mobile
LinuxFest Northwest 2018
LinuxFest Northwest 2018
$ pk put blob …
$ pk put file foo.txt
$ pk put file $HOME/dir
$ pk put permanode
$ pk put attr [--add] <permanode> <name> <value>
$ pk put share
$ pk list
$ pk get …
$ pk search ...
$ pk sync ...
LinuxFest Northwest 2018
Blob storage
API
Indexing
OpenPGP
verify
Search
OpenPGP
signing
Web UI
CLI
Apps
Importers
FUSE
Mobile
LinuxFest Northwest 2018
LinuxFest Northwest 2018
$ pk mount
$ open /pk/recent/IMG_0925.jpg
$ ls /pk
at date recent roots sha1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
tag versions WELCOME.txt
$ echo "Hello, LFNW 2018." > /pk/roots/foo/foo.txt
$ cat /pk/roots/foo/foo.txt
Hello, LFNW 2018.
$ cat /pk/at/2016-04-28/foo/foo.txt
Hello, LinuxFest!
LinuxFest Northwest 2018
Blob storage
API
Indexing
OpenPGP
verify
Search
OpenPGP
signing
Web UI
CLI
Apps
Importers
FUSE
Mobile
Schema
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Blob storage
API
Indexing
OpenPGP
verify
Search
OpenPGP
signing
Web UI
CLI
Apps
Importers
FUSE
Mobile
Schema
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Importers
perkeepd
foursquare
importer
importer
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Blob storage
API
Indexing
OpenPGP
verify
Search
OpenPGP
signing
Web UI
CLI
Apps
Importers
FUSE
Mobile
Schema
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Blob storage
API
Indexing
OpenPGP
verify
Search
OpenPGP
signing
Web UI
CLI
Apps
Importers
FUSE
Mobile
Schema
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Why Perkeep?
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Do you care about your data?
Will you still care in 5, 20, 40, 60 years?
Will your grandchildren want your photos?
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Unified Search
Can you easily search through all of your online data in a unified way?
"photos within 30 minutes of check-ins at venues of type 'sporting arena'"
"tweets two hours after drinking"
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Sites die
People create content on third-party sites.
And die with your data.
http://indiewebcamp.com/site-deaths
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Sites die
VC funding runs out
competitor eats them
site is sold to new evil owners
new employees at existing company turn evil
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Own it
Stay in control.
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Goal
Perkeep is a project to help you keep your content and online memories for life.
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
http://www.prattdudley.com/images/lumber5.jpg
LinuxFest Northwest 2018
LinuxFest Northwest 2018
http://www.prattdudley.com/images/lumber5.jpg
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
How does it work?
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Blob storage
API
Indexing
OpenPGP
verify
Search
OpenPGP
signing
Web UI
CLI
Apps
Importers
FUSE
Mobile
Schema
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Blob storage
API
Indexing
OpenPGP
verify
Search
OpenPGP
signing
Web UI
CLI
Apps
Importers
FUSE
Mobile
Schema
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Blob storage
we store blobs of 0B-16MB
no filenames
no MIME types
no metadata
no versions
just immutable blobs
LinuxFest Northwest 2018
LinuxFest Northwest 2018
No filenames? No metadata?
blobs are content-addressable
sha1-f61bea2f271c3b4900255c7deda5ec1e48a77105
sha224-abfa9fa2719d9cb8ad9e737e77da9d816bc8201b1f96e24976ec5459
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Advantages
LinuxFest Northwest 2018
LinuxFest Northwest 2018
$ pk list
$ echo Hello | pk put blob -�sha224-acbe28e133c6e7e8cc740d5c70875…
$ echo Hello | pk put blob -
sha224-acbe28e133c6e7e8cc740d5c70875…
$ echo World | pk put blob -�sha224-703574ab03e4cec2dd88d75db1802…
$ pk list
sha224-acbe28e133c6e7e8cc740d5c70875… 6
sha224-703574ab03e4cec2dd88d75db1802… 6
$ pk get sha224-acbe28e133c6e7e8cc740d5c70875…
Hello
LinuxFest Northwest 2018
$ pk list | wc -l
6639759
LinuxFest Northwest 2018
Blob server operations
LinuxFest Northwest 2018
LinuxFest Northwest 2018
No delete!
Harder to lose your data if you can't delete it.
[*] you can in emergencies if configured and you --ask-really-nicely
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Blobserver (in Go)
EnumerateBlobs(ctx context.Context, dest …, after string, limit int) error
StatBlobs(ctx context.Context, blobs []blob.Ref, fn func(blob.SizedRef) error) error�Fetch(context.Context, blob.Ref) (data io.ReadCloser, size uint32, err error)�ReceiveBlob(ctx context.Context, br blob.Ref, src io.Reader) (blob.SizedRef, error)
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Blobserver Implementations
local files
AWS S3
Google Cloud Storage
Google Drive
shard
union
encrypt
cache
remote
cond
mongo
namespace
packed
Azure
overlay
replica
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Blobserver Implementations
remote
local files
AWS S3
Google Cloud Storage
Google Drive
shard
union
encrypt
cache
cond
mongo
namespace
packed
Azure
overlay
replica
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Blobserver Implementations
remote
local files
AWS S3
Google Cloud Storage
Google Drive
shard
union
encrypt
cache
cond
mongo
namespace
packed
Azure
overlay
replica
LinuxFest Northwest 2018
LinuxFest Northwest 2018
No delete! No versions! Immutable!
It's always safe to copy everything from anywhere to anywhere, merging two subsets of blobs.
You can't break anything.
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Sync validation
You can even validate/fix sync pairs of blobstores
from the CLI or web UI.
It can also self-check/repair itself regularly.
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
What's in a blob?
LinuxFest Northwest 2018
LinuxFest Northwest 2018
What's in a blob?
Anything.
LinuxFest Northwest 2018
LinuxFest Northwest 2018
What's in a blob?
e.g. byte range 275029-501935 of some JPEG?
LinuxFest Northwest 2018
LinuxFest Northwest 2018
What's in a blob?
But some blob have bytes that look special.
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Blob storage
API
Indexing
OpenPGP
verify
Search
OpenPGP
signing
Web UI
CLI
Apps
Importers
FUSE
Mobile
Schema
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Schema Blobs
Blobs with a JSON object with
certain known fields.
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Wait, JSON?
Why not binary format $X?
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Data archaeology
JSON: ASCII/UTF-8, well-known because of the web.
sha224-xxxxxxxxxxx ref IDs include hash name, both for upgradability & to be self-describing.
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Example: files
A traditional “file” is just one type of thing Perkeep can model.
LinuxFest Northwest 2018
LinuxFest Northwest 2018
$ echo "Hello, World" > hello.txt
$ pk put file hello.txt
sha224-3043e7faf550da145aed7d038d21a2a8a501489a61f80abaab4076f0
$ pk get sha224-3043e7faf550da145aed7d038d21a2a8a501489a61f80abaab4076f0
{"camliVersion": 1,� "camliType": "file",� "fileName": "hello.txt",� "parts": [{� "blobRef":"sha224-0773026556c11487f4e36193406a47e2d1c6425278747b...",� "size": 15� }],� "unixGroup": "mpl",� "unixGroupId": 1000,� "unixMtime": "2018-04-27T17:57:36.202241494Z",� "unixOwner": "mpl",� "unixOwnerId": 1000,� "unixPermission": "0664"�}
$ pk get sha224-0773026556c11487f4e36193406a47e2d1c6425278747b8b22391c7e
Hello, World
LinuxFest Northwest 2018
5TB video file or VM image?
Merkle tree of "bytes" schema blobs.
Data at leaves.
Rolling checksum cut points (ala rsync, bup)
De-duplication within files & shifting files
Efficient seeks / pread
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Or a “directory”...
LinuxFest Northwest 2018
LinuxFest Northwest 2018
$ mkdir foo; touch foo/a; touch foo/bar
$ pk put file foo
sha224-ecbd2e404c4e2cacf09728025592dd324046115d95f9639cccbbe0fe
$ pk get sha224-ecbd2e404c4e2cacf09728025592dd324046115d95f9639cccbbe0fe
{"camliVersion": 1,� "camliType": "directory",� "entries": "sha224-529dbf997489196e8ea55f8681897b98da1d0c4eafc757...",� "fileName": "foo",� "unixGroup": "mpl",� "unixGroupId": 1000,� "unixMtime": "2018-04-27T18:24:10.75819438Z",� "unixOwner": "mpl",� "unixOwnerId": 1000,� "unixPermission": "0775"}
$ pk get sha224-529dbf997489196e8ea55f8681897b98da1d0c4eafc7571a0f5d8cd8
{"camliVersion": 1,� "camliType": "static-set",� "members": [� "sha224-2bbbfa36f4fcedd0d84d8564a28f2a49f1007c833073e2825a08d741",� "sha224-4a92d0cc8608b2e75e5dea87086198e6e466eb83a25e0e8ed0d10455"� ]}
LinuxFest Northwest 2018
$ pk get sha224-2bbbfa36f4fcedd0d84d8564a28f2a49f1007c833073e2825a08d741
{"camliVersion": 1,� "camliType": "file",� "fileName": "a",� "parts": [],� "unixGroup": "mpl",� "unixGroupId": 1000,� "unixMtime": "2018-04-27T18:24:04.270194572Z",� "unixOwner": "mpl",� "unixOwnerId": 1000,� "unixPermission": "0664"�}
$ pk get sha224-4a92d0cc8608b2e75e5dea87086198e6e466eb83a25e0e8ed0d10455
{"camliVersion": 1,� "camliType": "file",� "fileName": "bar",� "parts": [],� "unixGroup": "mpl",� "unixGroupId": 1000,� "unixMtime": "2018-04-27T18:24:10.75819438Z",� "unixOwner": "mpl",� "unixOwnerId": 1000,� "unixPermission": "0664"�}
LinuxFest Northwest 2018
Blob storage
API
Indexing
OpenPGP
verify
Search
OpenPGP
signing
Web UI
CLI
Apps
Importers
FUSE
Mobile
Schema
LinuxFest Northwest 2018
LinuxFest Northwest 2018
$ pk list | wc -l
6639759
LinuxFest Northwest 2018
Blob storage
API
Indexing
OpenPGP
verify
Search
OpenPGP
signing
Web UI
CLI
Apps
Importers
FUSE
Mobile
Schema
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Index
blobs
sorted
key=value
index implement blob storage interface; can replicate/sync to
write to any sorted key/value implementation
LinuxFest Northwest 2018
sorted.KeyValue interface
LinuxFest Northwest 2018
LinuxFest Northwest 2018
sorted.KeyValue stores
LevelDB
local disk
MySQL
Postgres
sqlite
in-memory
(dev)
mongo
AWS
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Index
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Indexing story time
What happens
when Perkeep receives a blob?
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Perkeep receives blob
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Indexer looks at bytes of blob
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Index receives blob
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Index receives blob
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Corpus
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Corpus
(in memory)
sorted
key=value
LinuxFest Northwest 2018
Corpus receives blob
Updates maps, and (lazily sorted) lists of:
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Blob storage
API
Indexing
OpenPGP
verify
Search
OpenPGP
signing
Web UI
CLI
Apps
Importers
FUSE
Mobile
Schema
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Two ways to search
LinuxFest Northwest 2018
LinuxFest Northwest 2018
The easy way
is:image before:2017-05 after:2015 loc:Hawaii
This compiles into the hard way for you.
LinuxFest Northwest 2018
LinuxFest Northwest 2018
is:image
is:pano
before:2017-05
after:2015
is:checkin
is:post
loc:Hawaii
height:480
locrect:48.63,-123.37,46.59,-121.28
attr:tag:funny
format:jpeg
filename:TODO.*
ref:sha224-xxxx
parentof:<ref>
childrenof:<ref>
AND OR NOT -(.....)
LinuxFest Northwest 2018
filename:*.HEIC -(filename:*.HEIC width:1-100000)
(Found HEIC files we misparsed when we were adding support for HEIC images.)
LinuxFest Northwest 2018
The hard way
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
filename:*hello*
LinuxFest Northwest 2018
$ pk search -rawquery '{"constraint": {� "permanode": {� "attr": "camliContent",� "valueInSet": {� "file": {� "fileName": {� "contains": "hello"� }� }� }� }�}}'
{� "blobs": [{� "blob": "sha224-e4086340c3dc85cfee70bba0ea71f1f11aaa..."� }], …
LinuxFest Northwest 2018
Permanodes
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Perkeep stores only immutable blobs.
LinuxFest Northwest 2018
LinuxFest Northwest 2018
How do we represent something that's mutable?
And how do we store a tweet?
Or a "like"?
LinuxFest Northwest 2018
LinuxFest Northwest 2018
$ pk put permanode
sha224-d76452b7b90d75e92aa07dfcbb254822305043a76819ae...
$ pk put permanode
sha224-2ad67a389ba386f439c0ee32fd3eee92444de7e3c5bdc1...
$ pk get sha224-2ad67a389ba386f439c0ee32fd3eee92444de7e3c...
{"camliVersion": 1,� "camliSigner": "sha224-ea0ba9068820cc128e993b20d0511de7...",� "camliType": "permanode",� "claimDate": "2018-04-27T20:51:19.426507741Z",� "random": "ZEh4ms2HiY1W4xVDhBQD3K3DHC4="�,"camliSig":"wsBcBAABCAAQBQJa441HCRApMaZ8JvWr2gAACKAIABpPIGojhfOxP9LfyZOV6BcGAUHfTkL52+ZtTEFepGfhkPpZH3nqfa682L2ofoFhZkW2FrciOQ+qleDRzv4YGI3LMqBqIqb4RakeGYRzBzpkzzv9vyJV/uIuDGDOzNyNz+hu/Dy6NjUoIt0kwaIsfymzMmLRKSAdcvoDUYekO9VMaF1xDslrUgDEewQQGQHEU4HfMqVR0pxUUWI51Ce2Uq0WAqbQ7lV7dSCsxyQY0tlW8Y1OgbUiqn13onoSs9yuUB4PyTCIOi3uFPGaU13a3kMAvmfRWSx4nRhBu3aWe3p+YdleDcOT6dShyS9Cdo2bizqM+f+TrrSgkr0PH7jTOkE==S9pj"}
LinuxFest Northwest 2018
$ pk put permanode
sha224-d76452b7b90d75e92aa07dfcbb254822305043a76819ae...
$ pk put permanode
sha224-2ad67a389ba386f439c0ee32fd3eee92444de7e3c5bdc1...
$ pk get sha224-2ad67a389ba386f439c0ee32fd3eee92444de7e3c...
{"camliVersion": 1,� "camliSigner": "sha224-ea0ba9068820cc128e993b20d0511de7...",� "camliType": "permanode",� "claimDate": "2018-04-27T20:51:19.426507741Z",� "random": "ZEh4ms2HiY1W4xVDhBQD3K3DHC4="�,"camliSig":"wsBcBAABCAAQBQJa441HCRApMaZ8JvWr2gAACKAIABpPIGojhfOxP9LfyZOV6BcGAUHfTkL52+ZtTEFepGfhkPpZH3nqfa682L2ofoFhZkW2FrciOQ+qleDRzv4YGI3LMqBqIqb4RakeGYRzBzpkzzv9vyJV/uIuDGDOzNyNz+hu/Dy6NjUoIt0kwaIsfymzMmLRKSAdcvoDUYekO9VMaF1xDslrUgDEewQQGQHEU4HfMqVR0pxUUWI51Ce2Uq0WAqbQ7lV7dSCsxyQY0tlW8Y1OgbUiqn13onoSs9yuUB4PyTCIOi3uFPGaU13a3kMAvmfRWSx4nRhBu3aWe3p+YdleDcOT6dShyS9Cdo2bizqM+f+TrrSgkr0PH7jTOkE==S9pj"}
LinuxFest Northwest 2018
$ pk get sha224-ea0ba9068820cc128e993b20d0511de736febc62fbd430d17bba9792
-----BEGIN PGP PUBLIC KEY BLOCK-----��xsBNBEzgoVsBCAC/56aEJ9BNIGV9FVP+WzenTAkg12k86YqlwJVAB/VwdMlyXxvi�bCT1RVRfnYxscs14LLfcMWF3zMucw16mLlJCBSLvbZ0jn4h+/8vK5WuAdjw2YzLs�WtBcjWn3lV6tb4RJz5gtD/o1w8VWxwAnAVIWZntKAWmkcChCRgdUeWso76+plxE5�aRYBJqdT1mctGqNEISd/WYPMgwnWXQsVi3x4z1dYu2tD9uO1dkAff12z1kyZQIBQ�rexKYRRRh9IKAayD4kgS0wdlULjBU98aeEaMz1ckuB46DX3lAYqmmTEL/Rl9cOI0�Enpn/oOOfYFa5h0AFndZd1blMvruXfdAobjVABEBAAE=�=28/7�-----END PGP PUBLIC KEY BLOCK-----
LinuxFest Northwest 2018
$ pk put permanode
sha224-8a445d964c3530bba93cfd317bde532ee1e15efd801ed179b9e80c7f
$ pk put attr sha224-8a445d964c3530bba93cfd317bde532ee1... title 'Fancy title'
$ pk put attr sha224-8a445d964c3530bba93cfd317bde532ee1... title 'Better title'
$ pk describe sha224-8a445d964c3530bba93cfd317bde532ee1e15efd801ed179b9e80c7f
{� "meta": {� "sha224-8a445d964c3530bba93cfd317bde532ee1e15efd801ed179b9e80c7f": {� "blobRef": "sha224-8a445d964c3530bba93cfd317bde532ee1e15efd801ed179...",� "camliType": "permanode",� "size": 629,� "permanode": {� "attr": {� "title": [� "Better title"� ]� },� "modtime": "2018-04-27T22:14:18.981957688Z"� }� }� }�}
LinuxFest Northwest 2018
$ pk claims sha224-8a445d964c3530bba93cfd317bde532ee1e15efd801ed179b9e80c7f
{� "claims": [{� "blobref": "sha224-25b7852f787a7b5f971ba424d453b7e63360cd03429f85adb4...",� "signer": "sha224-ea0ba9068820cc128e993b20d0511de736febc62fbd430d17bba9792",� "permanode": "sha224-8a445d964c3530bba93cfd317bde532ee1e15efd801ed179b9...",� "date": "2018-04-27T22:14:18.981957688Z",� "type": "set-attribute",� "attr": "title",� "value": "Fancy title"� },� {� "blobref": "sha224-8354dcb43d30a79b4e3f9e6ba3cb7557f35b852f566970499884...",� "signer": "sha224-ea0ba9068820cc128e993b20d0511de736febc62fbd430d17bba9792",� "permanode": "sha224-8a445d964c3530bba93cfd317bde532ee1e15efd801ed179b...",� "date": "2018-04-27T22:24:24.886072921Z",� "type": "set-attribute",� "attr": "title",� "value": "Better title"� }]�}
LinuxFest Northwest 2018
$ pk describe --at=2018-04-27T22:20:00.0Z sha224-8a445d964c3530bba93cfd317...
{� "meta": {� "sha224-8a445d964c3530bba93cfd317bde532ee1e15efd801ed179b9e80c7f": {� "blobRef": "sha224-8a445d964c3530bba93cfd317bde532ee1e15efd801ed179...",� "camliType": "permanode",� "size": 629,� "permanode": {� "attr": {� "title": [� "Fancy title"� ]� },� "modtime": "2018-04-27T22:14:18.981957688Z"� }� }� }�}
LinuxFest Northwest 2018
$ pk list | head -20
sha224-0773026556c11487f4e36193406a47e2d1c6425278747b8b22391c7e 15�sha224-25b7852f787a7b5f971ba424d453b7e63360cd03429f85adb451141a 745�sha224-2ad67a389ba386f439c0ee32fd3eee92444de7e3c5bdc1b6377d3eff 629�sha224-2bbbfa36f4fcedd0d84d8564a28f2a49f1007c833073e2825a08d741 244�sha224-3043e7faf550da145aed7d038d21a2a8a501489a61f80abaab4076f0 368�sha224-4a92d0cc8608b2e75e5dea87086198e6e466eb83a25e0e8ed0d10455 245�sha224-529dbf997489196e8ea55f8681897b98da1d0c4eafc7571a0f5d8cd8 210�sha224-6be2b3bcc4a17567d6e3bc004315c2a9a48b212df4eeaa61e20eb96f 751�sha224-8354dcb43d30a79b4e3f9e6ba3cb7557f35b852f566970499884fb39 746�sha224-8a445d964c3530bba93cfd317bde532ee1e15efd801ed179b9e80c7f 629�sha224-b01efacadad4e9cea0d9d457c97aa2732a560851bbc19338e78e19d0 768�sha224-b0a94d2947f0decfd3b34a70f46ddac6860c2d45b437d0bacdf14f6f 580�sha224-cdf85e7f959410dd8acc81cc51abd34b46478cefc4079550677988fc 804�sha224-d76452b7b90d75e92aa07dfcbb254822305043a76819aeed4b8fb5f0 629�sha224-e4086340c3dc85cfee70bba0ea71f1f11aaa837d79bed32d19b5e2a2 651�sha224-ea0ba9068820cc128e993b20d0511de736febc62fbd430d17bba9792 449�sha224-ecbd2e404c4e2cacf09728025592dd324046115d95f9639cccbbe0fe 315
LinuxFest Northwest 2018
$ X=$(pk put permanode)
$ pk search 'attr:tag:funny'
{� "blobs": null,� "description": null,�}
$ pk put attr $X tag funny
$ pk search 'attr:tag:funny'
{� "blobs": [{� "blob": "sha224-333eb172516d2677ca4b382e122de15f623c1…"� }],� "description": null,�}
LinuxFest Northwest 2018
$ pk search -rawquery '{"constraint": {� "permanode": {� "attr": "tag",� "valueMatches": {� "equals": "FUNNY",� "caseInsensitive": true� }� }�}}'
{� "blobs": [{� "blob": "sha224-333eb172516d2677ca4b382e122de15f623c…"� }],�…
LinuxFest Northwest 2018
Blob storage
API
Indexing
OpenPGP
verify
Search
OpenPGP
signing
Web UI
CLI
Apps
Importers
FUSE
Mobile
Schema
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
The Project
LinuxFest Northwest 2018
LinuxFest Northwest 2018
History
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Primary Developers
Brad Fitzpatrick, @bradfitz
Mathieu Lonjaret, @lejatorn
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Funding
LinuxFest Northwest 2018
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Funding
We plan to recognize patrons more prominently going forward.
But in the meantime...
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Thank you!
Paul Lindner, Erik Paulson, Jeremy Schlatter, Attila Tajti, Will Norris, David Whittington, PDXHub, Dan S, Andor Polgar, Tilman Dilo, Greg Worley, Szabolcs Berecz, Cole Gleason...
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Other Developers
About 120 developers total
23 with >= 10 commits
Yay Open Source!
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Thank you!
bslatkin, aboodman, lindner, wathiede, derat, tgulacsi, willnorris, dustin, tajtiattila, nickoneill, adg, saljam, edrex, dotMR, marete, slspeek, tdilo, FiloSottile, fawick, AshleyMcnamara, rhencke, evmar, elsigh, yaojingguo...
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Getting Started
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Getting Started
Run your own!
$ go get perkeep.org/server/perkeepd
$ go get perkeep.org/cmd/pk
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Getting Involved
File bugs!�Write docs!
Write an importer, or an app!
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Resources
LinuxFest Northwest 2018
LinuxFest Northwest 2018
Demos! Questions?
Brad Fitzpatrick, @bradfitz
Mathieu Lonjaret, @lejatorn
perkeep.org, @PerkeepOrg
LinuxFest Northwest 2018
LinuxFest Northwest 2018