All Projects β†’ galtproject β†’ geesome-node

galtproject / geesome-node

Licence: other
🦈 Your self-hosted decentralized Messenger, Social network, Media file storage on top of IPFS! Freely communicate in encrypted chat groups, share images, video, text or any data without a risk of censorship or blocking.

Programming Languages

typescript
32286 projects
SCSS
7915 projects
Vue
7211 projects
javascript
184084 projects - #8 most used programming language
shell
77523 projects
HTML
75241 projects
Dockerfile
14818 projects

Projects that are alternatives of or similar to geesome-node

Peergos
A p2p, secure file storage, social network and application protocol
Stars: ✭ 895 (+894.44%)
Mutual labels:  social-network, peer-to-peer, ipfs, decentralized
trystero
🀝 Serverless WebRTC matchmaking for painless P2P β€” Make any site multiplayer in a few lines β€” Use BitTorrent, IPFS, or Firebase
Stars: ✭ 512 (+468.89%)
Mutual labels:  peer-to-peer, ipfs, decentralized, web3
Js Ipfs
IPFS implementation in JavaScript
Stars: ✭ 6,129 (+6710%)
Mutual labels:  peer-to-peer, ipfs, decentralized
Orbit Db
Peer-to-Peer Databases for the Decentralized Web
Stars: ✭ 6,381 (+6990%)
Mutual labels:  peer-to-peer, ipfs, decentralized
Arbore
Friend-to-friend filesharing app to save the world from dystopia
Stars: ✭ 270 (+200%)
Mutual labels:  social-network, peer-to-peer, ipfs
tool-db
A peer-to-peer decentralized database
Stars: ✭ 15 (-83.33%)
Mutual labels:  peer-to-peer, decentralized, web3
pop
Run a point-of-presence within Myel, the community powered content delivery network.
Stars: ✭ 28 (-68.89%)
Mutual labels:  peer-to-peer, ipfs, decentralized
Ipfd
An imageboard, but images are stored in a peer-to-peer network
Stars: ✭ 77 (-14.44%)
Mutual labels:  peer-to-peer, ipfs, decentralized
superhighway84
USENET-inspired, uncensorable, decentralized internet discussion system running on IPFS & OrbitDB
Stars: ✭ 437 (+385.56%)
Mutual labels:  ipfs, decentralized, web3
Unstoppable Wallet Android
A secure and decentralized Bitcoin and other cryptocurrency wallet for Android phones. Supports Bitcoin, Ethereum, EOS, Binance Chain, Bitcoin Cash, DASH, ...
Stars: ✭ 165 (+83.33%)
Mutual labels:  peer-to-peer, ipfs, decentralized
Unstoppable Wallet Ios
A secure and decentralized Bitcoin and other cryptocurrency wallet for iPhone. Supports Bitcoin, Ethereum, EOS, Binance Chain, Bitcoin Cash, DASH, ...
Stars: ✭ 180 (+100%)
Mutual labels:  peer-to-peer, ipfs, decentralized
ipfs-chat
Real-time P2P messenger using go-ipfs pubsub. TUI. End-to-end encrypted texting & file-sharing. NAT traversal.
Stars: ✭ 84 (-6.67%)
Mutual labels:  peer-to-peer, ipfs, decentralized
Cyb Archeology
🌎 Personal immortal robot for the The Great Web
Stars: ✭ 117 (+30%)
Mutual labels:  ipfs, decentralized, web3
field-manual
The Offical User's Guide to OrbitDB
Stars: ✭ 178 (+97.78%)
Mutual labels:  peer-to-peer, ipfs, decentralized
borg
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!
Stars: ✭ 25 (-72.22%)
Mutual labels:  ipfs, decentralized, web3
Rust Ipfs
The InterPlanetary File System (IPFS), implemented in Rust.
Stars: ✭ 739 (+721.11%)
Mutual labels:  peer-to-peer, ipfs, decentralized
Js Dag Service
Library for storing and replicating hash-linked data over the IPFS network.
Stars: ✭ 81 (-10%)
Mutual labels:  peer-to-peer, ipfs, decentralized
Maskbook
The portal to the new, open internet. ([I:b])
Stars: ✭ 691 (+667.78%)
Mutual labels:  social-network, peer-to-peer, web3
Photos
[DEPRECATED] Encrypted, secure, decentralized personal data wallet -- technology behind textile.photos
Stars: ✭ 236 (+162.22%)
Mutual labels:  social-network, ipfs, decentralized
moera-client-react
Moera web client, for issues use: https://github.com/MoeraOrg/moera-issues/issues
Stars: ✭ 12 (-86.67%)
Mutual labels:  social-network, decentralized

