Skip to content
This repository has been archived by the owner on Dec 20, 2023. It is now read-only.
/ ctrl-v Public archive

πŸ“‹ a modern, open-source pastebin with latex and markdown rendering support

Notifications You must be signed in to change notification settings

jackyzha0/ctrl-v

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

ctrl-v

A modern, open-source pastebin with latex and markdown rendering support

Frontend is in React + Next.js and backend is in Go. Deployed via Vercel and Google Cloud Run.

Go Paste Example Markdown Rendering Showing off another theme! Latex Rendering

Public API

The ctrl-v API is provided for free for other developers to easily develop on top of it. It can be reached at https://api.ctrl-v.app/.

GET /health

# get the health of the API
curl https://api.ctrl-v.app/health

# 200 OK
# > "status ok"

POST /api

# create a new paste
curl -L -X POST 'https://api.ctrl-v.app/api' \
    -F 'expiry=2021-03-09T01:02:43.082Z' \
    -F 'content=print(\"test content\")' \
    -F 'title=test paste' \
    -F 'language=python'

# or with a password
curl -L -X POST 'https://api.ctrl-v.app/api' \
    -F 'expiry=2021-03-09T01:02:43.082Z' \
    -F 'content=print(\"test content\")' \
    -F 'title=test paste' \
    -F 'language=python' \
    -F 'password=hunter2'

# 200 OK
# > { "hash": "6Z7NVVv" }

# 400 BAD_REQUEST
# happens when title/body is too long, password couldnt
# be hashed, or expiry is not in RFC3339 format

GET /api/{hash}

# get unprotected hash
curl https://api.ctrl-v.app/api/1t9UybX

# 200 OK
# > {
# >   "content": "print(\"test content\")",
# >   "expiry": "2021-03-09T01:02:43.082Z",
# >   "language": "python",
# >   "timestamp": "2021-03-02T01:06:16.209501971Z",
# >   "title": "test paste"
# > }

# 401 BAD_REQUEST
# happens when paste is password protected. when this happens, try the authenticated alternative using POST
# 404 NOT_FOUND
# no paste with that ID found

POST /api/{hash}

# get unprotected hash
curl -L -X POST 'https://api.ctrl-v.app/api/1t9UybX' \
  -F 'password=hunter2'

# 200 OK
# > {
# >   "content": "print(\"test content\")",
# >   "expiry": "2021-03-09T01:02:43.082Z",
# >   "language": "python",
# >   "timestamp": "2021-03-02T01:06:16.209501971Z",
# >   "title": "test paste"
# > }

# 401 BAD_REQUEST
# wrong password
# 404 NOT_FOUND
# no paste with that ID found

Developing

when doing local backend development, make sure you change the backend address to be localhost. You can find this on Line 4 of frontend/src/http/shared.js

Common

make dev β€” starts React development server on :3000 and backend on :8080

Frontend

make fe-run β€” starts React development server on :3000

make fe-build β€” builds development release of frontend in frontend/build

Backend

make run β€” starts backend on :8080

make lint β€” lints all Go files

make docker-build β€” builds Docker image of current backend

make docker-run β€” runs built Docker image on :8080