Skip to content

Repository files navigation

example workflow

box

Client-server stack for Web3

Intro blog

Flagship App: Photos

client-server resemblance

box server demo

Motivation

There are currently two ways to interact with Web3 storage solutions:

  1. Through a pinning service and a gateway: the advantage is that files are served through URLs, an app can then access the files with conventional methods, e.g. simply putting a picture in <img src="gateway.example.com/Qm...">. The disadvantage is that there is a subscription payment associated with pinning services. Also this is not really decentralized!
  2. Turn the device to a full IPFS node: this model works beautifully in Brave desktop browser as an example, and makes sense for laptop and PC since they normally have large HDDs. It's much harder on mobile devices, however, biggest hurdle is to have Apple on board with the idea of relaxing file system access in iOS! Even if all goes well, a mobile device is NOT a good candidate for hosting the future Web! They get lost easily and are resource constrained (battery, memory).

box aims to address these issues by creating a third alternative: Personal Server

A personal server is a commodity hardware (PC, Raspberry Pi, etc.) that's kept at home vs. in pocket. It helps with actual decentralization, also saves money since people pay once for HDDs and own them forever, no monthly charge! From privacy perspective, it guarantees that data doesn't leave the premise unless user specifically wants to (e.g. sharing).

To achieve this, we are developing protocols to accommodate client-server programming with minimal effort on developer's side:

  • File Protocol: Send and receive files in a browser or an app (stage: prototype)
  • Data Protocol: Database interface over at client-side; facilitates describing linked JSON documents and having them saved/retrieved (stage: design draft)
  • AI Protocol: Map-Reduce stack for distributed processing (stage: ideation)

Architecture

box architecture

An app talks with the server(s) by invoking APIs from @functionland/fula library. The Fula library abstracts away the protocols and libp2p connection, instead exposes APIs similar to MongoDB for data persistence and S3 for file storage.

On the server side, data or file will be saved on a private IPFS instance. There is also a public IPFS instance which comes to play in sharing: when the end user requests to share some data, an encrypted copy will be saved on the public IPFS network, anyone with whom the key has been shared can access the data.

The box stack can provide backup guarantees by having the data pinned on multiple servers owned by the user. However, in cases that the user needs absolute assurance on data longevity, e.g. password records in a password manager app or scans of sensitive documents, the encrypted data can be sent over at Filecoin blockchain.

Packages

NameDescription
protocolsLibp2p protocols for the box stack
serverReference server implementation in Node.js
fulaClient library for using the protocols from browser
rn-fulaClient library ported for react native

Examples

NameDescription
reactExample of using fula client and box server
react-nativeExample of using fula client in react-native and box server

Development

To get started in development with this monorepo use the following steps.

Prerequisites

Local development on host OS

  1. Install & Build deps
 $ rush update && rush build
  1. Run box app.
 $ cd apps/box && rushx start
  1. Run demo apps
 $ cd examples/react-cra && rushx start
$ cd examples/react-do-app && rushx start

Local development in docker container

 $ docker-compose -f docker-compose.dev.yaml up

Run the demo apps

Open a browser and navigate to http://localhost:3000 and http://localhost:3001

License

MIT

Related Publications and News

About

Client-server stack for Web3! Turn your Raspberry Pi to a BAS server in minutes and enjoy the freedom of decentralized Web with a superior user experience!

Topics

Resources

Stars

6 stars

Watchers

6 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - functionland/box: Client-server stack for Web3! Turn your Raspberry Pi to a BAS server in minutes and enjoy the freedom of decentralized Web with a superior user experience! · GitHub
Skip to content

Repository files navigation

example workflow

box

Client-server stack for Web3

Intro blog

Flagship App: Photos

client-server resemblance

box server demo

Motivation

There are currently two ways to interact with Web3 storage solutions:

  1. Through a pinning service and a gateway: the advantage is that files are served through URLs, an app can then access the files with conventional methods, e.g. simply putting a picture in <img src="gateway.example.com/Qm...">. The disadvantage is that there is a subscription payment associated with pinning services. Also this is not really decentralized!
  2. Turn the device to a full IPFS node: this model works beautifully in Brave desktop browser as an example, and makes sense for laptop and PC since they normally have large HDDs. It's much harder on mobile devices, however, biggest hurdle is to have Apple on board with the idea of relaxing file system access in iOS! Even if all goes well, a mobile device is NOT a good candidate for hosting the future Web! They get lost easily and are resource constrained (battery, memory).

box aims to address these issues by creating a third alternative: Personal Server

A personal server is a commodity hardware (PC, Raspberry Pi, etc.) that's kept at home vs. in pocket. It helps with actual decentralization, also saves money since people pay once for HDDs and own them forever, no monthly charge! From privacy perspective, it guarantees that data doesn't leave the premise unless user specifically wants to (e.g. sharing).

To achieve this, we are developing protocols to accommodate client-server programming with minimal effort on developer's side:

  • File Protocol: Send and receive files in a browser or an app (stage: prototype)
  • Data Protocol: Database interface over at client-side; facilitates describing linked JSON documents and having them saved/retrieved (stage: design draft)
  • AI Protocol: Map-Reduce stack for distributed processing (stage: ideation)

Architecture

box architecture

An app talks with the server(s) by invoking APIs from @functionland/fula library. The Fula library abstracts away the protocols and libp2p connection, instead exposes APIs similar to MongoDB for data persistence and S3 for file storage.

On the server side, data or file will be saved on a private IPFS instance. There is also a public IPFS instance which comes to play in sharing: when the end user requests to share some data, an encrypted copy will be saved on the public IPFS network, anyone with whom the key has been shared can access the data.

The box stack can provide backup guarantees by having the data pinned on multiple servers owned by the user. However, in cases that the user needs absolute assurance on data longevity, e.g. password records in a password manager app or scans of sensitive documents, the encrypted data can be sent over at Filecoin blockchain.

Packages

NameDescription
protocolsLibp2p protocols for the box stack
serverReference server implementation in Node.js
fulaClient library for using the protocols from browser
rn-fulaClient library ported for react native

Examples

NameDescription
reactExample of using fula client and box server
react-nativeExample of using fula client in react-native and box server

Development

To get started in development with this monorepo use the following steps.

Prerequisites

Local development on host OS

  1. Install & Build deps
 $ rush update && rush build
  1. Run box app.
 $ cd apps/box && rushx start
  1. Run demo apps
 $ cd examples/react-cra && rushx start
$ cd examples/react-do-app && rushx start

Local development in docker container

 $ docker-compose -f docker-compose.dev.yaml up

Run the demo apps

Open a browser and navigate to http://localhost:3000 and http://localhost:3001

License

MIT

Related Publications and News

About

Client-server stack for Web3! Turn your Raspberry Pi to a BAS server in minutes and enjoy the freedom of decentralized Web with a superior user experience!

Topics

Resources

Stars

6 stars

Watchers

6 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - functionland/box: Client-server stack for Web3! Turn your Raspberry Pi to a BAS server in minutes and enjoy the freedom of decentralized Web with a superior user experience! · GitHub
Skip to content

Repository files navigation

example workflow

box

Client-server stack for Web3

Intro blog

Flagship App: Photos

client-server resemblance

box server demo

Motivation

There are currently two ways to interact with Web3 storage solutions:

  1. Through a pinning service and a gateway: the advantage is that files are served through URLs, an app can then access the files with conventional methods, e.g. simply putting a picture in <img src="gateway.example.com/Qm...">. The disadvantage is that there is a subscription payment associated with pinning services. Also this is not really decentralized!
  2. Turn the device to a full IPFS node: this model works beautifully in Brave desktop browser as an example, and makes sense for laptop and PC since they normally have large HDDs. It's much harder on mobile devices, however, biggest hurdle is to have Apple on board with the idea of relaxing file system access in iOS! Even if all goes well, a mobile device is NOT a good candidate for hosting the future Web! They get lost easily and are resource constrained (battery, memory).

box aims to address these issues by creating a third alternative: Personal Server

A personal server is a commodity hardware (PC, Raspberry Pi, etc.) that's kept at home vs. in pocket. It helps with actual decentralization, also saves money since people pay once for HDDs and own them forever, no monthly charge! From privacy perspective, it guarantees that data doesn't leave the premise unless user specifically wants to (e.g. sharing).

To achieve this, we are developing protocols to accommodate client-server programming with minimal effort on developer's side:

  • File Protocol: Send and receive files in a browser or an app (stage: prototype)
  • Data Protocol: Database interface over at client-side; facilitates describing linked JSON documents and having them saved/retrieved (stage: design draft)
  • AI Protocol: Map-Reduce stack for distributed processing (stage: ideation)

Architecture

box architecture

An app talks with the server(s) by invoking APIs from @functionland/fula library. The Fula library abstracts away the protocols and libp2p connection, instead exposes APIs similar to MongoDB for data persistence and S3 for file storage.

On the server side, data or file will be saved on a private IPFS instance. There is also a public IPFS instance which comes to play in sharing: when the end user requests to share some data, an encrypted copy will be saved on the public IPFS network, anyone with whom the key has been shared can access the data.

The box stack can provide backup guarantees by having the data pinned on multiple servers owned by the user. However, in cases that the user needs absolute assurance on data longevity, e.g. password records in a password manager app or scans of sensitive documents, the encrypted data can be sent over at Filecoin blockchain.

Packages

NameDescription
protocolsLibp2p protocols for the box stack
serverReference server implementation in Node.js
fulaClient library for using the protocols from browser
rn-fulaClient library ported for react native

Examples

NameDescription
reactExample of using fula client and box server
react-nativeExample of using fula client in react-native and box server

Development

To get started in development with this monorepo use the following steps.

Prerequisites

Local development on host OS

  1. Install & Build deps
 $ rush update && rush build
  1. Run box app.
 $ cd apps/box && rushx start
  1. Run demo apps
 $ cd examples/react-cra && rushx start
$ cd examples/react-do-app && rushx start

Local development in docker container

 $ docker-compose -f docker-compose.dev.yaml up

Run the demo apps

Open a browser and navigate to http://localhost:3000 and http://localhost:3001

License

MIT

Related Publications and News

About

Client-server stack for Web3! Turn your Raspberry Pi to a BAS server in minutes and enjoy the freedom of decentralized Web with a superior user experience!

Topics

Resources

Stars

6 stars

Watchers

6 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - functionland/box: Client-server stack for Web3! Turn your Raspberry Pi to a BAS server in minutes and enjoy the freedom of decentralized Web with a superior user experience! · GitHub
Skip to content

Repository files navigation

example workflow

box

Client-server stack for Web3

Intro blog

Flagship App: Photos

client-server resemblance

box server demo

Motivation

There are currently two ways to interact with Web3 storage solutions:

  1. Through a pinning service and a gateway: the advantage is that files are served through URLs, an app can then access the files with conventional methods, e.g. simply putting a picture in <img src="gateway.example.com/Qm...">. The disadvantage is that there is a subscription payment associated with pinning services. Also this is not really decentralized!
  2. Turn the device to a full IPFS node: this model works beautifully in Brave desktop browser as an example, and makes sense for laptop and PC since they normally have large HDDs. It's much harder on mobile devices, however, biggest hurdle is to have Apple on board with the idea of relaxing file system access in iOS! Even if all goes well, a mobile device is NOT a good candidate for hosting the future Web! They get lost easily and are resource constrained (battery, memory).

box aims to address these issues by creating a third alternative: Personal Server

A personal server is a commodity hardware (PC, Raspberry Pi, etc.) that's kept at home vs. in pocket. It helps with actual decentralization, also saves money since people pay once for HDDs and own them forever, no monthly charge! From privacy perspective, it guarantees that data doesn't leave the premise unless user specifically wants to (e.g. sharing).

To achieve this, we are developing protocols to accommodate client-server programming with minimal effort on developer's side:

  • File Protocol: Send and receive files in a browser or an app (stage: prototype)
  • Data Protocol: Database interface over at client-side; facilitates describing linked JSON documents and having them saved/retrieved (stage: design draft)
  • AI Protocol: Map-Reduce stack for distributed processing (stage: ideation)

Architecture

box architecture

An app talks with the server(s) by invoking APIs from @functionland/fula library. The Fula library abstracts away the protocols and libp2p connection, instead exposes APIs similar to MongoDB for data persistence and S3 for file storage.

On the server side, data or file will be saved on a private IPFS instance. There is also a public IPFS instance which comes to play in sharing: when the end user requests to share some data, an encrypted copy will be saved on the public IPFS network, anyone with whom the key has been shared can access the data.

The box stack can provide backup guarantees by having the data pinned on multiple servers owned by the user. However, in cases that the user needs absolute assurance on data longevity, e.g. password records in a password manager app or scans of sensitive documents, the encrypted data can be sent over at Filecoin blockchain.

Packages

NameDescription
protocolsLibp2p protocols for the box stack
serverReference server implementation in Node.js
fulaClient library for using the protocols from browser
rn-fulaClient library ported for react native

Examples

NameDescription
reactExample of using fula client and box server
react-nativeExample of using fula client in react-native and box server

Development

To get started in development with this monorepo use the following steps.

Prerequisites

Local development on host OS

  1. Install & Build deps
 $ rush update && rush build
  1. Run box app.
 $ cd apps/box && rushx start
  1. Run demo apps
 $ cd examples/react-cra && rushx start
$ cd examples/react-do-app && rushx start

Local development in docker container

 $ docker-compose -f docker-compose.dev.yaml up

Run the demo apps

Open a browser and navigate to http://localhost:3000 and http://localhost:3001

License

MIT

Related Publications and News

About

Client-server stack for Web3! Turn your Raspberry Pi to a BAS server in minutes and enjoy the freedom of decentralized Web with a superior user experience!

Topics

Resources

Stars

6 stars

Watchers

6 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - functionland/box: Client-server stack for Web3! Turn your Raspberry Pi to a BAS server in minutes and enjoy the freedom of decentralized Web with a superior user experience! · GitHub
Skip to content

Repository files navigation

example workflow

box

Client-server stack for Web3

Intro blog

Flagship App: Photos

client-server resemblance

box server demo

Motivation

There are currently two ways to interact with Web3 storage solutions:

  1. Through a pinning service and a gateway: the advantage is that files are served through URLs, an app can then access the files with conventional methods, e.g. simply putting a picture in <img src="gateway.example.com/Qm...">. The disadvantage is that there is a subscription payment associated with pinning services. Also this is not really decentralized!
  2. Turn the device to a full IPFS node: this model works beautifully in Brave desktop browser as an example, and makes sense for laptop and PC since they normally have large HDDs. It's much harder on mobile devices, however, biggest hurdle is to have Apple on board with the idea of relaxing file system access in iOS! Even if all goes well, a mobile device is NOT a good candidate for hosting the future Web! They get lost easily and are resource constrained (battery, memory).

box aims to address these issues by creating a third alternative: Personal Server

A personal server is a commodity hardware (PC, Raspberry Pi, etc.) that's kept at home vs. in pocket. It helps with actual decentralization, also saves money since people pay once for HDDs and own them forever, no monthly charge! From privacy perspective, it guarantees that data doesn't leave the premise unless user specifically wants to (e.g. sharing).

To achieve this, we are developing protocols to accommodate client-server programming with minimal effort on developer's side:

  • File Protocol: Send and receive files in a browser or an app (stage: prototype)
  • Data Protocol: Database interface over at client-side; facilitates describing linked JSON documents and having them saved/retrieved (stage: design draft)
  • AI Protocol: Map-Reduce stack for distributed processing (stage: ideation)

Architecture

box architecture

An app talks with the server(s) by invoking APIs from @functionland/fula library. The Fula library abstracts away the protocols and libp2p connection, instead exposes APIs similar to MongoDB for data persistence and S3 for file storage.

On the server side, data or file will be saved on a private IPFS instance. There is also a public IPFS instance which comes to play in sharing: when the end user requests to share some data, an encrypted copy will be saved on the public IPFS network, anyone with whom the key has been shared can access the data.

The box stack can provide backup guarantees by having the data pinned on multiple servers owned by the user. However, in cases that the user needs absolute assurance on data longevity, e.g. password records in a password manager app or scans of sensitive documents, the encrypted data can be sent over at Filecoin blockchain.

Packages

NameDescription
protocolsLibp2p protocols for the box stack
serverReference server implementation in Node.js
fulaClient library for using the protocols from browser
rn-fulaClient library ported for react native

Examples

NameDescription
reactExample of using fula client and box server
react-nativeExample of using fula client in react-native and box server

Development

To get started in development with this monorepo use the following steps.

Prerequisites

Local development on host OS

  1. Install & Build deps
 $ rush update && rush build
  1. Run box app.
 $ cd apps/box && rushx start
  1. Run demo apps
 $ cd examples/react-cra && rushx start
$ cd examples/react-do-app && rushx start

Local development in docker container

 $ docker-compose -f docker-compose.dev.yaml up

Run the demo apps

Open a browser and navigate to http://localhost:3000 and http://localhost:3001

License

MIT

Related Publications and News

About

Client-server stack for Web3! Turn your Raspberry Pi to a BAS server in minutes and enjoy the freedom of decentralized Web with a superior user experience!

Topics

Resources

Stars

6 stars

Watchers

6 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - functionland/box: Client-server stack for Web3! Turn your Raspberry Pi to a BAS server in minutes and enjoy the freedom of decentralized Web with a superior user experience! · GitHub
Skip to content

Repository files navigation

example workflow

box

Client-server stack for Web3

Intro blog

Flagship App: Photos

client-server resemblance

box server demo

Motivation

There are currently two ways to interact with Web3 storage solutions:

  1. Through a pinning service and a gateway: the advantage is that files are served through URLs, an app can then access the files with conventional methods, e.g. simply putting a picture in <img src="gateway.example.com/Qm...">. The disadvantage is that there is a subscription payment associated with pinning services. Also this is not really decentralized!
  2. Turn the device to a full IPFS node: this model works beautifully in Brave desktop browser as an example, and makes sense for laptop and PC since they normally have large HDDs. It's much harder on mobile devices, however, biggest hurdle is to have Apple on board with the idea of relaxing file system access in iOS! Even if all goes well, a mobile device is NOT a good candidate for hosting the future Web! They get lost easily and are resource constrained (battery, memory).

box aims to address these issues by creating a third alternative: Personal Server

A personal server is a commodity hardware (PC, Raspberry Pi, etc.) that's kept at home vs. in pocket. It helps with actual decentralization, also saves money since people pay once for HDDs and own them forever, no monthly charge! From privacy perspective, it guarantees that data doesn't leave the premise unless user specifically wants to (e.g. sharing).

To achieve this, we are developing protocols to accommodate client-server programming with minimal effort on developer's side:

  • File Protocol: Send and receive files in a browser or an app (stage: prototype)
  • Data Protocol: Database interface over at client-side; facilitates describing linked JSON documents and having them saved/retrieved (stage: design draft)
  • AI Protocol: Map-Reduce stack for distributed processing (stage: ideation)

Architecture

box architecture

An app talks with the server(s) by invoking APIs from @functionland/fula library. The Fula library abstracts away the protocols and libp2p connection, instead exposes APIs similar to MongoDB for data persistence and S3 for file storage.

On the server side, data or file will be saved on a private IPFS instance. There is also a public IPFS instance which comes to play in sharing: when the end user requests to share some data, an encrypted copy will be saved on the public IPFS network, anyone with whom the key has been shared can access the data.

The box stack can provide backup guarantees by having the data pinned on multiple servers owned by the user. However, in cases that the user needs absolute assurance on data longevity, e.g. password records in a password manager app or scans of sensitive documents, the encrypted data can be sent over at Filecoin blockchain.

Packages

NameDescription
protocolsLibp2p protocols for the box stack
serverReference server implementation in Node.js
fulaClient library for using the protocols from browser
rn-fulaClient library ported for react native