geesome

File Storage and Social Media Node

Current state: 0.3.0 - Beta

opened issues closed issues closed PR opened PR


Contributions Welcome Join Us On Telegram

GeeSome Node

GeeSome Node allows you to run your own file storage with social media functional: make you own public or private group with posts and content. It's a Node on top of IPFS for define and manage data structure of files, users and groups. Node provides an UI and API for storing and accessing your saved data or remote data of other nodes: files, posts, groups.

GeeSome Main Page

About GeeSome Project

GeeSome protocol created to provide communication tool between communities of property owners in Galt Project.

Galt Project team is aware of many cases of censorship and blocking in different social networks. These cases forced us to develop a new decentralized protocol and node application that would allow anyone to upload any content to his personal node and to share this content with the whole world without the risk of being blocked.

Using the GeeSome protocol, communities in the Galt Project will be able to communicate in encrypted chat groups, share images, video, text or any data.

We are sure that this tool should be used not only by the project's communities, but also by anyone who is concerned about the safety of their data, censorship and blocking in web.

GeeSome Protocol

A new open protocol for unstopable social networking and communication on IPFS. It defines the structure of social network data to describe familiar to the modern user entities: content, posts, tags, groups.

GeeSome UI

GeeSome UI - it's Vue application, that using GeeSome node API for saving content and IPFS in-browser node for getting content. It's completly separated client from node and can be connected to any other GeeSome node. There are also many cases when it’s not necessary to use GeeSome UI. You can use GeeSome node API and GeesomeClient library in your project to build you own UI with some important features special for you.

Summary

With the help of GeeSome Node, anyone can create an instance of a decentralized social network, with groups like in YouTube, Instagram or Telegram but with content preservation and no locks or censorship thanks to the concept of personal GeeSome Node using IPFS Node to store content, access data and receive updates by libp2p.

GeeSome Node can be used:

  • to create and maintain your blog and generate static site for blog
  • to save important content like Saved messages in telegrams and / or in the form of a file structure as in Google Drive
  • as a media platform for adding and viewing / listening to audio and video content, creating playlists
  • to share the uploaded content in any form (blog, playlist, file, folder)
  • to create chat groups and communicate with your friends (they can be invited by special links)

GeeSome Scheme

GeeSome-Scheme

You can run personal or public GeeSome node. It used for storing files, manage entities and prepare content for publishing. Also because of IPNS updates issues - GeeSome node have IPNS caching based on signed PubSub events. Also there is an issue about IPNS keys of user. Currently its storing in GeeSome node, but need to improve it.

UI Screenshots

File explorer

GeeSome File explorer

Test group

GeeSome Test Group

Encrypted personal chat

GeeSome Personal Chat

Mobile version

Main page Menu Groups list Group page
GeeSome Mobile UI GeeSome Mobile UI GeeSome Mobile UI GeeSome Mobile UI

Install with domain to your server

  1. Set A DNS record for your geesome.your-site.com domain with ip address of server
  2. [Recommended] If you want to use gateway - set A DNS record for your gateway.geesome.your-site.com domain with ip address of server
  3. Clone repo to server that bound to domain
git clone https://github.com/galtproject/geesome-node.git && cd geesome-node
  1. [Recommended] actions before install:
sudo SIZE=8G bash/ubuntu-init-swapfile.sh # Init 8GB Swapfile
sudo PORT=4242 bash/ubuntu-set-ssh-port.sh # Change SSH port to custom
  1. Run bash script with parameters: domain and email for letsencrypt
