Tool Roundup: Omniscient, OpenStatus, Resend, Aiven and Turso

Published: Oct 17, 2023 by Isaac Johnson

There are a few tools that I’ve been meaning to check. Because they are generally small or special purpose, I tend to gather them up to look together in a fun “Tools Roundup” type of post.

We’ll look at a process monitor, Omniscient. We’ll check out an uptime check, OpenStatus, that can be run locally or at a free tier in the cloud. Resend as an excellent email tool and finally we’ll look at some free Database options.

Omniscient

Omniscient can be best described as a tiny process manager. Eray wrote it mostly as an excuse to “to study Tauri”.

I tried as user and root with the AppImage (having added fuse)

/content/images/2023/10/tools-01.png

I installed and tried running the deb package as well (and as root)

builder@LuiGi17:~/Workspaces/jekyll-blog$ sudo dpkg -i omniscient_0.1.1_amd64.deb
(Reading database ... 151866 files and directories currently installed.)
Preparing to unpack omniscient_0.1.1_amd64.deb ...
Unpacking omniscient (0.1.1) over (0.1.1) ...
Setting up omniscient (0.1.1) ...
Processing triggers for hicolor-icon-theme (0.17-2) ...
Processing triggers for mailcap (3.70+nmu1ubuntu1) ...
builder@LuiGi17:~/Workspaces/jekyll-blog$ omniscient
libEGL warning: failed to open /dev/dri/renderD128: Permission denied

libEGL warning: failed to open /dev/dri/renderD128: Permission denied

builder@LuiGi17:~/Workspaces/jekyll-blog$ code .
builder@LuiGi17:~/Workspaces/jekyll-blog$ sudo omniscient
libEGL warning: MESA-LOADER: failed to open vgem: /usr/lib/dri/vgem_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/x86_64-linux-gnu/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)

libEGL warning: MESA-LOADER: failed to open vgem: /usr/lib/dri/vgem_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/x86_64-linux-gnu/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)

/content/images/2023/10/tools-02.png

I’m running Jammy on this Ubuntu with all the updates. I’ll have to circle back and try a different distro next

A quick note, initially I couldn’t get X to run. A quick wsl --update with a restart (happened automatically, but you can do wsl --shutdown solved it. see this post)

/content/images/2023/10/tools-03.png

It seemed my existing Ubuntu’s all lacked the latest GLIBC. I took a whole day just to try and compile from source and link it, but still no avail

builder@DESKTOP-QADGF36:~/Workspaces/jekyll-blog$ omniscient
omniscient: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by omniscient)
omniscient: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.33' not found (required by omniscient)
omniscient: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by omniscient)

I moved to a fully upgraded Ubuntu 22 Jammy using ‘sudo do-release-upgrade’.

builder@anna-MacBookAir:~$ sudo do-release-upgrade
Checking for a new Ubuntu release
There is no development version of an LTS available.
To upgrade to the latest non-LTS development release
set Prompt=normal in /etc/update-manager/release-upgrades.
builder@anna-MacBookAir:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.3 LTS
Release:        22.04
Codename:       jammy

It rather trashed my k3s cluster (but it was the demo master anyways).

I went from my WSL to the host with “-X” to forward X through SSH back to WSL

builder@DESKTOP-QADGF36:~$ ssh -X builder@192.168.1.13
Warning: No xauth data; using fake authentication data for X11 forwarding.
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-86-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

12 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


1 updates could not be installed automatically. For more details,
see /var/log/unattended-upgrades/unattended-upgrades.log
Last login: Mon Oct 16 05:05:29 2023 from 192.168.1.78

builder@anna-MacBookAir:~$ omniscient
libEGL warning: failed to open /dev/dri/renderD128: Permission denied

libEGL warning: failed to open /dev/dri/card0: Permission denied

libEGL warning: failed to open /dev/dri/renderD128: Permission denied

libEGL warning: failed to open /dev/dri/card0: Permission denied

This time it came through

/content/images/2023/10/tools-28.png

