Paaster is a secure by default end-to-end encrypted pastebin built with the objective of simplicity.

Overview

Follow the development of our desktop client here

Paaster

Paaster is a secure by default end-to-end encrypted pastebin built with the objective of simplicity.

Preview

Video of paaster in action! Mobile preview

Features

Looking to build a client for paaster?

Check out our Integration documentation

Security

What is E2EE?

E2EE or end to end encryption is a zero trust encryption methodology. When you paste code into paaster the code is encrypted locally with a secret generated on your browser. This secret is never shared with the server & only people you share the link with can view the paste.

Can I trust a instance of paaster not hosted by me?

No. Anyone could modify the functionality of paaster to expose your secret key to the server. We recommend using a instance you host or trust.

How are client secrets stored?

Client-sided secrets are stored in localStorage on paste creation (for paste history.) Anything else would be retrievable by the server or be overly complicated. This does make paaster vulnerable to malicious javascript being executed, but this would require malicious javascript to be present when the svelte application is built. If this was the case you'd have bigger issues, like the module just reading all inputs & getting the plain text paste.

How are client secrets transported?

Paaster uses URI fragments to transport secrets, according to the Mozilla foundation URI fragments aren't meant to be sent to the server. Bitwarden also has a article covering this usage here.

How are server secrets stored?

Server-sided secrets are stored in localStorage on paste creation, allowing you to modify or delete pastes later on. Server-sided secrets are generated on the server using the python secrets module & are stored in the database using bcrypt hashing.

Cipher

paaster is built using the forge module, using AES-256 in CBC mode with PKCS7 padding & PBKDF2 key derivation at 50,000 iterations. More details are located in our Integration documentation.

Shortcuts

  • Ctrl+V - Paste code.
  • Ctrl+S - Download code as file.
  • Ctrl+A - Copy all code to clipboard.
  • Ctrl+X - Copy URL to clipboard.

Requesting features

  • Open a new issue to request a feature (one issue per feature.)

What we won't add

  • Paste editing.
    • paaster isn't a text editor, it's a pastebin.
  • Paste button.
    • paaster isn't a text editor, when code is inputted it will always be automatically uploaded.
  • Optional encryption.
    • paaster will never have opt-in / opt-out encryption, encryption will always be present.

Setup

Production with Docker

  • git clone --branch Production https://github.com/WardPearce/paaster
  • Configure docker-compose.yml
  • Proxy exposed ports using Nginx (or whatever reverse proxy you prefer.)
  • FRONTEND_PROXIED should be the proxied address for "paaster_frontend". E.g. for paaster.io this is "https://paaster.io"
  • VITE_BACKEND should be the proxied address for "paaster_starlette". E.g. for paaster.io this is "https://api.paaster.io"
  • sudo docker-compose build; sudo docker-compose up -d

Using Rclone

Using rclone with Docker Compose

Basically the most important part is to install fuse, create /var/lib/docker-plugins/rclone/config & /var/lib/docker-plugins/rclone/cache, install the docker plugin docker plugin install rclone/docker-volume-rclone:amd64 args="-v" --alias rclone --grant-all-permissions, configure the rclone.conf for the storage service you want to use & then configure your docker compose to use the rclone volume. Example rclone docker compose.

Production without docker

This setup is not recommended & requires more research / knowledge.

  • git clone --branch Production https://github.com/WardPearce/paaster.
  • cd paaster-frontend
  • Create .env
    • VITE_NAME - The name displayed on the website.
    • VITE_BACKEND - The URL of the API.
  • Install nodejs
    • npm install
    • npm run build
  • Serve files generated in dist with Nginx (or whatever reverse proxy you use.)
  • cd paaster-backend
  • Install Python 3.7+
    • pip3 install -r requirements.txt
    • Configure main.py following the guide for uvicorn.
  • Pass environmental variables
    • REDIS_HOST
    • REDIS_PORT
    • MONGO_IP
    • MONGO_PORT
    • MONGO_DB
    • FRONTEND_PROXIED - The URL of the Frontend.
  • Proxy port with Nginx (or whatever reverse proxy you use.)

Development

  • git clone https://github.com/WardPearce/paaster.
  • cd paaster-frontend
  • Create .env
    • VITE_NAME - The name displayed on the website.
    • VITE_BACKEND - The URL of the API.
  • Install nodejs
    • npm install
    • npm run dev
  • cd paaster-backend
  • Pass environmental variables
    • REDIS_HOST
    • REDIS_PORT
    • MONGO_IP
    • MONGO_PORT
    • MONGO_DB
    • FRONTEND_PROXIED - The URL of the Frontend.
  • Install Python 3.7+
    • pip3 install -r requirements.txt
    • Run main.py
