Aquameta 0.1 is Live!

Follow @aquameta

Hi all,

I'm happy to announce the release of Aquameta, a peer-to-peer network for exchanging "bundles", a new kind of complex data object that can be almost anything. They can include code, web apps, data, images and more, and together create a kind of "smart object" that is very versatile and open-ended.

Today, users can exchange emails, publish web pages, exchange binaries via p2p apps, and much more. We'd like to see Aquameta become another kind of communication protocol and network, one where users exchange these bundled complex data objects that hopefully do fun, interesting and useful stuff. Because bundles are made up of data, we claim that it's a very wide pipe for creativity and interactivity, one that opens up a world of new possibilities.

Under the hood, Aquameta is a bunch of PostgreSQL schemas that handle things like version control, web hosting, user interface, events, peer to peer communication, etc. A bundle is made up of rows in these tables and any others that users might wish to create.

Aquameta has a web interface that lets users build and exchange these bundles. They can be sent either server-to-server via http, or browser-to-browser via WebRTC. The networked-communication aspect of Aquameta is still under development and experimentation.

Aquameta can be installed on a desktop, a server, in the cloud or on a small device such as a Raspberry Pi.

Under the hood are a lot of PostgreSQL modules which hopefully can be useful to the PostgreSQL community. They include:

1) meta - a writable system catalog, that makes common DDL operations like schema changes accessible via INSERT, UPDATE and DELETE

insert into meta.role(name, superuser, password) values ('joe', true, 'mypass');  
insert into meta.schema(name) values ('my_schema');  

2) bundle - a version control system for data, similar to git, but for rows in the database instead of files

select bundle.stage_row_add(  
    meta.row_id('public','countries','id','UK')
);
select bundle.commit('org.aquameta.countries','add uk.');  
select bundle.checkout('org.aquameta.games.snake');  

3) event - a pub/sub event system for subscribing to data changes on a particular column, row or table

select session_create();  
select subscribe_table(meta.relation_id('widget','machine'));  

4) filesystem - a foreign data wrapper that lets you SELECT files and directories from the filesystem, and a daemon called postgrefs, which lets you navigate the database from the filesystem as if it were files and directories

aquameta=# select name, path, permissions, content, owner from filesystem.file where path='/etc/issue';  
 name  |    path    | permissions |         content          | owner 
-------+------------+-------------+--------------------------+-------
 issue | /etc/issue | 0644        | Ubuntu 14.04.5 LTS \n \l+| root
       |            |             |                         +| 
       |            |             |                          | 
(1 row)
$ ls /mnt/aquameta/public/countries

5) www - a web server that exposes the database over http, including a REST interface for data manip and function calls, hosting of arbitrary resources, and an authentication layer that uses PostgreSQL ROLEs and PRIVILEGEs

aquameta=# select path, m.mimetype, substring(content from 1 for 15)  
from endpoint.resource r  
join endpoint.mimetype m on r.mimetype_id = m.id limit 2;  
 path  | mimetype  |    substring    
-------+-----------+-----------------
 /docs | text/html | <!DOCTYPE html>
 /dev  | text/html | <!DOCTYPE html>
select endpoint.request('0.1','GET','/docs')  

6) widget - a user interface component framework, where web pages are composed of "widgets", UI components made of html, css and javascript, that accept arguments and support javascript dependencies

select * from widget.widget;  
select * from widget.widget_dependency_js;  

7) semantics - a metadata layer for the database schema, where columns, relations, foreign keys and more can be "decorated" with additional semantic meaning

insert into semantics.relation (relation_id, purpose_id, widget_id) values  
(
   meta.relation_id('ecomm','customer'),
   (select purpose_id from semantics.purpose where purpose='row_detail'),
   (select id from widget.widget where name='customer_list_view')
);

Aquameta is in very early stages, despite being under development for years. It is finally at the point of being a marginally functional prototype that hopefully is pointed in the right direction, but there is much work still to be done. The user interface is just beginning to take shape, the system is not secure, test coverage is sparse, and there are surely many bugs and missing features. We are releasing it at this early stage to get feedback and invite contributors to help out.

To give Aquameta a spin, head over to github and consult the README which contains install instructions:

http://github.com/aquametalabs/aquameta

To jump into development, check out the project's roadmap, and join our IRC channel and mailing list:

Comments

comments powered by Disqus