I can see CPU information

/content/images/2023/10/tools-29.png

Disk

/content/images/2023/10/tools-30.png

and processes

/content/images/2023/10/tools-31.png

Here is a bit of a tour around the app (X forwarded to WSL forwarded to Windows 11, so it shows a bit of lag, understandably)

OpenStatus

My next app to check out is “OpenStatus”

We’ll start with local.

We need to clone the repo

builder@LuiGi17:~/Workspaces$ git clone https://github.com/openstatusHQ/openstatus.git
Cloning into 'openstatus'...
remote: Enumerating objects: 5888, done.
remote: Counting objects: 100% (2774/2774), done.
remote: Compressing objects: 100% (1171/1171), done.
remote: Total 5888 (delta 2167), reused 1646 (delta 1597), pack-reused 3114
Receiving objects: 100% (5888/5888), 4.11 MiB | 7.74 MiB/s, done.
Resolving deltas: 100% (3257/3257), done.
builder@LuiGi17:~/Workspaces$ cd openstatus/

And use Node 18

builder@LuiGi17:~/Workspaces/openstatus$ nvm install --lts
Installing latest LTS version.
Downloading and installing node v18.18.1...
Downloading https://nodejs.org/dist/v18.18.1/node-v18.18.1-linux-x64.tar.xz...
################################################################################ 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v18.18.1 (npm v9.8.1)

then add pnpm

builder@LuiGi17:~/Workspaces/openstatus$ npm install -g pnpm

added 1 package in 1s

1 package is looking for funding
  run `npm fund` for details

Then we can finally install the dependencies with pnpm

builder@LuiGi17:~/Workspaces/openstatus$ pnpm install
Scope: all 16 workspace projects
Lockfile is up to date, resolution step is skipped
Packages: +1706
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Downloading registry.npmjs.org/next/13.4.19: 12.97 MB/12.97 MB, done
Downloading registry.npmjs.org/cytoscape-fcose/2.2.0: 7.60 MB/7.60 MB, done
Downloading registry.npmjs.org/@next/swc-linux-x64-musl/13.4.19: 42.84 MB/42.84 MB, doneownloading registry.npmjs.org/@next/swc-linux-x64-gnu/13.4.19: 20.86 MB/36.21 MB
Downloading registry.npmjs.org/@next/swc-linux-x64-gnu/13.4.19: 36.21 MB/36.21 MB, done
Downloading registry.npmjs.org/typescript/5.2.2: 7.23 MB/7.23 MB, done
Downloading registry.npmjs.org/next/13.5.3: 13.70 MB/13.70 MB, done
Downloading registry.npmjs.org/@next/swc-linux-x64-musl/13.5.3: 44.81 MB/44.81 MB, done
Downloading registry.npmjs.org/imagescript/1.2.16: 10.59 MB/10.59 MB, done
Downloading registry.npmjs.org/@next/swc-linux-x64-gnu/13.5.3: 38.43 MB/38.43 MB, done
Downloading registry.npmjs.org/react-email/1.9.5: 29.05 MB/29.05 MB, done
Progress: resolved 1706, reused 0, downloaded 1705, added 1706, done
Downloading registry.npmjs.org/turbo-linux-64/1.10.12: 17.14 MB/17.14 MB, done
node_modules/.pnpm/core-js-pure@3.32.2/node_modules/core-js-pure: Running postinstall snode_modules/.pnpm/core-js-pure@3.32.2/node_modules/core-js-pure: Running postinstall script, done in 74mses5-ext@0.10.62/node_modules/es5-ext: Running postinstall script...
node_modules/.pnpm/es5-ext@0.10.62/node_modules/es5-ext: Running postinstall script, done in 75ms
node_modules/.pnpm/bufferutil@4.0.7/node_modules/bufferutil: Running install script...
node_modules/.pnpm/fast-folder-size@1.6.1/node_modules/fast-folder-size: Running postinnode_modules/.pnpm/bufferutil@4.0.7/node_modules/bufferutil: Running install script, donode_modules/.pnpm/@sentry+cli@1.75.2/node_modules/@sentry/cli: Running install script, done in 1.1s done in 131ms
node_modules/.pnpm/protobufjs@7.2.5/node_modules/protobufjs: Running postinstall scriptnode_modules/.pnpm/utf-8-validate@6.0.3/node_modules/utf-8-validate: Running install script, done in 96ms
node_modules/.pnpm/tree-sitter-json@0.20.0/node_modules/tree-sitter-json: Running install script...
node_modules/.pnpm/tree-sitter-yaml@0.5.0/node_modules/tree-sitter-yaml: Running install script...
node_modules/.pnpm/tree-sitter-json@0.20.0/node_modules/tree-sitter-json: Running instanode_modules/.pnpm/tree-sitter-yaml@0.5.0/node_modules/tree-sitter-yaml: Running install script, done in 4ssbuild@0.19.4/node_modules/esbuild: Running postinstall script, done in 130ms
node_modules/.pnpm/turbo@1.10.12/node_modules/turbo: Running postinstall script, done in 106ms
node_modules/.pnpm/better-sqlite3@8.7.0/node_modules/better-sqlite3: Running install script...
node_modules/.pnpm/better-sqlite3@8.7.0/node_modules/better-sqlite3: Running install scnode_modules/.pnpm/tree-sitter@0.20.4/node_modules/tree-sitter: Running install script, done in 10.9s
node_modules/.pnpm/contentlayer@0.3.4_esbuild@0.19.4/node_modules/contentlayer: Runningnode_modules/.pnpm/contentlayer@0.3.4_esbuild@0.19.4/node_modules/contentlayer: Running postinstall script, done in 1.2s

