├── .datignore
├── .gitignore
├── .well-known
└── dat
├── assets
├── designs
│ ├── jacinto.png
│ ├── starter-kit.png
│ └── vacant.png
├── fonts
│ ├── Inter-UI-Bold.woff
│ ├── Inter-UI-Bold.woff2
│ ├── Inter-UI-Italic.woff
│ ├── Inter-UI-Italic.woff2
│ ├── Inter-UI-Regular.woff
│ ├── Inter-UI-Regular.woff2
│ ├── fontawesome-webfont.woff
│ └── fontawesome-webfont.woff2
├── meta.jpg
└── settings.svg
├── blueprints
├── fields.json
├── guide.json
├── guides.json
├── home.json
├── issue.json
└── issues.json
├── bundles
├── 0.1.0
│ └── .gitkeep
├── bootstrap
│ ├── bootstrap.css
│ └── bootstrap.js
└── content.json
├── content
├── community
│ └── index.txt
├── docs
│ ├── fields
│ │ └── index.txt
│ └── index.txt
├── faq
│ └── index.txt
├── guides
│ ├── 01-creating-your-first-site
│ │ ├── image.svg
│ │ └── index.txt
│ ├── 02-customizing-your-site
│ │ ├── image.svg
│ │ └── index.txt
│ ├── 03-creating-pages
│ │ ├── image.svg
│ │ └── index.txt
│ ├── 04-how-to-leave-enoki
│ │ ├── image.svg
│ │ └── index.txt
│ ├── 05-starting-from-scratch
│ │ ├── image.svg
│ │ └── index.txt
│ ├── drafts.txt
│ └── index.txt
├── index.txt
├── issues
│ ├── cleanup-codebase
│ │ └── index.txt
│ ├── designs
│ │ └── index.txt
│ ├── fields
│ │ └── index.txt
│ ├── files
│ │ └── index.txt
│ ├── hub
│ │ └── index.txt
│ ├── index.txt
│ ├── inline-editing
│ │ └── index.txt
│ ├── library
│ │ └── index.txt
│ ├── page-functionality
│ │ └── index.txt
│ ├── panel-layouts
│ │ └── index.txt
│ ├── saving
│ │ └── index.txt
│ └── sites
│ │ └── index.txt
└── log
│ └── index.txt
├── favicon.ico
├── favicon.png
├── index.html
├── readme.md
└── source
├── blueprints
├── default.json
├── page-header.json
└── sites-create.json
├── components
├── actionbar.js
├── breadcrumbs.js
├── field.js
├── format.js
├── guide-thumbnail.js
├── header.js
├── modal.js
├── publish.js
├── sidebar.js
├── split.js
└── uploader.js
├── containers
├── fields.js
├── page-fields.js
├── page-header.js
├── page-new.js
├── wrapper-hub.js
└── wrapper-site.js
├── design
├── custom.js
├── guides.css
├── index.js
├── options.js
├── simplecolorpicker.css
├── simplemde.css
└── utilities.js
├── fields
├── checkbox.js
├── color.js
├── date.js
├── dropdown.js
├── files.js
├── index.js
├── pages.js
├── range.js
├── tags.js
├── text.js
└── textarea.js
├── index.js
├── lib
├── file.js
└── page.js
├── package.json
├── plugins
├── designs.js
├── docs.js
├── hub.js
├── interface.js
├── panel.js
├── scroll.js
└── sites.js
└── views
├── changes.js
├── default.js
├── docs.js
├── file-new.js
├── file.js
├── files-all.js
├── guide.js
├── guides.js
├── hub.js
├── log.js
├── network.js
├── notfound.js
├── page-new.js
├── pages-all.js
├── settings.js
├── sites-create.js
└── sites.js
/.datignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | .dat
3 | .git
4 | source/node_modules
5 | source/node_modules/**
6 | package-lock.json
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | .dat
3 |
4 | node_modules
5 | bundle.js
6 | bundle.css
7 | dat.json
8 | package-lock.json
9 |
--------------------------------------------------------------------------------
/.well-known/dat:
--------------------------------------------------------------------------------
1 | dat://53f1ef8d157ded803f14f6906fc3e34acabb0651ef422791b39c2d3a0700dd20
2 | TTL=3600
--------------------------------------------------------------------------------
/assets/designs/jacinto.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/enokidotsite/panel/12b6d563f0c23ba9f42f9fb1a23e59cf7ea2c0fb/assets/designs/jacinto.png
--------------------------------------------------------------------------------
/assets/designs/starter-kit.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/enokidotsite/panel/12b6d563f0c23ba9f42f9fb1a23e59cf7ea2c0fb/assets/designs/starter-kit.png
--------------------------------------------------------------------------------
/assets/designs/vacant.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/enokidotsite/panel/12b6d563f0c23ba9f42f9fb1a23e59cf7ea2c0fb/assets/designs/vacant.png
--------------------------------------------------------------------------------
/assets/fonts/Inter-UI-Bold.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/enokidotsite/panel/12b6d563f0c23ba9f42f9fb1a23e59cf7ea2c0fb/assets/fonts/Inter-UI-Bold.woff
--------------------------------------------------------------------------------
/assets/fonts/Inter-UI-Bold.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/enokidotsite/panel/12b6d563f0c23ba9f42f9fb1a23e59cf7ea2c0fb/assets/fonts/Inter-UI-Bold.woff2
--------------------------------------------------------------------------------
/assets/fonts/Inter-UI-Italic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/enokidotsite/panel/12b6d563f0c23ba9f42f9fb1a23e59cf7ea2c0fb/assets/fonts/Inter-UI-Italic.woff
--------------------------------------------------------------------------------
/assets/fonts/Inter-UI-Italic.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/enokidotsite/panel/12b6d563f0c23ba9f42f9fb1a23e59cf7ea2c0fb/assets/fonts/Inter-UI-Italic.woff2
--------------------------------------------------------------------------------
/assets/fonts/Inter-UI-Regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/enokidotsite/panel/12b6d563f0c23ba9f42f9fb1a23e59cf7ea2c0fb/assets/fonts/Inter-UI-Regular.woff
--------------------------------------------------------------------------------
/assets/fonts/Inter-UI-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/enokidotsite/panel/12b6d563f0c23ba9f42f9fb1a23e59cf7ea2c0fb/assets/fonts/Inter-UI-Regular.woff2
--------------------------------------------------------------------------------
/assets/fonts/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/enokidotsite/panel/12b6d563f0c23ba9f42f9fb1a23e59cf7ea2c0fb/assets/fonts/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/assets/fonts/fontawesome-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/enokidotsite/panel/12b6d563f0c23ba9f42f9fb1a23e59cf7ea2c0fb/assets/fonts/fontawesome-webfont.woff2
--------------------------------------------------------------------------------
/assets/meta.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/enokidotsite/panel/12b6d563f0c23ba9f42f9fb1a23e59cf7ea2c0fb/assets/meta.jpg
--------------------------------------------------------------------------------
/assets/settings.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
42 |
--------------------------------------------------------------------------------
/blueprints/fields.json:
--------------------------------------------------------------------------------
1 | {
2 | "title": "Fields",
3 | "pages": false,
4 | "fields": {
5 | "title": {
6 | "label": "Title",
7 | "type": "text"
8 | },
9 | "text": {
10 | "label": "Text",
11 | "type": "textarea"
12 | },
13 | "checkbox": {
14 | "label": "Checkbox",
15 | "text": "Descriptive text",
16 | "type": "checkbox",
17 | "width": "1/2"
18 | },
19 | "color": {
20 | "label": "Color",
21 | "text": "Descriptive text",
22 | "type": "color",
23 | "width": "1/2"
24 | },
25 | "tags": {
26 | "label": "Tags",
27 | "type": "tags"
28 | },
29 | "range": {
30 | "label": "Range",
31 | "text": "Descriptive text",
32 | "type": "range",
33 | "start": 20
34 | },
35 | "dropdown": {
36 | "label": "Dropdown",
37 | "type": "dropdown",
38 | "options": {
39 | "one": {
40 | "title": "One"
41 | },
42 | "two": {
43 | "title": "Two"
44 | }
45 | }
46 | }
47 | }
48 | }
--------------------------------------------------------------------------------
/blueprints/guide.json:
--------------------------------------------------------------------------------
1 | {
2 | "title": "Guide",
3 | "pages": false,
4 | "fields": {
5 | "title": {
6 | "label": "Title",
7 | "type": "text"
8 | },
9 | "tags": {
10 | "label": "Tags",
11 | "type": "tags",
12 | "width": "1/2"
13 | },
14 | "featured": {
15 | "label": "Featured",
16 | "type": "checkbox",
17 | "text": "Featured guide?",
18 | "width": "1/2"
19 | },
20 | "background": {
21 | "label": "Background Color",
22 | "type": "color",
23 | "width": "1/2"
24 | },
25 | "color": {
26 | "label": "Inverted",
27 | "true": "Is inverted",
28 | "false": "Is not inverted",
29 | "type": "checkbox",
30 | "width": "1/2"
31 | },
32 | "excerpt": {
33 | "label": "Excerpt",
34 | "type": "textarea"
35 | },
36 | "text": {
37 | "label": "Text",
38 | "type": "textarea"
39 | }
40 | }
41 | }
--------------------------------------------------------------------------------
/blueprints/guides.json:
--------------------------------------------------------------------------------
1 | {
2 | "title": "Guides",
3 | "pages": {
4 | "view": "guide"
5 | },
6 | "layout": {
7 | "all": {
8 | "fields": true,
9 | "width": "1/1"
10 | }
11 | },
12 | "fields": {
13 | "pages": {
14 | "label": "Pages",
15 | "type": "pages"
16 | },
17 | "title": {
18 | "label": "Title",
19 | "type": "text"
20 | }
21 | }
22 | }
--------------------------------------------------------------------------------
/blueprints/home.json:
--------------------------------------------------------------------------------
1 | {
2 | "title": "Home",
3 | "layout": {
4 | "all": {
5 | "fields": ["pages"],
6 | "width": "1/1"
7 | }
8 | },
9 | "fields": {
10 | "pages": {
11 | "label": "Pages",
12 | "type": "pages"
13 | }
14 | }
15 | }
--------------------------------------------------------------------------------
/blueprints/issue.json:
--------------------------------------------------------------------------------
1 | {
2 | "title": "Issue",
3 | "pages": false,
4 | "fields": {
5 | "title": {
6 | "label": "Title",
7 | "type": "text"
8 | },
9 | "date": {
10 | "label": "Date",
11 | "type": "date",
12 | "default": "today",
13 | "width": "1/2"
14 | },
15 | "tags": {
16 | "label": "Tags",
17 | "type": "tags",
18 | "width": "1/2"
19 | },
20 | "text": {
21 | "label": "Text",
22 | "type": "textarea"
23 | }
24 | }
25 | }
--------------------------------------------------------------------------------
/blueprints/issues.json:
--------------------------------------------------------------------------------
1 | {
2 | "title": "Tasks",
3 | "pages": {
4 | "view": "issue"
5 | },
6 | "files": false,
7 | "layout": {
8 | "pages": {
9 | "sticky": true,
10 | "width": "1/2",
11 | "fields": ["pages"]
12 | },
13 | "all": {
14 | "width": "1/2",
15 | "fields": true
16 | }
17 | },
18 | "fields": {
19 | "pages": {
20 | "label": "Pages",
21 | "type": "pages",
22 | "sort": "alphabetical",
23 | "limit": 20
24 | },
25 | "title": {
26 | "label": "Title",
27 | "type": "text"
28 | },
29 | "text": {
30 | "label": "Text",
31 | "type": "textarea"
32 | }
33 | }
34 | }
--------------------------------------------------------------------------------
/bundles/0.1.0/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/enokidotsite/panel/12b6d563f0c23ba9f42f9fb1a23e59cf7ea2c0fb/bundles/0.1.0/.gitkeep
--------------------------------------------------------------------------------
/bundles/bootstrap/bootstrap.css:
--------------------------------------------------------------------------------
1 | .bootstrap-load {
2 | box-sizing: border-box;
3 | border-radius: 50%;
4 | width: 30px;
5 | height: 30px;
6 | position: fixed;
7 | bottom: 20px;
8 | left: 20px;
9 | text-indent: -9999em;
10 | border-top: 3px solid #1a1a1a;
11 | border-right: 3px solid #1a1a1a;
12 | border-bottom: 3px solid #1a1a1a;
13 | border-left: 3px solid #fff;
14 | animation: bootstrap_load 1s infinite linear;
15 | }
16 |
17 | @keyframes bootstrap_load {
18 | 0% { transform: rotate(0deg) }
19 | 100% { transform: rotate(360deg) }
20 | }
21 |
--------------------------------------------------------------------------------
/bundles/bootstrap/bootstrap.js:
--------------------------------------------------------------------------------
1 | // start
2 | init()
3 |
4 | // TODO: panel versioning
5 | function init () {
6 | // var archiveActive = window.localStorage.getItem('active')
7 | // var localVersion = window.localStorage.getItem('version-' + archiveActive)
8 | var elHead = document.querySelector('head')
9 | var elScript = document.createElement('script')
10 | var elLink = document.createElement('link')
11 | // var version = localVersion
12 | // ? JSON.parse(localVersion)
13 | // : { selected: '0.1.0' }
14 | var version = { selected: '0.1.0' }
15 | var ran = Math.floor(Math.random() * 10000000)
16 |
17 | elScript.setAttribute('src', '/bundles/' + version.selected + '/bundle.js?' + ran)
18 | elLink.setAttribute('href', '/bundles/' + version.selected + '/bundle.css?' + ran)
19 | elLink.setAttribute('rel', 'stylesheet')
20 |
21 | elHead.appendChild(elScript)
22 | elHead.appendChild(elLink)
23 | }
24 |
--------------------------------------------------------------------------------
/content/community/index.txt:
--------------------------------------------------------------------------------
1 | title: Community
2 | ----
3 | view: community
4 | ----
5 | text: Coming soon
--------------------------------------------------------------------------------
/content/docs/fields/index.txt:
--------------------------------------------------------------------------------
1 | title: Fields
2 | ----
3 | view: fields
4 | ----
5 | text: An overview of the available fields.
6 | ----
7 | tags:
8 | - technopastoral
9 | - extra-statecraft
10 |
11 | ----
12 | checkbox: true
13 | ----
14 | color: #fffb00
15 | ----
16 | range: 70
--------------------------------------------------------------------------------
/content/docs/index.txt:
--------------------------------------------------------------------------------
1 | title: Docs
2 | ----
3 | view: docs
4 | ----
5 | text: ## Alpha Release
6 |
7 | You’re here early—everything is extremely unstable. Consider this a modestly functional sketch. A starting point with clear limitations, leaning on existing and familiar convention to form a foundation for spanning the gap between here and there.
8 |
9 | How do we save the future? With another CMS, of course.
10 |
11 | Hoping you find this immediately useful as a basic tool for creating experimental personal sites in the short term.
12 |
13 | If you have any questions please [see the FAQ](/#hub/faq), or feel free to send an email.
14 |
15 | ## Features
16 |
17 | - **no database**: there is only a filesystem
18 | - **data ownership**: your data remains with you
19 | - **offline accessible**: manage your site without a connection
20 | - **hackable**: create editable copies of the panel and sites to customize as you see fit
21 | - **extendable**: easily define custom fieldsets with blueprints
22 | - **free**: publish to the web for free without any intermediaries
23 | - **fun**: uses [Choo](https://choo.io) as a front-end framework
24 |
25 | ## Philosophy
26 |
27 | You are your data, your data is you. You should own your tools, your tools should not own you. Culture wants to be free. Platforms are dead. Universal knowledge for everyone.
28 |
29 | ## Getting Started
30 |
31 | Enoki is an ultralight set of tools for publishing on the decentralized web. Simply open [Beaker Browser](https://beakerbrowser.com) and navigate to [https://panel.enoki.site](https://panel.enoki.site).
32 |
33 | ## Sites
34 |
35 | Creating a site is as simple as navigating to **Sites** → **Create a New Site**. Choose a design, enter some basic information, and authorize Beaker to make an editable copy of the design. Your site is now loaded into Enoki and will remain accessible in the **Sites** area.
36 |
37 | Say you manually created an Archive with Beaker, or copied a site some other way. Simply click **Load an Existing Site** and select your Archive. Note that you must be the owner of the Archive, and it must contain a `/content` directory.
38 |
39 | ## Editor
40 |
41 | The **Editor** is where you make edits to your Site’s content.
42 |
43 | ### Pages
44 |
45 | To create a new page navigate to **Editor** → **Pages** → **Create**. When creating a page you’ll see a few options.
46 |
47 | - **Title** is self explanatory.
48 | - **Pathname** is the `/what-you-see-in-the-url`.
49 | - **View** defines how the content is displayed on your Site, and what fields you see in the Panel.
50 |
51 | ### Coming soon
52 |
53 | - Change page location after creation
54 | - Adjust view after creation
55 |
56 | ## Files
57 |
58 | Files are pretty dumb at the moment.
59 |
60 | ## Blueprints
61 |
62 | When viewing Pages and Files in the Panel you’re presented with a set of fields representing the content. What fields should appear are defined by creating **Blueprints**.
63 |
64 | For now, take a look at a blueprint associated with one of the Designs. It’s pretty self-explanatory.
65 |
66 | ## Customization and Development
67 |
68 | This version of Enoki is highly experimental! Certain things are going to change quite quickly, so please tread lightly.
69 |
70 | ### Front-end
71 |
72 | Enoki uses [Choo](https://choo.io) as a front-end framework. It’s like React, but fun. Copy the Panel or any Design, then navigate to `/source` and run `npm install` and `npm start`. Working to document this better, but should give you a starting point.
73 |
74 | ### Fields
75 |
76 | Fields are constructed using [`nanocomponent`](https://github.com/choojs/nanocomponent). For now, take a look at a simple field such as `text`. For a more advanced example which depends on a 3rd party library, look at `textarea`.
77 |
78 | ### Idiosyncrasies
79 |
80 | - Shit is messy right now, please watch your step.
81 | - When creating a View, be sure to add it to `/views/index.js`.
82 | - Also be sure to create a Blueprint so the correct fields appear in the Panel.
--------------------------------------------------------------------------------
/content/faq/index.txt:
--------------------------------------------------------------------------------
1 | title: FAQ
2 | ----
3 | view: faq
4 | ----
5 | text: ## Who is this for?
6 |
7 | Currently, for people who probably spend most of their time making websites to learn more about the peer-to-peer web. In the future? Hmm…
8 |
9 | ## What about access over HTTP?
10 |
11 | Yeah, this is important. For now, Enoki uses Beaker’s web API to read your site’s Dat archive into one big javascript object. This object loaded into Choo’s state.
12 |
13 | One way to do this is to write `state.content` to a JSON file saving from the Panel. Then, depending upon dat/http use the web API or request the JSON file. Actually, this happens now, it’s just not documented as there are interesting things which could be done by reading multiple archives into a site, and writing to static JSON prevents that from happening.
14 |
15 | Anyway, with that static JSON in place you can use a service like [Hashbase](https://hashbase.io) to persistently sync your app. Just copy the `dat://` url of your site to Hashbase. Alternatively, install [`dathttpd`](https://github.com/beakerbrowser/dathttpd) on your own server.
16 |
17 | ## What inspired this
18 |
19 | - Kirby
20 | - Teenage Engineering
21 | - etc
22 |
23 | ## This looks like a wireframe
24 |
25 | Yeah, it sort of is a functional wireframe—a representation of the expected basics for a CMS today. Consider it a starting point meant to progressively evolve into an interface for peer-to-peer publishing as we collectively develop the language.
26 |
27 | ## My Sites sometime dissapear
28 |
29 | This is because sites are currently using localstorage, which associates data with domain. If you load a site at `https://panel.enoki.site`, it will not appear in the Sites section when at `dat://panel.enoki.site`. This will be resolved in the future.
30 |
31 | ## Shouldn’t this output static HTML for pre-rendered routes?
32 |
33 | Yeah, this would be great. Found a few difficult questions about how to do this without cluttering up the content directory with a bunch of `index.html` files.
34 |
35 | ## How does pagination work?
36 |
37 | Enoki currently reads your entire `/content` directory into one big object. For smaller sites, this is fine. For larger sites, that can become an issue. For now, just manually fake paginate by converting an object of content into an array, then using array methods.
38 |
39 | ## What about image resizing?
40 |
41 | This will probably be handled with Canvas in the future. Nothing yet.
42 |
43 | ## I want _______________
44 |
45 | Yeah, chances are this has been thought about. Honestly, there are so many solid and mature CMS solutions that can output static sites. Just use one of those and publish the contents inside a Dat Archive if your’re looking for all the classic stuff. This project is looking to expand upon much more than just making sites.
--------------------------------------------------------------------------------
/content/guides/01-creating-your-first-site/image.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/content/guides/01-creating-your-first-site/index.txt:
--------------------------------------------------------------------------------
1 | title: Creating Your First Site (or not!)
2 | ----
3 | view: guide
4 | ----
5 | text: Enoki is currently an *experimental* CMS (content management system) for the peer-to-peer web. It’s intended for those familiar with making websites to gain exposure to the unique affordances of the peer-to-peer web.
6 |
7 | 1. Platforms should be free, and not treat attention as a resource to be extracted from users and sold to advertisers.
8 | 2. Users should own their data, and grant permission to platforms to read and write locally *by default*. Interfaces are simply *views* for data which exist with the user.
9 | 3. Data should be shared openly; the tools should be fungible. Anyone can create applications with instant access to all public data, avoiding limitations implimented by proprietary APIs.
10 | 4. Our tools should be ultralight and understandable, not heavy and complex!
11 |
12 | ## Creating a Site
13 |
14 | 1. Navigate to **Sites** and click *Create a New Site*
15 | 2. Enter your site’s Title, and a quick Description
16 | 3. Browse the design, and select one which looks right for you
17 | 4. Authorize Beaker to make an **editable copy** the design
18 | 5. Begin editing your content!
19 |
20 | You might be asking, what is an **editable copy**? Simply put, it’s creating your own unique copy of the site. Unlike other platforms, your site’s files exist on your computer! This means *you* own and control your site. There is no risk of your site dissapearing if Enoki ceases to exist.
21 |
22 | This is a *super critical thing*. Platforms today are designed to make you dependant upon them as a way to sell advertising. By giving you control over your own content and data, you are not bound to Enoki!
23 |
24 | ## Managing your Content
25 |
26 | You can manage your content in a few different ways.
27 |
28 | 1. With the Enoki Panel
29 | 2. By editing the files directly using whatever tool you’d like
30 | 3. Using any application which can read your content
31 |
32 | Unlike platforms, your data is human readable. Enoki just creates folders and text files! You can edit your site with any application which can edit text files. Not only that, you can easily use other applications (or create your own) to manage your site.
33 |
34 | This is possible because you own your content and data!
35 |
36 | ## Accessing Your Site
37 |
38 | You’ll notice that URLs look funny in Beaker. Remember torrents? You’ve probably downloaded music or movies this way. Beaker Browser is an experiment built on the entire internet working like that. You don’t have to pay any one for your site to appear online! This is *truely free*, and not dependant upon advertising.
39 |
40 | This is called peer-to-peer networking. When using a tool like SquareSpace, your site exists on a server they own. Anyone visiting your site must connect through SquareSpace. Now, imagine them instead connected directly to you, and not only that, but any one else who happens to be visiting your site. Crazy, right?!
41 |
42 | Because there is no central provider, like SquareSpace, someone (either you or someone else) must be providing your site for others to access it. Fortunately, you can simply enter your site’s `dat` URL somewhere like [Hashbase](https://hashbase.com) which ensure your site will always be accessible! Not only that, you can also access your site over `http` in a normal browser like Chrome or Firefox!
43 |
44 | You might be thinking, *Shit! This makes a lot of sense!* Yeah, it does! If not, don’t worry—it’s still early and the tools will get there.
45 |
46 | ## Cutomizing Your Site
47 |
48 | Enoki builds *real websites*. Not only do you get all the files for the site, you also get the entire source. You can take this source and choose to never use Enoki again, if you’d like. Remember; you are learning how to *actually program*, and not just use proprietary tools.
49 | ----
50 | excerpt: Ok, you’ve stumbled across Enoki. What are you getting yourself into? Let’s look at how is this different from existing platforms, and expand upon both the pros and cons. Is Enoki right for you? Maybe, but hopefully you can take the knowledge with you regardless of it’s a match.
51 | ----
52 | color: true
53 | ----
54 | featured: true
55 | ----
56 | tags:
57 | - beginner
58 |
59 | ----
60 | background: #045bc1
--------------------------------------------------------------------------------
/content/guides/02-customizing-your-site/image.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/content/guides/02-customizing-your-site/index.txt:
--------------------------------------------------------------------------------
1 | title: Customizing Your Sites
2 | ----
3 | view: guide
4 | ----
5 | excerpt: Unlike other platforms, which provide interfaces to enter data into centralized databases and render that data with proprietary source, Enoki generates actual websites! When creating a site, you are given the actual source code for the site, providing infinite customization possibility.
6 | ----
7 | text: Unlike other platforms, which provide interfaces to enter data into centralized databases and render that data with proprietary source, Enoki generates actual websites! When creating a site, you are given the actual source code for the site, providing infinite customization possibility.
8 |
9 | Not a developer? Don’t worry, creating lessons and guides on how to start learning is one of the top priorities. In the meantime please feel free to poke around!
10 |
11 | ## Installation
12 |
13 | 1. Open the `source` directory of your site in terminal
14 | 2. Run `npm install`
15 | 3. Run `npm start` to watch files during development
16 | 4. Run `npm build` to bundle for production
17 |
18 | ## Development and Dependencies
19 |
20 | Because there is no difference between server and client on the peer-to-peer web, everything is client-side. In practice, this feels like the conveniences of an API like Firebase’s, but native to the browser and data is saved locally to static files.
21 |
22 | Enoki has some preferences in default tooling, but everything is swappable. The most notable is [Choo](https://choo.io), the cutest little front-end framework around. Think of it as React or Vue, but without the fluff. The main critisism of Choo is once you try it you wish everything else was like it :)
23 |
24 | Instead of using Webpack, we opt for Browserify to bundle builds. Eventually you won’t need to bundle anything, but for now we find Browserify to be the most focused and calm. If you don’t feel, free to swap for whatever you’d like and use an Enoki Adapter to load the content object.
25 |
26 | And of course, each design has it’s own Git repository, which you can use to pull in updates of the core design as they are made. Feel free to open issues and make pull requests, too!
27 |
28 | ## Resources
29 |
30 | Because Enoki sites are real sites, the entire history of books, videos and tutorials as they relate to the internet at large are relevant in customizing your Enoki site.
31 |
32 | ### Choo
33 |
34 | A great place to start is the [Choo](https://choo.io) homepage. There you’ll find a great overview of the core principles Choo represents. There is also the Choo handbook, which guides you through creating an app. The line between websites and apps is increasingly being blurred; play around with it.
35 |
36 | ### The peer-to-peer web
37 |
38 | The community around Enoki has helped create the Peer-to-Peer Web event series. These are days dedicated to faciliating converations and workshops about peer-to-peer web, focusing on the importance of data ownership, archival, and accessibility.
39 |
40 | Instead of focusing on this through the lens of technology, anyone doing anything involving creative thinking is invited to learn how the peer-to-peer web can be incorperated into their practice.
41 |
42 | Documentation is available through the [web site](https://peer-to-peer-web.com) with more events planned for the future.
43 | ----
44 | color: true
45 | ----
46 | featured:
47 | ----
48 | tags:
49 | - beginner
50 |
51 | ----
52 | background: #00917b
--------------------------------------------------------------------------------
/content/guides/03-creating-pages/image.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/content/guides/03-creating-pages/index.txt:
--------------------------------------------------------------------------------
1 | title: Creating Custom Pages
2 | ----
3 | view: guide
4 | ----
5 | tags:
6 | - beginner
7 |
8 | ----
9 | color: true
10 | ----
11 | featured: false
12 | ----
13 | excerpt: Creating websites can be fun! Updating websites can be a major drag. Like, a really major drag. Enoki is interested in trying to solve these issues around *updating websites* as a foundation for creating fresh and exciting ways of *creating websites*.
14 | ----
15 | text: Creating websites can be fun! Updating websites can be a major drag. Like, a really major drag. Enoki is interested in solving these issues around *updating websites* as a foundation for exploring exciting new ways of *creating websites*. There are a few primary interfaces for managing websites these days.
16 |
17 | 1. Through a maze of fields for data entry.
18 | 2. With a WYSIWYG (what you see is what you get)
19 | 3. Some sort of broken thing between those two.
20 |
21 | If you’ve ever used one of these WYSIWYG solutions to create a client site, you’ll know the dangers of handing over the keys.
22 |
23 | Let’s take that third option and make it *significantly* less broken, and get there by first implimenting the pro functionality you’d expect in a (capital letters) CMS solution centered around fieldsets.
24 |
25 | Of course, this is all a little boring now, but intended to create a truly robust foundation for building the next generation of interfaces for connecting and sharing both online *and offline*—and have fun while doing it.
26 |
27 | ## Views
28 |
29 | When creating a new Page in the Panel you select a *view*. For instance, there could be `blog` or `about` views. When visiting your site, this let’s you say, “I’d like my about page to be formatted a certain way.” Inside the Panel, this let’s you say, “I’d like to see certain fields to let me easily input exactly the type of content I want on my about page.”
30 |
31 | This sort of specificity ensures your page doesn’t get super messy when updating content, as each type of content is defined seperately. This same cleanliness clearly implies a limitation in the *mesiness*, arguably the most critical part of any creative endevour. For now, this mesiness takes place during the creative process of determining what the site *should be*, not in when you are trying to simply update it. These lines are blurry, but for now let’s go with that.
32 |
33 | ## Pages
34 |
35 | The interface of the *editor* in the Panel is always the same; a set of fields representing the data associated with that page. We define what sort of data is associated with a page by creating a *blueprint* located in `/blueprints`.
36 |
37 | There are all sorts of options associated with blueprints, but these guides are being written hastily as there is a lot to do, and this will be expanded on in the future!
38 |
39 | For now, just look around the example designs `/blueprints` directories to see what’s up. As an example, here is the default blueprint:
40 |
41 | ```
42 | {
43 | "title": "Default",
44 | "fields": {
45 | "title": {
46 | "label": "Title",
47 | "type": "text"
48 | },
49 | "text": {
50 | "label": "Text",
51 | "type": "textarea"
52 | }
53 | }
54 | }
55 | ```
56 |
57 | ## Getting messy
58 |
59 | As mentioned above, this somewhat strict field-based composition is a near-term strategy for creating a truly flexible future for Enoki. Certain sites feature inline-editable interface only visible to the site’s owner. This is endearingly called `self-mutation`, and will be rolling out in surprising ways across various designs soon!
60 | ----
61 | background: #f21006
--------------------------------------------------------------------------------
/content/guides/04-how-to-leave-enoki/image.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/content/guides/04-how-to-leave-enoki/index.txt:
--------------------------------------------------------------------------------
1 | title: How to Leave Enoki
2 | ----
3 | view: guide
4 | ----
5 | tags:
6 | - beginner
7 |
8 | ----
9 | color: false
10 | ----
11 | featured: false
12 | ----
13 | excerpt: Technology moves fast. Enoki knows it won’t always be the best tool for you. Rest easy knowing that you own your data and content. It exists on your computer, and not only on a server owned by a platform.
14 | ----
15 | text: Technology moves fast. Enoki won’t always be the best tool for you. Rest easy knowing that you own your data and content. It exists on your computer, and not only on a server owned by a platform.
16 |
17 | There is no option for exporting your content from Enoki because it already exists with you; there is nothing to export from.
18 |
19 | Simply, the Enoki Panel creates files in folders on your local machine instead of jumbled data in a database somewhere. Not only this, the methods for reading and writing these files have been abstracted out into discreet open source javascript modules ready for developers to integrate into any other open tool.
20 |
21 | Those modules are:
22 |
23 | - [**Smarkt**](https://github.com/jondashkyle/smarkt) for reading `.txt` files with `keys: and values` seperated by `----`.
24 | - [**Hypha**](https://github.com/jondashkyle/hypha) for creating flat JSON out of those files and the folders they’re contained within.
25 | - [**Enoki**](https://github.com/jondashkyle/enoki) for reading and writing Enoki formatted sites.
26 |
27 | It’s hoped that these modules will be useful to anyone who wants to create their own tools!
28 | ----
29 | background: #fbc200
--------------------------------------------------------------------------------
/content/guides/05-starting-from-scratch/image.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/content/guides/05-starting-from-scratch/index.txt:
--------------------------------------------------------------------------------
1 | title: Starting From Scratch
2 | ----
3 | view: guide
4 | ----
5 | background: #5a2da8
6 | ----
7 | visible: false
8 | ----
9 | color: true
10 | ----
11 | excerpt: Nam elementum augue eu lacus sagittis, eu gravida ligula porta. Vivamus et tincidunt ipsum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean molestie mollis arcu nec sodales. Suspendisse ac lacus turpis. Etiam vulputate ligula at erat laoreet, vel fermentum tortor convallis. Fusce nec accumsan purus. Sed ac mi pharetra, vulputate augue nec, pharetra nibh.
12 | ----
13 | text: Interdum et malesuada fames ac ante ipsum primis in faucibus. Nulla congue volutpat lectus. Etiam vehicula convallis eros. Quisque semper venenatis risus. Morbi fermentum, est id commodo venenatis, dui ante pulvinar arcu, a tempus enim arcu id augue. Sed convallis ac velit sed interdum. Nam nec ante rhoncus sapien cursus dignissim eu vel arcu.
14 |
15 | Aliquam quis magna felis. Sed ac magna dolor. Nunc nunc augue, tempus at eros tristique, convallis eleifend quam. Nam eget elementum quam. Nunc consequat, risus sit amet tincidunt malesuada, est nibh condimentum leo, quis laoreet velit tortor et lorem. Proin vitae sem urna. Proin pharetra justo mi, et volutpat urna hendrerit ac. Fusce volutpat ex ut nunc hendrerit, a placerat justo sollicitudin. Vestibulum sagittis justo ut nisi venenatis tincidunt porttitor nec dolor. Maecenas dui felis, efficitur a nibh vitae, tristique accumsan augue.
16 |
17 | ## Suspendisse varius
18 |
19 | Nisl in sem lobortis, quis consectetur dui pharetra. In a dui vel dui scelerisque egestas. Curabitur rutrum enim metus, eget facilisis sem sagittis eget. Praesent interdum sem ullamcorper elementum ultrices. Nulla sit amet maximus dui, quis venenatis neque. Fusce dignissim porttitor efficitur. Nulla malesuada eleifend elementum. Nam malesuada consequat ex id ultricies.
20 |
21 | Sed posuere consectetur ipsum, id dapibus orci fringilla at. Aliquam placerat et eros sed efficitur. Ut sapien diam, auctor sed lectus nec, sodales molestie turpis. Sed volutpat odio vel purus ultricies luctus. Fusce placerat, turpis non cursus rhoncus, massa eros lobortis diam, et malesuada mi purus bibendum ante. Vestibulum at tellus nulla. Praesent dolor mi, mollis sed felis ac, mollis porta magna. Morbi interdum imperdiet ex et ultrices. Curabitur luctus pharetra nunc, eget consequat risus vehicula at. Aenean finibus augue orci, ut scelerisque urna fringilla quis. Phasellus rutrum luctus enim eu tincidunt. Phasellus sagittis turpis eget ligula dignissim sodales. Nulla rutrum, neque sed eleifend efficitur, tellus elit fringilla augue, ut elementum ex magna sit amet est. Etiam eget est sed purus lobortis eleifend eu non dolor.
--------------------------------------------------------------------------------
/content/guides/drafts.txt:
--------------------------------------------------------------------------------
1 | # Creating Your First Site (or not!)
2 |
3 | ## Overview
4 |
5 | - What is Enoki?
6 | - Create a new site
7 | - Enter your title and description
8 | - Select a design (more coming soon)
9 | - Click “Fork”
10 | - Explain what forking is and data ownership
11 | - Talk about content editing
12 | - Lead into customization
13 |
14 | # Customizing Your Sites
15 |
16 | - How Enoki exposes the real tools to you
17 | - What tooling looks like today
18 | - Introduction to Choo
--------------------------------------------------------------------------------
/content/guides/index.txt:
--------------------------------------------------------------------------------
1 | title: Guides
2 | ----
3 | view: guides
4 | ----
5 | text:
6 |
7 | Working on this :)
--------------------------------------------------------------------------------
/content/index.txt:
--------------------------------------------------------------------------------
1 | title: Hub
2 | ----
3 | view: home
4 | ----
5 | text:
--------------------------------------------------------------------------------
/content/issues/cleanup-codebase/index.txt:
--------------------------------------------------------------------------------
1 | title: Cleanup codebase
2 | ----
3 | view: issue
4 | ----
5 | text: Gotta refactor a little bit, it’s getting messy in here.
6 |
7 | ## Structure
8 |
9 | - [ ] Try to make the DOM as representational as possible.
10 | - [ ] Support imports/require/window
11 | - [ ] Create a bundle.js which exposes over window
12 | - [ ] Create a super simple demo using no build system
13 |
14 | ## Styles
15 |
16 | - [ ] Switch from gr8 for layout to CSS grid/variables.
17 | - [ ] Create `.copy` styles for dark/light
18 | - [ ] Simple `sheetify` css-in-js for most things.
19 | ----
20 | tags:
21 | - todo
22 | ----
23 | date: 2018-03-05
24 | ----
25 | visible: true
--------------------------------------------------------------------------------
/content/issues/designs/index.txt:
--------------------------------------------------------------------------------
1 | title: Designs
2 | ----
3 | view: issue
4 | ----
5 | tags:
6 | - 1.0.0
7 | - todo
8 |
9 | ----
10 | text: Create some fresh designs.
11 |
12 | ## Todo
13 |
14 | - [ ] Update dependencies before release
15 | - [ ] Load design info from an array of `dat://` urls
16 | - [ ] Readme / info
17 | - [ ] Compare package.json of the site to the design
18 |
19 | ## Things to keep in mind
20 |
21 | - Super simple document / plain CSS
22 |
23 | ## Streamer
24 |
25 | - [ ] A design for streams
26 | - [ ] Vlog style?
27 |
28 | ## Ripple
29 |
30 | - SVG warping sort of thing, text input to outlined shapes
31 | ----
32 | date: 2018-03-05
33 | ----
34 | visible: true
--------------------------------------------------------------------------------
/content/issues/fields/index.txt:
--------------------------------------------------------------------------------
1 | title: Fields
2 | ----
3 | view: issue
4 | ----
5 | text: ## Cleanup
6 |
7 | - [ ] Create `form` and `field` components
8 | - [ ] Pass full state, emit, and options to `form`
9 | - [ ] Use the `enoki/page` api for most things
10 | - [ ] Autoscroll textarea when at bottom
11 | - [ ] Add html5 validation
12 |
13 | ## New fields
14 |
15 | - [ ] Universal `list` which can display pages or files based on option. Include delete, etc.
16 | - [ ] Radio selector
17 | - [ ] Structured data
18 | - [ ] Font (copy font files to site?)
19 | ----
20 | tags:
21 | - 1.0.0
22 | - todo
23 |
24 | ----
25 | date: 2018-03-05
26 | ----
27 | visible: true
--------------------------------------------------------------------------------
/content/issues/files/index.txt:
--------------------------------------------------------------------------------
1 | title: Files
2 | ----
3 | view: issue
4 | ----
5 | tags:
6 | - todo
7 | - 1.0.1
8 | ----
9 | text: ## Todo
10 |
11 | - [ ] Meta data support (api/panel)
12 | - [x] Video preview
13 | - [x] Audio preview
14 | - [ ] Image zooming
15 | ----
16 | date: 2018-03-05
17 | ----
18 | visible: true
--------------------------------------------------------------------------------
/content/issues/hub/index.txt:
--------------------------------------------------------------------------------
1 | title: Hub
2 | ----
3 | view: issue
4 | ----
5 | tags:
6 | - todo
7 |
8 | ----
9 | text: The hub contains the Network, Guides, Docs, and Log.
10 |
11 | - [ ] Sticky header (scroll)
12 | - [ ] Network coming soon splash
13 | ----
14 | date: 2018-03-05
15 | ----
16 | visible: true
--------------------------------------------------------------------------------
/content/issues/index.txt:
--------------------------------------------------------------------------------
1 | title: Issues
2 | ----
3 | view: issues
4 | ----
5 | text: ## Contributing
6 |
7 | Feel free to fork the panel repository, create whatever changes you’d like by following the pattern here (or using the panel itself to manage issues), then creating a pull request. Wanting to consolidate things outside of Github Issues to make things offline accessibile.
--------------------------------------------------------------------------------
/content/issues/inline-editing/index.txt:
--------------------------------------------------------------------------------
1 | title: Inline editing
2 | ----
3 | view: issue
4 | ----
5 | tags:
6 | - idea
7 |
8 | ----
9 | text: Explore implimentation of inline-editing in a design.
10 |
11 | - Web API `isOwner` to enable `contenteditable`
12 | ----
13 | date: 2018-03-05
14 | ----
15 | visible: true
--------------------------------------------------------------------------------
/content/issues/library/index.txt:
--------------------------------------------------------------------------------
1 | title: Library
2 | ----
3 | view: issue
4 | ----
5 | text: Need to clean up some of the boundaries between things.
6 |
7 | - [ ] Localization support
8 |
9 | ----
10 | tags:
11 | - todo
12 |
13 | ----
14 | date: 2018-03-05
15 | ----
16 | visible: true
--------------------------------------------------------------------------------
/content/issues/page-functionality/index.txt:
--------------------------------------------------------------------------------
1 | title: Page functionality
2 | ----
3 | view: issue
4 | ----
5 | text: Need to improve some management issues with Pages.
6 |
7 | - [ ] If no `view` key is available, fallback to parent page blueprint’s setting
8 | - [x] Field for `hidden` toggle
9 | - [x] Field for adjusting `view` in Settings.
10 | - [x] Field for adjusting `pathname` in Settings.
11 | ----
12 | tags:
13 | - todo
14 |
15 | ----
16 | date: 2018-03-05
17 | ----
18 | visible: true
--------------------------------------------------------------------------------
/content/issues/panel-layouts/index.txt:
--------------------------------------------------------------------------------
1 | title: Panel layouts
2 | ----
3 | view: issue
4 | ----
5 | text: Fields will be both **input** and **display**. An example of an input field is `text` and `textarea`. An an example of a display field is `pages` or `files` in the existing sidebar.
6 |
7 | Nothing is needed to make display fields possible, however it should be possible to not only place custom fields in the sidebar, but be able to define custom columns an layouts from within blueprints.
8 |
9 | For instance:
10 |
11 | ```
12 | {
13 | "title": "hi",
14 | "layout": {
15 | "navigation": {
16 | "fields": ['pages', 'files'],
17 | "width": "1/3"
18 | },
19 | "fieldset": {
20 | "fields": ['title', 'text'],
21 | "width": "2/3"
22 | }
23 | },
24 | "fields": {
25 | "pages": {
26 | "type": "pages"
27 | },
28 | "files": {
29 | "type": "files"
30 | },
31 | "title": {
32 | "label": "Title",
33 | "type": "text"
34 | },
35 | "text": {
36 | "label": "Text",
37 | "type": "textarea"
38 | }
39 | }
40 | }
41 | ```
42 |
43 | ## Features
44 |
45 | - `sticky` option for columns to replicate sidebar functionality
46 | ----
47 | tags:
48 | - todo
49 |
50 | ----
51 | date: 2018-03-05
52 | ----
53 | visible: false
--------------------------------------------------------------------------------
/content/issues/saving/index.txt:
--------------------------------------------------------------------------------
1 | title: Saving
2 | ----
3 | view: issue
4 | ----
5 | tags:
6 | - 0.1.1
7 | - todo
8 |
9 | ----
10 | text: ### Quick ones
11 |
12 | - [ ] Local storage for changes?
13 | - [ ] Saving title change saves to index.html, too
14 | - [ ] Meta tags in index.html
15 | - [ ] How to speed things up (reload all state)
16 | ----
17 | date: 2018-03-05
18 | ----
19 | visible: true
--------------------------------------------------------------------------------
/content/issues/sites/index.txt:
--------------------------------------------------------------------------------
1 | title: Sites
2 | ----
3 | view: issue
4 | ----
5 | tags:
6 | - todo
7 | - 1.0.1
8 |
9 | ----
10 | text: ## Todo
11 |
12 | - [x] Settings → Remove
13 | - [ ] Settings → HTTP fallback
14 | - [ ] Reordering
15 | - [ ] Persist across domains (ditch localstorage?)
16 | - [ ] Store references to designs inside of `/content` instead of the `designs.js` plugin
17 |
18 | ## Ideas
19 |
20 | - Some sort of p2p stats, such as how many peers, etc…
21 | - A simple way of deploying to a service like Hashbase
22 | ----
23 | date: 2018-03-05
24 | ----
25 | visible: true
--------------------------------------------------------------------------------
/content/log/index.txt:
--------------------------------------------------------------------------------
1 | title: Log
2 | ----
3 | view: log
4 | ----
5 | text: ## 0.1.0
6 |
7 | This is the first release of Enoki to run in Beaker following the Alpha period. Too many changes to list, but a quick summarization follows.
8 |
9 | ### Fields
10 |
11 | - Added display fields (pages/files)
12 | - New checkbox field
13 | - New color field
14 | - New range field
15 | - Simplified how data is passed to fields from fieldsets
16 |
17 | ### Interface
18 |
19 | - Added `layouts` to blueprints, enabling positioning of fields
20 | - Added support for selecting a design when creating a site
21 | - Created the **Guides** section in Hub
22 | - Modularized navigational elements into composable wrappers
23 |
24 | ### Designs
25 |
26 | - Cleaned up the existing Enoki Starterkit design
27 | - Created the new **System** design, the most basic functional design
28 |
29 | ### Functionality
30 |
31 | - Created the `smarkt` module for reading files
32 | - Created the `hypha` modules for reading folders
33 | - Updated the `enoki` module with these new dependencies
34 | - Added async/promises to the API for easy use with Beaker’s Web Api
35 | - Implimented early HTTP support with `content.json` fallback
--------------------------------------------------------------------------------
/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/enokidotsite/panel/12b6d563f0c23ba9f42f9fb1a23e59cf7ea2c0fb/favicon.ico
--------------------------------------------------------------------------------
/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/enokidotsite/panel/12b6d563f0c23ba9f42f9fb1a23e59cf7ea2c0fb/favicon.png
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |