sl0ck@slickerius.net

Projects

  1. BeatlesGuessr

    • Python
    • FastAPI
    • React
    • Vite
    • WebSockets
    • FFmpeg
    • SQLite
    • Amazon S3
    • Docker
    • Kubernetes

    GeoGuessr for Beatles songs. Hear a clip as short as one second, name the track before the clock runs out, and duel friends for a place on the Elo ladder.

    https://beatlesguessr.slickerius.net↗BeatlesGuessr landing page with a 1964 photo of the band
  2. FreeShare

    • Java
    • Android
    • Wi-Fi Direct
    • Gradle
    • GitHub Actions

    An Android app that shares a phone's internet connection with no root and no app-level speed limit. It creates a Wi-Fi Direct network and runs an HTTP and HTTPS proxy on it, which tunnels HTTPS without decrypting it. I made it because my phone kept connecting to my apartment's Wi-Fi while my laptop could not. 🥲

    How FreeShare shares a connection Another device joins the Wi-Fi Direct network made by the FreeShare app and uses its proxy at 192.168.49.1 port 8282. The proxy forwards traffic through the phone's internet connection. HTTPS is tunnelled and never decrypted. Another deviceproxy 192.168.49.1:8282 FreeShareWi-Fi Direct networkHTTP and HTTPS proxy Internetthe phone's connection joins forwards HTTPS is tunnelled, never decrypted
  3. The home cluster

    • k3s
    • Kubernetes
    • Flux
    • SOPS and age
    • ingress-nginx
    • Cloudflare
    • Certbot
    • GitHub Actions

    A multicloud cluster for my personal projects, with nodes across different cloud providers.

    Home cluster architecture Cloudflare sends traffic to ingress-nginx on the control plane of a k3s cluster. Four more nodes run the workloads, and one of them also runs Flux. All nodes are joined by a WireGuard overlay. CI builds images to GHCR and pins their SHA in the sl0ck-k8s repo, the nodes pull the images, and Flux applies the repo. k3s cluster Control plane ingress-nginxTLS Node 1 Workload A Node 2 Workload B Node 3 Workload C Workload D Node 4 Fluxcontrollers Workload E WireGuard overlay between all nodes Cloudflare App repos + CI builds GHCR imagespulled by the nodes sl0ck-k8s repopulled by Flux pin image SHA
  4. Slocky's Musicollection

    • Next.js
    • TypeScript
    • Strapi
    • SQLite
    • Docker
    • Kubernetes

    The music archive. Albums that were previously lost media, mostly Indonesian releases from the 70s and 80s, preserved in FLAC and searchable by year, label and genre.

    https://archive.slickeri.us↗Archive table listing albums with year, label and format
  5. IrnusDL

    • Python
    • Django
    • Gunicorn
    • aiohttp
    • nginx
    • Docker

    A downloader for Irama Nusantara albums. Paste an album URL and get the files.

    https://irnus-dl.slickeri.us↗IrnusDL home page with one input for an album URL
  6. DChain Mimic

    • Solidity
    • Hardhat
    • Ethereum
    • Hyperledger Besu
    • ethers.js
    • Next.js
    • Terraform
    • Shell

    A decentralised web app for student certificates, built for a distributed systems course. Certificates are minted as ERC-721 tokens by Ethereum smart contracts, developed and tested in a Hardhat environment.

    DChain Mimic architecture A university, a student and the public use a Next.js frontend with a MetaMask wallet. The frontend talks to three Ethereum smart contracts on a Hardhat network. DegreeToken is an ERC-721 registry, UniversityContract holds students, courses and curricula, and CurriculumContract holds academic records and mints a degree when a curriculum is complete. University Student Anyone Next.js frontendethers.jsMetaMask signeradd recordsview a studentfind a degree RPC Ethereum, Hardhat network DegreeTokenERC-721 degrees and the university registry UniversityContractstudents, courses and curricula CurriculumContractmandatory courses and academic records registers deploys mints a degree
  7. Javanese Transliteration

    • TypeScript
    • React
    • Vite
    • Tailwind CSS
    • carakan.js
    • Chrome extension

    A Chrome extension that turns Latin typing into Javanese script as you type and can be switched on and off from a popup.

    A post being typed on X with the Latin letters turning into Javanese script as they are entered
    The extension popup with a single switch labelled Enable transliteration
  8. Secure Communiqué

    • Go
    • Fyne
    • XMPP
    • OMEMO
    • WebRTC
    • SQLite
    • GStreamer

    My bachelor's thesis, a desktop app for secure messaging and calls, written in Go with Fyne. Text is encrypted end to end with XMPP and OMEMO, and video and voice run over WebRTC. The thesis analysed and evaluated the OMEMO encryption architecture.

    https://github.com/Slickerius/thesis-project↗Secure Communiqué desktop app with a conversation list and an open chat
    Secure Communiqué architecture Two clients talk through an XMPP server. Text messages are encrypted end to end with OMEMO, using X3DH key agreement and a Double Ratchet, and the server only relays ciphertext and stores key bundles. For calls, the clients exchange Jingle messages with SDP and ICE candidates through the server, then send voice and video directly to each other over WebRTC with DTLS-SRTP. Alice OMEMO textX3DH key agreementDouble Ratchetkey per message WebRTC callsJingle signallingICE and DTLS-SRTPGStreamer media Bob OMEMO textpublishes key bundleown Double Ratchetdecrypts on device WebRTC callsJingle signallingICE and DTLS-SRTPGStreamer media XMPP serverrelays ciphertextstores key bundlescarries Jingle messagesnever sees plaintext ciphertextciphertext key bundlekey bundle SDP, ICESDP, ICE Voice and video, encrypted with DTLS-SRTPsent directly between the two clients when ICE finds a path

    OMEMO does not say how Alice learns Bob's first Double Ratchet key, so I had Bob publish a temporary ratchet key to his PEP node next to the key bundle. Alice fetches both and starts her ratchet from it, and it is replaced after each session.

    Publishing the ratchet key to PEP Bob publishes his key bundle and a temporary Double Ratchet public key to his PEP node on the XMPP server. Alice fetches both, runs X3DH with four Diffie-Hellman operations, and starts her Double Ratchet from his temporary key. She sends a key exchange message with the first ciphertext. Bob answers from his stored private key, then publishes a fresh bundle and a fresh temporary key. Bob Before anyone writesmakes a key bundlemakes a ratchet key pairkeeps the private half After the first messagestarts his ratchet fromthe stored private key Alice Starting a chatX3DH with four DH stepsratchet starts fromBob's temporary key Sendskey exchange messagewith the first ciphertext Bob's PEP node identity keysigned prekeyone-time prekeys TmpDhPubKey the extra key, not inthe OMEMO spec 1 Publish 2 Fetch both 3 Send3 Deliver Single use, replaced after each session like the one-time prekey Bob publishes a fresh bundle and a fresh TmpDhPubKey once the session is set up
  9. EAI Job Scraper

    • TypeScript
    • Node.js
    • Express
    • Puppeteer
    • MongoDB
    • Next.js
    • Tailwind CSS
    • Flutter
    • Docker Compose

    A scraper that periodically collects job listings from Glints, Kalibrr, Jobstreet and LinkedIn into MongoDB and shows them on a single web page.

    EAI Job Scraper architecture A scraper service uses Puppeteer on a schedule to collect job postings from Glints, Kalibrr, Jobstreet and LinkedIn into MongoDB. An API service filters them by title, place, company and date, and serves a Next.js web app and a Flutter mobile app. GlintsKalibrrJobstreetLinkedInScraper servicePuppeteernode-cronruns on a schedulesame fields forevery source MongoDBjob postings API servicefilter by title,place, company,date Web appNext.js Mobile appFlutter