Examples

NameDescription
reactExample of using fula client and box server
react-nativeExample of using fula client in react-native and box server

Development

To get started in development with this monorepo use the following steps.

Prerequisites

Local development on host OS

  1. Install & Build deps
 $ rush update && rush build
  1. Run box app.
 $ cd apps/box && rushx start
  1. Run demo apps
 $ cd examples/react-cra && rushx start
$ cd examples/react-do-app && rushx start

Local development in docker container

 $ docker-compose -f docker-compose.dev.yaml up

Run the demo apps

Open a browser and navigate to http://localhost:3000 and http://localhost:3001

License

MIT

Related Publications and News

About

Client-server stack for Web3! Turn your Raspberry Pi to a BAS server in minutes and enjoy the freedom of decentralized Web with a superior user experience!

Topics

Resources

Stars

6 stars

Watchers

6 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - functionland/box: Client-server stack for Web3! Turn your Raspberry Pi to a BAS server in minutes and enjoy the freedom of decentralized Web with a superior user experience! · GitHub
Skip to content

Repository files navigation

example workflow

box

Client-server stack for Web3

Intro blog

Flagship App: Photos

client-server resemblance

box server demo

Motivation

There are currently two ways to interact with Web3 storage solutions:

  1. Through a pinning service and a gateway: the advantage is that files are served through URLs, an app can then access the files with conventional methods, e.g. simply putting a picture in <img src="gateway.example.com/Qm...">. The disadvantage is that there is a subscription payment associated with pinning services. Also this is not really decentralized!
  2. Turn the device to a full IPFS node: this model works beautifully in Brave desktop browser as an example, and makes sense for laptop and PC since they normally have large HDDs. It's much harder on mobile devices, however, biggest hurdle is to have Apple on board with the idea of relaxing file system access in iOS! Even if all goes well, a mobile device is NOT a good candidate for hosting the future Web! They get lost easily and are resource constrained (battery, memory).

box aims to address these issues by creating a third alternative: Personal Server

A personal server is a commodity hardware (PC, Raspberry Pi, etc.) that's kept at home vs. in pocket. It helps with actual decentralization, also saves money since people pay once for HDDs and own them forever, no monthly charge! From privacy perspective, it guarantees that data doesn't leave the premise unless user specifically wants to (e.g. sharing).

To achieve this, we are developing protocols to accommodate client-server programming with minimal effort on developer's side:

  • File Protocol: Send and receive files in a browser or an app (stage: prototype)
  • Data Protocol: Database interface over at client-side; facilitates describing linked JSON documents and having them saved/retrieved (stage: design draft)
  • AI Protocol: Map-Reduce stack for distributed processing (stage: ideation)

Architecture

box architecture

An app talks with the server(s) by invoking APIs from @functionland/fula library. The Fula library abstracts away the protocols and libp2p connection, instead exposes APIs similar to MongoDB for data persistence and S3 for file storage.

On the server side, data or file will be saved on a private IPFS instance. There is also a public IPFS instance which comes to play in sharing: when the end user requests to share some data, an encrypted copy will be saved on the public IPFS network, anyone with whom the key has been shared can access the data.

The box stack can provide backup guarantees by having the data pinned on multiple servers owned by the user. However, in cases that the user needs absolute assurance on data longevity, e.g. password records in a password manager app or scans of sensitive documents, the encrypted data can be sent over at Filecoin blockchain.

Packages

NameDescription
protocolsLibp2p protocols for the box stack
serverReference server implementation in Node.js
fulaClient library for using the protocols from browser
rn-fulaClient library ported for react native

Examples

NameDescription
reactExample of using fula client and box server
react-nativeExample of using fula client in react-native and box server

Development

To get started in development with this monorepo use the following steps.

Prerequisites

Local development on host OS

  1. Install & Build deps
 $ rush update && rush build
  1. Run box app.
 $ cd apps/box && rushx start
  1. Run demo apps
 $ cd examples/react-cra && rushx start
$ cd examples/react-do-app && rushx start