Comments
  • Cant paste or type into paaster, no option to save/delete or anything

    Cant paste or type into paaster, no option to save/delete or anything

    Installed using instructions for production branch using docker. The moment I paste anything in or type 1 character the webpage freezes.

    Error logs from dev tools console, 1 warning and 2 errors.

    Warning

    Router> Could not find an element to focus. You should always render a header for accessibility reasons, or set a custom focus element via the "useFocus" hook. If you don't want this Route or Router to manage focus, pass "primary={false}" to it.
    
    Occurred in: <Route path="/" />
    (anonymous) @ vendor.1db1a7be.js:10
    (anonymous) @ vendor.1db1a7be.js:10
    Promise.then (async)
    hu @ vendor.1db1a7be.js:10
    (anonymous) @ vendor.1db1a7be.js:10
    Promise.then (async)
    (anonymous) @ vendor.1db1a7be.js:10
    Iu.e.$$.update @ vendor.1db1a7be.js:10
    Rd @ vendor.1db1a7be.js:4
    Zo @ vendor.1db1a7be.js:4
    pr @ vendor.1db1a7be.js:4
    dt @ index.ae4ff708.js:3
    (anonymous) @ index.ae4ff708.js:3
    

    Errors

    1

    index.ae4ff708.js:1          GET http://localhost:8888/api/settings net::ERR_CONNECTION_REFUSED
    Ge @ index.ae4ff708.js:1
    r @ index.ae4ff708.js:2
    
    

    2

    Uncaught (in promise) TypeError: Failed to fetch
        at Ge (index.ae4ff708.js:1:1388)
        at HTMLTextAreaElement.r (index.ae4ff708.js:2:5058)
    Ge @ index.ae4ff708.js:1
    r @ index.ae4ff708.js:2
    
    opened by baudneo 12
  • CORS Issue - Paste just spins...

    CORS Issue - Paste just spins...

    Get this error when pasting in a simple string:

    Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://api.paaster.io/api/settings. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing). Status code: 200.

    Browser: Firefox 98.0.1 (64-bit) M1 Mac Mini Monterey 12.3

    image

    bug 
    opened by mikesimps 6
  • Cant paste anything, infinite spinning circle

    Cant paste anything, infinite spinning circle

    when im trying to paste anything in i get an infinite loading screen, i cant see anything abnormal in the logs, but i got this error in the webconsole right after pasting:

    Uncaught (in promise) SyntaxError: Unexpected token < in JSON at position 0

    Encountered with opera gx and edge.

    Im hosting paaster within docker from a raspberry pi, here is my docker-compose: version: '3' services: starlette: container_name: paaster_backend image: wardpearce/paaster-backend restart: unless-stopped ports: - "8888:80" environment: MONGO_IP: "paaster_mongodb" MONGO_PORT: 27017 MONGO_DB: "paaster" # Nano ID length https://zelark.github.io/nano-id-cc/ NANO_ID_LEN: 21 # Chunk size when sending a encrypted paste back to the client. READ_CHUNK: 1024 # This is the max paste size of the encrypted data. MAX_PASTE_SIZE_MB: 3 REDIS_HOST: "paaster_redis" REDIS_PORT: 6379 # Proxied Frontend URL. FRONTEND_PROXIED: "http://localhost:8889" volumes: # If you change 'SAVE_PATH' this needs to be changed, # changing 'SAVE_PATH' is not recommended. - appdata:/app/pastes depends_on: - mongodb networks: - backend

    vite: container_name: paaster_frontend image: wardpearce/paaster-frontend environment: VITE_BACKEND: "http://localhost:8888" VITE_NAME: "paaster" restart: unless-stopped ports: - "8889:80"

    redis: container_name: paaster_redis image: redis volumes: - redis:/data networks: - backend

    mongodb: image: mongo:4.4.14 container_name: paaster_mongodb restart: unless-stopped environment: MONGODB_DATA_DIR: /data/db MONDODB_LOG_DIR: /dev/null volumes: - mongodbdata:/data/db networks: - backend

    networks: backend: driver: bridge

    volumes: redis: driver: local mongodbdata: driver: local appdata: driver: local

    opened by KagetaneHiruko 1
  • Hosting on cloudflare workers ?

    Hosting on cloudflare workers ?

    Is there any plan to make it easy to host this project on cloudflare workers ? Some other pastebin such as https://github.com/SharzyL/pastebin-worker can be hosted there, but that is not encrypted. Looking forward for this idea. Thanks

    opened by Jrchintu 1
  • Externally set server secret

    Externally set server secret

    Allow external programs to pass a server secret in the URL to be stored in localStorage.

    • [x] Add hash param
    • [x] Remove server secret from URL
    • [x] Store in localStorage for current paste
    • [x] Profit
    enhancement 
    opened by WardPearce 0
Owner
Ward
Privacy advocate & open source developer
Ward
SSD: Single Shot MultiBox Detector pytorch implementation focusing on simplicity

SSD: Single Shot MultiBox Detector Introduction Here is my pytorch implementation of 2 models: SSD-Resnet50 and SSDLite-MobilenetV2.