sudo chmod +x bash/*.sh && sudo bash/ubuntu-install-docker.sh
sudo DOMAIN=geesome.your-site.com [email protected] GATEWAY=1 bash/ubuntu-install-nginx.sh # add CF=1 before script to install for cloudflare
  1. Open geesome.your-site.com/#/setup to create first admin user

How to use gateway

  1. Set A DNS record for your gateway.geesome.your-site.com domain with ip address of server
  2. Set CNAME DNS record for your your-site.com or blog.your-site.com(for example) with gateway domain: gateway.geesome.your-site.com
  3. Set TXT DNS record for your your-site.com or blog.your-site.com(for example) with IPFS or IPNS content: dnslink=/ipns/bafzbeidjvkkvlsfeko4s43lhvi3zd4phlkfoudhf6ygqatl4rrveigmdi4
  4. Run bash script with parameters: domain and email for letsencrypt
sudo DOMAIN=your-site.com [email protected] bash/ubuntu-cert-domain.sh

Note: You can generate a static site from Geesome groups by UI and get IPNS or IPFS of static sites for the gateway using.

Getting updates

bash/docker-prune.sh && bash/docker-rebuild-and-upgrade.sh

Warning: above commands deletes all stopped containers, not used images and docker build cache. Also, it's reverting not commited local git changes. If you know more efficient way to update GeeSome container app - please, make a PR.

Getting started with GeeSome Node API

  1. Install GeeSome libs by npm:
npm i --save git://github.com/galtproject/geesome-libs.git

or yarn:

yarn add git://github.com/galtproject/geesome-libs.git
  1. Checkout GeeSome API documentation

  2. Get apiKey from node by api and login pass authorization:

const { GeesomeClient } = require('geesome-libs/src/GeesomeClient');

const geesomeClient = new GeesomeClient({
    server: 'https://your-site.com:2053', // or 'http://localhost:2052',
    // apiKey: '4J1VYKW-ZP34Y0W-PREH1Q2-DYN9Q8E' // if you paste your apiKey here, so no need to authorization by loginPassword function
});

geesomeClient.init().then(async () => {
    await geesomeClient.loginPassword("username", "password");
    console.log('Congrats! You successfully authorized, your session api key:', geesomeClient.apiKey);
});

Or you can generate apiKey from UI in User Profile section by "Add api key" button. More safer to use apiKey instead of login/password, because you can always disable it and create another if there is a leak.

  1. Init GeeSome client and save image to your IPFS node
geesomeClient.init().then(async () => {
    const contentObj = await geesomeClient.saveDataByUrl('https://picsum.photos/500/300.jpg');
    console.log('content ipfs', contentObj.storageId);
    console.log('content manifest ipld', contentObj.manifestStorageId);
});
  1. Create group and publish post via API
geesomeClient.init().then(async () => {
    const avatarPhoto = await geesomeClient.saveDataByUrl('https://picsum.photos/500/300.jpg');
    
    const group = await geesomeClient.createGroup(testUser.id, { name: 'test', title: 'Test', avatarImageId: avatarPhoto.id });

    const groupIpns = group.manifestStaticStorageId;
    console.log('group manifest ipld', group.manifestStorageId);
    console.log('group manifest ipns that points to ipld', groupIpns);
    
    const postContent1 = await geesomeClient.saveContentData('My first post');
    const postContent2 = await geesomeClient.saveDataByUrl('https://picsum.photos/1000/500.jpg');
    
    await geesomeClient.createPost([postContent1.id, postContent2.id], { groupId: group.id, status: 'published' });
    
    // get published group from IPFS with posts
    
    // resolve IPNS first
    const updatedGroupIpld = await geesomeClient.resolveIpns(groupIpns);
    console.log('new group manifest ipld with first post', updatedGroupIpld);
    
    // get JSON content of group by IPLD
    const updatedGroupManifest = await geesomeClient.getObject(updatedGroupIpld);
    console.log('fetched group manifest', updatedGroupManifest);
    // or you can simply use geesomeClient.getGroup(groupIpns) for auto-resolve IPNS, get manifest with avatar and cover contents included
    
    // get posts one by one from group's posts tree
    geesomeClient.getGroupPostsAsync(
      updatedGroupIpld, 
      {limit: 10, offset: 0, orderDir: 'desc'}, 
      function onItemCallback(fetchedPost) {
        console.log('fetchedPost', fetchedPost);
        console.log('fetchedPost contents array', fetchedPost.contents);
      }, 
      function onFinishCallback(postList) {
        console.log('postList', postList);
      }
    );
});
  1. Create and publish IPFS site directory with content to IPNS
geesomeClient.init().then(async () => {
    await geesomeClient.saveDataByUrl('https://picsum.photos/500/300.jpg', {path: '/my-site/image.jpg'});
    
    await geesomeClient.saveContentData('<h1>Hello world!</h1> <img src="./image.jpg"/>', {path: '/my-site/index.html'});
    
    const mySiteFolder = await geesomeClient.getFileCatalogItemByPath('/my-site/', 'folder');
    
    const {storageId, staticId} = await geesomeClient.publishFolder(mySiteFolder.id);
    
    console.log(`check out by IPFS hash: ${geesomeClient.server}/ipfs/${storageId}/`); // for example: https://your-site.com:7722/ipfs/QmbDxAcbnSc5bgX77MgqqZ9bPVcczv5McZAYrWXoRxExi8/

    console.log(`check out by IPNS hash: ${geesomeClient.server}/ipns/${staticId}/`); // for example: https://your-site.com:7722/ipns/QmcqRcmu7p3UHkMPz8XJ886KPWbzxgpc9uNXy9GUDfUD87/
    
    // resolve IPNS by api:
    const resolvedStorageId = await geesomeClient.resolveIpns(staticId);
    
    console.log(storageId === resolvedStorageId); // true
});

Current state and features:

  • Encrypted personal messages
  • Public channels and posts
  • Streamable media api(video and audio)
  • Basic file manager
  • User profile
  • Api keys for access to all node features
  • Api keys managment in UI
  • Separated content and folders list and access by users
  • Users upload limits
  • IPNS caching for fast resolving
  • IPFS and IPNS directories for HTML sites and more
  • Ethereum authentication by signature
  • Import telegram channel's posts
  • Generate static sites from groups with posts and upload to IPFS
  • Invite system for new users
  • Auto-backup social networks channels(Telegram)

TODO:

  • Share folder by ipld, ipns manifest
  • Play audio and video content in groups as playlist
  • Public chat groups
  • Private chat groups
  • Feed for aggregate channels, chats, personal messages like in Telegram
  • Local IPNS accounts (in-browser) and signing authentication or publish transactions
  • PubSub communication with modules
  • Auto-backup shared groups and folders to another node
  • Auto-backup social networks channels(Twitter, YouTube, Instagram)
  • Pin to services like pinata from UI

GeeSome Services

You can develop your own GeeSome service in any programming language for extend GeeSome node functional by communication by API with api keys. Service can communicate with GeeSome node by http requests and PubSub events(in future) for uploading content, managing users and groups.

Existing services:

  • GeeSome ETH Manager: Ethereum listener library for managing GeeSome node by Smart Contracts events: register users, set storage limits.

Minimal requirements

  • System: Ubuntu 16.04
  • 8 GB RAM
  • 1 GB free HDD + space for your files

Dependencies

  • GO IPFS or IPFS JS
  • Node 16.x
  • Sqlite
  • ffmpeg
  • Cerbot(Letsencrypt)

Local install and run

sudo chmod +x bash/*.sh && sudo bash/ubuntu-install-docker.sh
npm run docker

In another terminal tab:

cd frontend && yarn
npm run dev

Open UI page by url: http://localhost:1234

Api available by http://localhost:2052 endpoint.

Links

Articles

  • How to make the internet great again
  • Signing and encrypt messages by IPNS keys (Soon...)
  • How to add site to IPFS with GeeSome node (Soon...)
  • Use GeeSome as IPFS file storage in your decentralized project (Soon...)
  • IPNS updates problem and how we solved it (Soon...)
  • Are we ready for true decentralized messages and content? (Soon...)
  • We need backups for our Social Networks! (Soon...)

Do you like the project? ✨

Put a star and fork it. Join Us On Telegram. Thank you!

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].