Local development in docker container

 $ docker-compose -f docker-compose.dev.yaml up

Run the demo apps

Open a browser and navigate to http://localhost:3000 and http://localhost:3001

License

MIT

Related Publications and News

About

Client-server stack for Web3! Turn your Raspberry Pi to a BAS server in minutes and enjoy the freedom of decentralized Web with a superior user experience!

Topics

Resources

Stars

6 stars

Watchers

6 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - functionland/box: Client-server stack for Web3! Turn your Raspberry Pi to a BAS server in minutes and enjoy the freedom of decentralized Web with a superior user experience! · GitHub
Skip to content

Repository files navigation

example workflow

box

Client-server stack for Web3

Intro blog

Flagship App: Photos

client-server resemblance

box server demo

Motivation

There are currently two ways to interact with Web3 storage solutions:

  1. Through a pinning service and a gateway: the advantage is that files are served through URLs, an app can then access the files with conventional methods, e.g. simply putting a picture in <img src="gateway.example.com/Qm...">. The disadvantage is that there is a subscription payment associated with pinning services. Also this is not really decentralized!
  2. Turn the device to a full IPFS node: this model works beautifully in Brave desktop browser as an example, and makes sense for laptop and PC since they normally have large HDDs. It's much harder on mobile devices, however, biggest hurdle is to have Apple on board with the idea of relaxing file system access in iOS! Even if all goes well, a mobile device is NOT a good candidate for hosting the future Web! They get lost easily and are resource constrained (battery, memory).

box aims to address these issues by creating a third alternative: Personal Server

A personal server is a commodity hardware (PC, Raspberry Pi, etc.) that's kept at home vs. in pocket. It helps with actual decentralization, also saves money since people pay once for HDDs and own them forever, no monthly charge! From privacy perspective, it guarantees that data doesn't leave the premise unless user specifically wants to (e.g. sharing).

To achieve this, we are developing protocols to accommodate client-server programming with minimal effort on developer's side:

  • File Protocol: Send and receive files in a browser or an app (stage: prototype)
  • Data Protocol: Database interface over at client-side; facilitates describing linked JSON documents and having them saved/retrieved (stage: design draft)
  • AI Protocol: Map-Reduce stack for distributed processing (stage: ideation)

Architecture

box architecture

An app talks with the server(s) by invoking APIs from @functionland/fula library. The Fula library abstracts away the protocols and libp2p connection, instead exposes APIs similar to MongoDB for data persistence and S3 for file storage.

On the server side, data or file will be saved on a private IPFS instance. There is also a public IPFS instance which comes to play in sharing: when the end user requests to share some data, an encrypted copy will be saved on the public IPFS network, anyone with whom the key has been shared can access the data.

The box stack can provide backup guarantees by having the data pinned on multiple servers owned by the user. However, in cases that the user needs absolute assurance on data longevity, e.g. password records in a password manager app or scans of sensitive documents, the encrypted data can be sent over at Filecoin blockchain.

Packages

NameDescription
protocolsLibp2p protocols for the box stack
serverReference server implementation in Node.js
fulaClient library for using the protocols from browser
rn-fulaClient library ported for react native

Examples

NameDescription
reactExample of using fula client and box server
react-nativeExample of using fula client in react-native and box server

Development

To get started in development with this monorepo use the following steps.

Prerequisites

Local development on host OS

  1. Install & Build deps
 $ rush update && rush build
  1. Run box app.
 $ cd apps/box && rushx start
  1. Run demo apps
 $ cd examples/react-cra && rushx start
$ cd examples/react-do-app && rushx start

Local development in docker container

 $ docker-compose -f docker-compose.dev.yaml up

Run the demo apps

Open a browser and navigate to http://localhost:3000 and http://localhost:3001

License

MIT

Related Publications and News

About

Client-server stack for Web3! Turn your Raspberry Pi to a BAS server in minutes and enjoy the freedom of decentralized Web with a superior user experience!

Topics

Resources

Stars

6 stars

Watchers

6 watching

Forks

Releases

Packages

Used by

Contributors

Languages