devDependencies:
+ @ianvs/prettier-plugin-sort-imports 4.1.0
+ @openstatus/eslint-config 0.0.0 <- packages/config/eslint
+ @turbo/gen 1.10.12
+ eslint 8.50.0
+ prettier 3.0.3
+ prettier-plugin-tailwindcss 0.5.4
+ turbo 1.10.12
+ typescript 5.2.2

Done in 46.8s

The next steps are to sign-up and setup API keys for the following apps (at a minimum):

Honestly, I looked at the large list in the env setup docs and thought “okay, you win, I’ll try the cloud option”.

Cloud Option

We can sign up using Github or Google

/content/images/2023/10/tools-04.png

Which drops us into a new workspace

/content/images/2023/10/tools-05.png

For my first HTTP monitor, I’ll choose to monitor my AWX instance

/content/images/2023/10/tools-06.png

Presently, my only provider is email

/content/images/2023/10/tools-07.png

Next, I’ll create a status page for this monitor

/content/images/2023/10/tools-08.png

The new https://fb-status.openstatus.dev/ initially shows nothing

/content/images/2023/10/tools-09.png

After a day, I can see some results showing up on https://fb-status.openstatus.dev/. This is a public page so you are welcome to look now as well.

/content/images/2023/10/tools-11.png

two days later:

/content/images/2023/10/tools-21.png

Upgrade

Under settings, we can upgrade to a paid tier if we want to add more users or monitors

/content/images/2023/10/tools-10.png

Resend

That first tool had me curious about Resend. Today, I generally use a free account of Sendgrid for occasional email alerts.

We can go to “Getting Started” to signup

/content/images/2023/10/tools-12.png

You can create a bespoke login or use a federated identity like GH

/content/images/2023/10/tools-13.png

I opted for the Github route

/content/images/2023/10/tools-14.png

We then need to create a “team”

/content/images/2023/10/tools-15.png

The Dashboard is all prepped to step us through creating an API key and using it. We’ll click “Add API Key”

/content/images/2023/10/tools-16.png

And then we’ll use the curl steps to start

/content/images/2023/10/tools-17.png

$ curl -X POST 'https://api.resend.com/emails' \
  -H 'Authorization: Bearer re_XXXXXXXXXXXXXXXXXXXXXXXX' \
  -H 'Content-Type: application/json' \
  -d $'{
    "from": "onboarding@resend.dev",
    "to": "isaac.johnson@gmail.com",
    "subject": "Hello World",
    "html": "<p>Congrats on sending your <strong>first email</strong>!</p>"
  }'
{"id":"0f8d68bc-5967-4071-bf85-7672684f9437"}

A consequence of free and easy to use email tools is they most certainly are abused by spammers. It was little surprise that I found the onboarding email in my spam folder

/content/images/2023/10/tools-18.png

I took a look and clicked the ‘Report not spam’ button to get it back to my inbox

/content/images/2023/10/tools-19.png

Python

Let’s try a quick Python example

I’ll import the Resend module with pip

builder@LuiGi17:~/Workspaces/newNotification$ pip install resend
Defaulting to user installation because normal site-packages is not writeable
Collecting resend
  Using cached resend-0.5.2-py2.py3-none-any.whl (7.3 kB)
Collecting requests==2.31.0
  Using cached requests-2.31.0-py3-none-any.whl (62 kB)
Requirement already satisfied: idna<4,>=2.5 in /usr/lib/python3/dist-packages (from requests==2.31.0->resend) (3.3)
Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/lib/python3/dist-packages (from requests==2.31.0->resend) (1.26.5)
Collecting charset-normalizer<4,>=2
  Downloading charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (138 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 138.7/138.7 KB 1.0 MB/s eta 0:00:00
Requirement already satisfied: certifi>=2017.4.17 in /usr/lib/python3/dist-packages (from requests==2.31.0->resend) (2020.6.20)
Installing collected packages: charset-normalizer, requests, resend
  WARNING: The script normalizer is installed in '/home/builder/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed charset-normalizer-3.3.0 requests-2.31.0 resend-0.5.2

I can then create a pythong script to use it

builder@LuiGi17:~/Workspaces/newNotification$ cat testingres.py
import os
import resend

resend.api_key = os.environ["RESEND_API_KEY"]

params = {
    "from": "onboarding@resend.dev",
    "to": ["isaac.johnson@gmail.com"],
    "subject": "testing",
    "html": "<strong>hello, world!</strong>",
    "reply_to": "onboarding@resend.dev",
    "tags": [
        {"name": "tag1", "value": "tagvalue1"},
        {"name": "tag2", "value": "tagvalue2"},
    ],
}

r = resend.Emails.send(params)
print(r)

I can then set an env var to my key and run the script

$ export RESEND_API_KEY=re_XXXXXXXXXXXXXXXXXXXXXXX
$ python3 ./testingres.py
{'id': '1e44ba30-5dfe-475a-b972-882e3aa44d2f'}

Note: the first time i did this I foolishly named the script resend.py which caused a bad import:

AttributeError: partially initialized module 'resend' has no attribute 'Emails' (most likely due to a circular import)

So the lesson here is never name your script after the module you are trying to consume.

We can see the email came through without issue

/content/images/2023/10/tools-20.png

If we want to scale up, there are higher paid tiers

/content/images/2023/10/tools-27.png

I liked the fact Resend showed me a running total of usage so it’s pretty easy to see if I’ll hit the free tier limit.

Free Databases

I’ve spoken on using Aiven Kafka before. Aiven has plenty of options, most cost, but they do have a free tier as well.

I can whip up a Free Tier PostgreSQL in AWS

/content/images/2023/10/tools-22.png

This created a very small, but usable PSQL DB

/content/images/2023/10/tools-23.png

I can now login with psql (had to use posgresql-client-14 even tho my DB is v15)

builder@LuiGi17:~/Workspaces/newNotification$ psql 'postgres://avnadmin:AVNS_xxxxxxxxxxxxxxxxx@pg-295c4a9c-isaac-1040.aivencloud.com:11996/defaultdb?sslmode=require'
psql (14.9 (Ubuntu 14.9-0ubuntu0.22.04.1), server 15.4)
WARNING: psql major version 14, server major version 15.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

defaultdb=>

I can check the version and see the Databases already there

defaultdb=> select version();
                                          version
--------------------------------------------------------------------------------------------
 PostgreSQL 15.4 on x86_64-pc-linux-gnu, compiled by gcc, a c1c19cd459 p 428fabf8fc, 64-bit
(1 row)

defaultdb=> \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 _aiven    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =T/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 defaultdb | avnadmin | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)

This instance will limit me to 20 connections and 5Gb of storage. So it’s definitely a basic hobbyist/starter instance.

Turso

We’ll next checkout Turso.

Clicking Signup prompts use to use Github

/content/images/2023/10/tools-24.png

We’re prompted to setup a Linux CLI during the signup process

/content/images/2023/10/tools-25.png

$ brew install tursodatabase/tap/turso
Running `brew update --auto-update`...
Error: Failed to download https://formulae.brew.sh/api/formula.jws.json!
Failed to download https://formulae.brew.sh/api/cask.jws.json!
Failed to download https://formulae.brew.sh/api/formula_tap_migrations.jws.json!
Failed to download https://formulae.brew.sh/api/cask_tap_migrations.jws.json!
==> Auto-updated Homebrew!
Updated 1 tap (kdash-rs/kdash).

You have 15 outdated formulae installed.

==> Tapping tursodatabase/tap
Cloning into '/home/linuxbrew/.linuxbrew/Homebrew/Library/Taps/tursodatabase/homebrew-tap'...
remote: Enumerating objects: 336, done.
remote: Counting objects: 100% (104/104), done.
remote: Compressing objects: 100% (63/63), done.
remote: Total 336 (delta 66), reused 64 (delta 41), pack-reused 232
Receiving objects: 100% (336/336), 53.97 KiB | 6.00 MiB/s, done.
Resolving deltas: 100% (212/212), done.
Tapped 2 formulae (14 files, 136.1KB).
==> Fetching tursodatabase/tap/turso
==> Downloading https://github.com/tursodatabase/homebrew-tap/releases/download/v0.86.1/homebrew-tap
==> Downloading from https://objects.githubusercontent.com/github-production-release-asset-2e65be/59
############################################################################################# 100.0%
==> Installing turso from tursodatabase/tap
==> Downloading https://formulae.brew.sh/api/formula.jws.json
curl: (60) SSL certificate problem: certificate is not yet valid
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

Warning: formula.jws.json: update failed, falling back to cached version.
==> Downloading https://formulae.brew.sh/api/cask.jws.json
curl: (60) SSL certificate problem: certificate is not yet valid
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

Warning: cask.jws.json: update failed, falling back to cached version.

Welcome to Turso!

If you are a new user, please sign up with turso auth signup; otherwise login
with turso auth login. When you are authenticated, you can create a new
database with turso db create. You can also run turso help for help.

For a more comprehensive getting started guide, open the following URL:

  https://docs.turso.tech/tutorials/get-started-turso-cli

==> Caveats
Bash completion has been installed to:
  /home/linuxbrew/.linuxbrew/etc/bash_completion.d