Viet Nguyen 149 Jan 7, 2023
An Efficient Training Approach for Very Large Scale Face Recognition or F²C for simplicity.

Fast Face Classification (F²C) This is the code of our paper An Efficient Training Approach for Very Large Scale Face Recognition or F²C for simplicit

null 33 Jun 27, 2021
A general-purpose programming language, focused on simplicity, safety and stability.

The Rivet programming language A general-purpose programming language, focused on simplicity, safety and stability. Rivet's goal is to be a very power

The Rivet programming language 17 Dec 29, 2022
A machine learning benchmark of in-the-wild distribution shifts, with data loaders, evaluators, and default models.

WILDS is a benchmark of in-the-wild distribution shifts spanning diverse data modalities and applications, from tumor identification to wildlife monitoring to poverty mapping.

P-Lambda 437 Dec 30, 2022
A simple python module to generate anchor (aka default/prior) boxes for object detection tasks.

PyBx WIP A simple python module to generate anchor (aka default/prior) boxes for object detection tasks. Calculated anchor boxes are returned as ndarr

thatgeeman 4 Dec 15, 2022
Api for getting bin info and getting encrypted card details for adyen.

Bin Info And Adyen Cse Enc Python api for getting bin info and getting encrypted

Roldex Stark 8 Dec 30, 2022
[ICML 2020] Prediction-Guided Multi-Objective Reinforcement Learning for Continuous Robot Control

PG-MORL This repository contains the implementation for the paper Prediction-Guided Multi-Objective Reinforcement Learning for Continuous Robot Contro

MIT Graphics Group 65 Jan 7, 2023
Exact Pareto Optimal solutions for preference based Multi-Objective Optimization

Exact Pareto Optimal solutions for preference based Multi-Objective Optimization

Debabrata Mahapatra 40 Dec 24, 2022
Objective of the repository is to learn and build machine learning models using Pytorch. 30DaysofML Using Pytorch

30 Days Of Machine Learning Using Pytorch Objective of the repository is to learn and build machine learning models using Pytorch. List of Algorithms

Mayur 119 Nov 24, 2022
Official implementation of "A Unified Objective for Novel Class Discovery", ICCV2021 (Oral)

A Unified Objective for Novel Class Discovery This is the official repository for the paper: A Unified Objective for Novel Class Discovery Enrico Fini

Enrico Fini 118 Dec 26, 2022
Official implementation of NeurIPS 2021 paper "One Loss for All: Deep Hashing with a Single Cosine Similarity based Learning Objective"

Official implementation of NeurIPS 2021 paper "One Loss for All: Deep Hashing with a Single Cosine Similarity based Learning Objective"

Ng Kam Woh 71 Dec 22, 2022
Code for the paper Relation Prediction as an Auxiliary Training Objective for Improving Multi-Relational Graph Representations (AKBC 2021).

Relation Prediction as an Auxiliary Training Objective for Knowledge Base Completion This repo provides the code for the paper Relation Prediction as

Facebook Research 85 Jan 2, 2023
Information-Theoretic Multi-Objective Bayesian Optimization with Continuous Approximations

Information-Theoretic Multi-Objective Bayesian Optimization with Continuous Approximations Requirements The code is implemented in Python and requires

null 1 Nov 3, 2021
v objective diffusion inference code for JAX.

v-diffusion-jax v objective diffusion inference code for JAX, by Katherine Crowson (@RiversHaveWings) and Chainbreakers AI (@jd_pressman). The models

Katherine Crowson 186 Dec 21, 2022
Pytorch implementation of "MOSNet: Deep Learning based Objective Assessment for Voice Conversion"

MOSNet pytorch implementation of "MOSNet: Deep Learning based Objective Assessment for Voice Conversion" https://arxiv.org/abs/1904.08352 Dependency L

null 9 Nov 18, 2022
Multi-objective gym environments for reinforcement learning.

MO-Gym: Multi-Objective Reinforcement Learning Environments Gym environments for multi-objective reinforcement learning (MORL). The environments follo

Lucas Alegre 74 Jan 3, 2023
Implementation of a protein autoregressive language model, but with autoregressive infilling objective (editing subsequences capability)

Protein GLM (wip) Implementation of a protein autoregressive language model, but with autoregressive infilling objective (editing subsequences capabil

Phil Wang 17 May 6, 2022
A Peer-to-peer Platform for Secure, Privacy-preserving, Decentralized Data Science

PyGrid is a peer-to-peer network of data owners and data scientists who can collectively train AI models using PySyft. PyGrid is also the central serv

OpenMined 615 Jan 3, 2023
A very tiny, very simple, and very secure file encryption tool.

Picocrypt is a very tiny (hence "Pico"), very simple, yet very secure file encryption tool. It uses the modern ChaCha20-Poly1305 cipher suite as well

Evan Su 1k Dec 30, 2022