| Tool / Project | Type / Architecture | UI / Dashboard | CLI / API | Multi‑node / Clustering | Auto TLS / SSL / ACME | Zero‑downtime / Rolling Deploy | Preview / PR Environments | Team / Permissions | Volume / Backup Support | Open Source / License | Heroku‑style Compatibility | Pros / Strengths | Cons / Caveats / Weaknesses |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Dokku | Single‑server (extensions for multi) | Minimal (no central UI, though plugins exist) | CLI, plugin APIs | Via community / plugin / custom setups | Yes (Let’s Encrypt plugin) | Via Docker techniques / plugin | Limited, requires extra setup | Basic (single admin; community plugins) | Plugin / manual (e.g. volume backups) | MIT (fully open source) | Good: git push, buildpack style, plugins add DB, etc. | Very stable, mature, lots of community extensions | Scaling / multi‑node is manual; UI is weak; managing many apps / teams is harder |
| Dokploy | Multi‑node / cluster (Docker Swarm) | Yes (built‑in UI) | CLI + AP |
TLDR: JWTs should not be used for keeping your user logged in. They are not designed for this purpose, they are not secure, and there is a much better tool which is designed for it: regular cookie sessions.
If you've got a bit of time to watch a presentation on it, I highly recommend this talk: https://www.youtube.com/watch?v=pYeekwv3vC4 (Note that other topics are largely skimmed over, such as CSRF protection. You should learn about other topics from other sources. Also note that "valid" usecases for JWTs at the end of the video can also be easily handled by other, better, and more secure tools. Specifically, PASETO.)
A related topic: Don't use localStorage (or sessionStorage) for authentication credentials, including JWT tokens: https://www.rdegges.com/2018/please-stop-using-local-storage/
The reason to avoid JWTs comes down to a couple different points:
- The JWT specification is specifically designed only for very short-live tokens (~5 minute or less). Sessions
| # start a server on Digital Ocean | |
| # https://docs.docker.com/machine/drivers/digital-ocean/ | |
| docker-machine create \ | |
| --driver digitalocean \ | |
| --digitalocean-access-token <YOUR API KEY> \ | |
| --digitalocean-size 2gb \ | |
| reaction | |
| # tell Docker to run commands on that server |
| // Existing commands that used to be 'pane:split-*' | |
| 'pane:split-left-and-copy-active-item' | |
| 'pane:split-right-and-copy-active-item' | |
| 'pane:split-up-and-copy-active-item' | |
| 'pane:split-down-and-copy-active-item' | |
| // New commands to create splits | |
| 'pane:split-left' | |
| 'pane:split-right' | |
| 'pane:split-up' |
| /** | |
| * Using Operator Mono in Atom | |
| * | |
| * 1. Open up Atom Preferences. | |
| * 2. Click the “Open Config Folder” button. | |
| * 3. In the new window’s tree view on the left you should see a file called “styles.less”. Open that up. | |
| * 4. Copy and paste the CSS below into that file. As long as you have Operator Mono SSm installed you should be golden! | |
| * 5. Tweak away. | |
| * | |
| * Theme from the screenshot (http://cdn.typography.com/assets/images/blog/operator_ide2.png): |
| with `react-native`: | |
| npm set progress=false && rm -rf ~/.npm && rm -rf node_modules && npm cache clean && time npm install | |
| npm install 83.72s user 26.03s system 100% cpu 1:49.32 total | |
| npm set progress=true && rm -rf ~/.npm && rm -rf node_modules && npm cache clean && time npm install | |
| npm install 199.30s user 27.32s system 91% cpu 4:08.29 total | |
| -- |
| console.log('Loading event'); | |
| var AWS = require('aws-sdk'); | |
| var dynamodb = new AWS.DynamoDB(); | |
| exports.handler = function(event, context) { | |
| console.log("Request received:\n", JSON.stringify(event)); | |
| console.log("Context received:\n", JSON.stringify(context)); | |
| var tableName = "OurBlogDemo"; | |
| var datetime = new Date().getTime().toString(); |
Hello, visitors! If you want an updated version of this styleguide in repo form with tons of real-life examples… check out Trellisheets! https://github.com/trello/trellisheets
“I perfectly understand our CSS. I never have any issues with cascading rules. I never have to use !important or inline styles. Even though somebody else wrote this bit of CSS, I know exactly how it works and how to extend it. Fixes are easy! I have a hard time breaking our CSS. I know exactly where to put new CSS. We use all of our CSS and it’s pretty small overall. When I delete a template, I know the exact corresponding CSS file and I can delete it all at once. Nothing gets left behind.”
You often hear updog saying stuff like this. Who’s updog? Not much, who is up with you?
| Agnes en_US # Isn't it nice to have a computer that will talk to you? | |
| Albert en_US # I have a frog in my throat. No, I mean a real frog! | |
| Alex en_US # Most people recognize me by my voice. | |
| Alice it_IT # Salve, mi chiamo Alice e sono una voce italiana. | |
| Alva sv_SE # Hej, jag heter Alva. Jag är en svensk röst. | |
| Amelie fr_CA # Bonjour, je m’appelle Amelie. Je suis une voix canadienne. | |
| Anna de_DE # Hallo, ich heiße Anna und ich bin eine deutsche Stimme. | |
| Bad News en_US # The light you see at the end of the tunnel is the headlamp of a fast approaching train. | |
| Bahh en_US # Do not pull the wool over my eyes. | |
| Bells en_US # Time flies when you are having fun. |
| { | |
| "name": "my-app", | |
| "version": "1.0.0", | |
| "description": "My test app", | |
| "main": "src/js/index.js", | |
| "scripts": { | |
| "jshint:dist": "jshint src/js/*.js", | |
| "jshint": "npm run jshint:dist", | |
| "jscs": "jscs src/*.js", | |
| "browserify": "browserify -s Validating -o ./dist/js/build.js ./lib/index.js", |