==> Summary
🍺  /home/linuxbrew/.linuxbrew/Cellar/turso/0.86.1: 6 files, 16.6MB, built in 5 seconds
==> Running `brew cleanup turso`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
==> `brew cleanup` has not been run in the last 30 days, running now...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
Removing: /home/builder/.cache/Homebrew/berkeley-db@5--5.3.28_1... (23.0MB)
Removing: /home/builder/.cache/Homebrew/bzip2--1.0.8... (223KB)
Removing: /home/builder/.cache/Homebrew/expat--2.5.0... (253.4KB)
Removing: /home/builder/.cache/Homebrew/gcc--13.1.0... (111.8MB)
Removing: /home/builder/.cache/Homebrew/gmp--6.2.1_1... (1.1MB)
Removing: /home/builder/.cache/Homebrew/isl--0.26... (2.1MB)
Removing: /home/builder/.cache/Homebrew/k9s--0.27.4... (23.1MB)
Removing: /home/builder/.cache/Homebrew/kdash--v0.4.2.tar.gz... (4.3MB)
Removing: /home/builder/.cache/Homebrew/libffi--3.4.4... (219.6KB)
Removing: /home/builder/.cache/Homebrew/libmpc--1.3.1... (176.5KB)
Removing: /home/builder/.cache/Homebrew/libnsl--2.0.0_1... (43.6KB)
Removing: /home/builder/.cache/Homebrew/libtirpc--1.3.3... (285.0KB)
Removing: /home/builder/.cache/Homebrew/lz4--1.9.4... (277.5KB)
Removing: /home/builder/.cache/Homebrew/mpdecimal--2.5.1... (608.4KB)
Removing: /home/builder/.cache/Homebrew/ncurses--6.4... (2.6MB)
Removing: /home/builder/.cache/Homebrew/readline--8.2.1... (636.5KB)
Removing: /home/builder/.cache/Homebrew/six--1.16.0_3... (31.4KB)
Removing: /home/builder/.cache/Homebrew/thefuck--3.32... (3.2MB)
Removing: /home/builder/.cache/Homebrew/unzip--6.0_8... (173.6KB)
Removing: /home/builder/.cache/Homebrew/zstd--1.5.5... (1.2MB)
Removing: /home/builder/.cache/Homebrew/unzip_bottle_manifest--6.0_8... (7.9KB)
Removing: /home/builder/.cache/Homebrew/xz_bottle_manifest--5.4.3... (7.5KB)
Removing: /home/builder/.cache/Homebrew/ca-certificates_bottle_manifest--2023-05-30... (7.3KB)
Removing: /home/builder/.cache/Homebrew/binutils_bottle_manifest--2.40... (11.4KB)
Removing: /home/builder/.cache/Homebrew/kubernetes-cli_bottle_manifest--1.27.2... (7.3KB)
Removing: /home/builder/.cache/Homebrew/libnsl_bottle_manifest--2.0.0_1... (2.8KB)
Removing: /home/builder/.cache/Homebrew/python@3.11_bottle_manifest--3.11.3... (21.6KB)
Removing: /home/builder/.cache/Homebrew/sqlite_bottle_manifest--3.42.0... (8.1KB)
Removing: /home/builder/.cache/Homebrew/libxcrypt_bottle_manifest--4.4.35... (7.5KB)
Removing: /home/builder/.cache/Homebrew/libedit_bottle_manifest--20221030-3.1... (8.2KB)
Removing: /home/builder/.cache/Homebrew/readline_bottle_manifest--8.2.1... (8.6KB)
Removing: /home/builder/.cache/Homebrew/six_bottle_manifest--1.16.0_3... (1.7KB)
Removing: /home/builder/.cache/Homebrew/libmpc_bottle_manifest--1.3.1... (8KB)
Removing: /home/builder/.cache/Homebrew/mpfr_bottle_manifest--4.2.0-p9... (8KB)
Removing: /home/builder/.cache/Homebrew/k9s_bottle_manifest--0.27.4... (7.3KB)
Removing: /home/builder/.cache/Homebrew/zlib_bottle_manifest--1.2.13-1... (7.2KB)
Removing: /home/builder/.cache/Homebrew/kubectx_bottle_manifest--0.9.4... (1.9KB)
Removing: /home/builder/.cache/Homebrew/isl_bottle_manifest--0.26... (7.6KB)
Removing: /home/builder/.cache/Homebrew/bzip2_bottle_manifest--1.0.8-2... (7KB)
Removing: /home/builder/.cache/Homebrew/thefuck_bottle_manifest--3.32-2... (18.7KB)
Removing: /home/builder/.cache/Homebrew/mpdecimal_bottle_manifest--2.5.1... (8.6KB)
Removing: /home/builder/.cache/Homebrew/zstd_bottle_manifest--1.5.5... (8.3KB)
Removing: /home/builder/.cache/Homebrew/lz4_bottle_manifest--1.9.4... (8KB)
Removing: /home/builder/.cache/Homebrew/openssl@1.1_bottle_manifest--1.1.1u... (8.9KB)
Removing: /home/builder/.cache/Homebrew/expat_bottle_manifest--2.5.0... (8KB)
Removing: /home/builder/.cache/Homebrew/gcc_bottle_manifest--13.1.0... (12.7KB)
Removing: /home/builder/.cache/Homebrew/libffi_bottle_manifest--3.4.4... (8.0KB)
Removing: /home/builder/.cache/Homebrew/berkeley-db@5_bottle_manifest--5.3.28_1... (7.9KB)
Removing: /home/builder/.cache/Homebrew/portable-ruby-2.6.10_1.x86_64_linux.bottle.tar.gz... (10.5MB)
Removing: /home/builder/.cache/Homebrew/krb5_bottle_manifest--1.21... (11.4KB)
Removing: /home/builder/.cache/Homebrew/ncurses_bottle_manifest--6.4-1... (11.0KB)
Removing: /home/builder/.cache/Homebrew/libtirpc_bottle_manifest--1.3.3... (2.7KB)
Removing: /home/builder/.cache/Homebrew/gmp_bottle_manifest--6.2.1_1... (9.2KB)

I first need to sort out a bit of auth

$ turso auth login

Command '/usr/bin/x-www-browser' requires the firefox snap to be installed.
Please install it with:

snap install firefox

error: Unable to open browser.
Visit this URL on this device to log in:
https://api.turso.tech?port=36703&redirect=true&type=cli
Waiting for authentication...
✔  Success! Logged in as idjohnson
✏️  We are so happy you are here! Now that you are authenticated, it is time to create a database:
        turso db create

Which confirmed after I authenticated in a browser

/content/images/2023/10/tools-26.png

I could then use db create to create a database

$ turso db create
Created group default at dfw in 10 seconds.
Created database complete-forgotten-one at group default in 4 seconds.

Start an interactive SQL shell with:

   turso db shell complete-forgotten-one

To see information about the database, including a connection URL, run:

   turso db show complete-forgotten-one

To get an authentication token for the database, run:

   turso db tokens create complete-forgotten-one

This is libsql so it’s a bit different than PSQL. It’s an OS fork of SQLLite (you can find more about it here)

We can still connect and see schema and tables (if exist)

builder@LuiGi17:~/Workspaces/newNotification$ turso db shell complete-forgotten-one
Connected to complete-forgotten-one at https://complete-forgotten-one-idjohnson.turso.io

Welcome to Turso SQL shell!

Type ".quit" to exit the shell and ".help" to list all available commands.

→  .help

  .dump       Render database content as SQL
  .help       List of all available commands.
  .indexes    List indexes in a table or database
  .mode       Set output mode
  .quit       Exit this program
  .read       Execute commands from a file
  .schema     Show table schemas.
  .tables     List all existing tables in the database.
→  .tables
→  .schema
→  .dump
PRAGMA foreign_keys=OFF;
→

Summary

I hope you enjoyed this walkthrough of a few Open Source tools I’ve found as of late and think are pretty solid. I certainly plan to keep OpenStatus in my mix (since Uptime Kuma is hosted in my network so clearly a sustained power outage at my house/datacenter would mean no checks). I plan to keep Resend in the mix with SendGrid. I’m not sure I’ll go all in with a new SQL database format like libsql. However, I’m a fan of Aiven and will keep them in the list always.

Omniscient OpenStatus Resend Aiven Turso

Have something to add? Feedback? Try our new forums

Isaac Johnson

Isaac Johnson

Cloud Solutions Architect

Isaac is a CSA and DevOps engineer who focuses on cloud migrations and devops processes. He also is a dad to three wonderful daughters (hence the references to Princess King sprinkled throughout the blog).

Theme built by C.S. Rhymes