diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 3160275..0000000 Binary files a/.DS_Store and /dev/null differ diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..e838d47 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,23 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/ubuntu +{ + "name": "Ubuntu-Hugo", + // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile + "image": "mcr.microsoft.com/devcontainers/base:jammy", + "forwardPorts": [1313], + "features": { + "ghcr.io/devcontainers/features/hugo:1": { + "extended": true, + "version": "0.119.0" + } + } + + // Use 'postCreateCommand' to run commands after the container is created. + // "postCreateCommand": "uname -a", + + // Configure tool-specific properties. + // "customizations": {}, + + // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. + // "remoteUser": "root" +} diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..073bb41 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,8 @@ +version: 2 +updates: + - package-ecosystem: gitsubmodule + directory: "/" + schedule: + interval: daily + labels: + - "dependency" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea9ad60 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ + +*.lock diff --git a/cloudflare-build.sh b/cloudflare-build.sh new file mode 100644 index 0000000..9ecd260 --- /dev/null +++ b/cloudflare-build.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +#curl -L -s https://api.github.com/repos/gohugoio/hugo/releases/latest | grep "browser_download_url.*extended.*linux-amd64.tar.gz" | cut -d : -f 2,3 | sed 's/"//g' | xargs wget + +wget https://github.com/gohugoio/hugo/releases/download/v0.119.0/hugo_0.119.0_Linux-64bit.tar.gz + +tar xvf ./*.tar.gz +chmod u+x ./hugo + +if [ "$CF_PAGES_BRANCH" == "main" ]; then + ./hugo --minify +else + ./hugo -b "$CF_PAGES_URL" +fi diff --git a/config.yml b/config.yml index 58b5e1f..75e412c 100644 --- a/config.yml +++ b/config.yml @@ -1,9 +1,9 @@ baseURL: "https://tommytran.io" -title: Tommy Tran +title: Tommy Tran - System Administrator and Technical Writer theme: WonderMod -copyright: '©Thien Tran 2021-2022' +copyright: '©Thien Tran 2021-2023' enableRobotsTXT: true -#enableGitInfo: true +enableGitInfo: true minify: disableXML: true @@ -29,35 +29,37 @@ params: assets: disableHLJS: true disableFingerprinting: false - favicon: "/favicon/favicon.ico" - favicon16x16: "/favicon/favicon-16x16.png" - favicon32x32: "/favicon/favicon-32x32.png" - apple_touch_icon: "/favicon/apple-touch-icon.png" - safari_pinned_tab: "/favicon/safari-pinned-tab.svg" + favicon: "/favicon.ico" + favicon16x16: "/favicon-16x16.png" + favicon32x32: "/favicon-32x32.png" + apple_touch_icon: "/apple-touch-icon.png" + safari_pinned_tab: "/safari-pinned-tab.svg" label: - text: "TommyTran.io" + text: "Tommy Tran" + icon: "/cortana.png" # profile-mode profileMode: enabled: true # needs to be explicitly set title: Tommy Tran subtitle: "System Administrator and Technical Writer" + imageUrl: "/cortana.png" buttons: - name: About url: about - name: Contact url: contact - - name: PGP Key - url: gpg.asc socialIcons: - name: github url: "https://github.com/tommytran732" - name: gitea - url: "https://git.tommytran.io/tomster" + url: "https://git.tommytran.io/Tomster" - name: matrix - url: "https://matrix.to/#/@tommy:arcticfoxes.net" + url: "https://invite.arcticfoxes.net/#/@tommy:arcticfoxes.net" + - name: telegram + url: "https://t.me/tommytran732" - name: twitter url: "https://twitter.com/tommytran732" - name: email @@ -110,13 +112,13 @@ menu: name: Projects url: /projects/ weight: 20 - - identifier: Services - name: Services - url: /services/ + - identifier: Packages + name: Packages + url: /packages/ weight: 30 - - identifier: Hire Me! - name: Hire Me! - url: /hire-me/ + - identifier: PGP + name: PGP + url: tommy.asc weight: 40 privacy: diff --git a/content/about.md b/content/about.md index 5aa755a..20a7081 100644 --- a/content/about.md +++ b/content/about.md @@ -7,8 +7,8 @@ date: 2022-09-02 Hey there 👋 -My name is Thien, but I mostly go by "Tommy" nowadays. I am an enthusiastic Linux system administrator around 4 years of experience. I am familiar with most major Linux families, from Red Hat to Debian to SUSE to Arch Linux. Recently, my interest has shifted to immutable distributions such as Fedora Silverblue/CoreOS and openSUSE MicroOS. +My name is Thien, but I mostly go by "Tommy" nowadays. I am an Linux system administrator around 4 years of experience. I am familiar with most major Linux families, from Red Hat to Debian to SUSE to Arch Linux. Recently, my interest has shifted to immutable distributions such as Fedora Silverblue/CoreOS and openSUSE MicroOS. Like most Linux users, I am an open source enthusiast and publish most of the projects made in my free time on [GitHub](https://github.com/tommytran732) and [my own Gitea instance](https://git.tommytran.io/tomster). I also made a couple of small contributions to various projets on GitHub as well. -If you are active in the privacy communities on Matrix, you may recognize me. I used to be a collaborator for [PrivacyGuides.org](https://privacyguides.org) and wrote a large portion of the site from around October 2021 - July 2022. Now, I am now working on my own website - [PrivSec.dev](https://privsec.dev) - with a couple of friends I "met" through [GrapheneOS](https://grapheneos.org). Oh, while we are on this topic, I am also a moderator in the official GrapheneOS channels as well (though not a developer or project member). Or, you may just know me as that one guy who loves throwing a hypervisor at every problem he encounters, typical of a Qubes OS user. \ No newline at end of file +If you are active in the privacy communities on Matrix, you may recognize me. I used to be a collaborator for [PrivacyGuides.org](https://privacyguides.org) and wrote a large portion of the site from around October 2021 - July 2022. Now, I am now working on my own website - [PrivSec.dev](https://privsec.dev) - with a couple of friends I "met" through [GrapheneOS](https://grapheneos.org). Oh, while we are on this topic, I am also a moderator in the official GrapheneOS channels as well (though not a developer or project member). Or, you may just know me as that one guy who loves throwing a hypervisor at every problem he encounters, typical of a Qubes OS user. diff --git a/content/contact.md b/content/contact.md index 4ce2b4d..abbada6 100644 --- a/content/contact.md +++ b/content/contact.md @@ -5,13 +5,50 @@ date: 2022-09-02 ![Matrix](/images/matrix.jpg) -I highly recommend that you contact me via Matrix, so we could take advantage of their end to end encryption. My Matrix is [@tommy:arcticfoxes.net](https://matrix.to/#/@tommy:arcticfoxes.net). +## Matrix -In case you do not have a Matrix account, you can sign up for one on my homeserver [arcticfoxes.net](https://arcticfoxes.net) or on [matrix.org](https://app.element.io). Alternatively, check out [joinmatrix.org](https://joinmatrix.org/servers/) for a list of public homeservers. I do not ask for your email address or any personal information for registration on [arcticfoxes.net](https://arcticfoxes.net). All you need to provide is a username and password. +The best way to contact me is through Matrix. My account is [@tommy:arcticfoxes.net](https://invite.arcticfoxes.net/#/@tommy:arcticfoxes.net). If you do not have a an account, you can sign up for one on my homeserver [arcticfoxes.net](https://arcticfoxes.net). I do not ask for your email address or any personal information for registration. -If you prefer to reach out to me via email, my address is contact@tommytran.io. You can use my GPG Key to encrypt the messages. Aliases: +## SimpleX Chat -- tommy@privsec.dev -- tommy@arcticfoxes.net +My SimpleX Chat address is `https://simplex.chat/contact#/?v=1-4&smp=smp%3A%2F%2FN_McQS3F9TGoh4ER0QstUf55kGnNSd-wXfNPZ7HukcM%3D%40smp19.simplex.im%2F03zrijd3pM0hi2AG6XLiMMpxEsjEqj_5%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAx3xSpEh_hRUiGatqlRxGajqIcg6H6xc9jf-2UfeJGA4%253D%26srv%3Di53bbtoqhlc365k6kxzwdp5w3cdt433s7bwh3y32rcbml2vztiyyz5id.onion` -Please by wary of anyone claiming to be me or using the handle "TommyTran732" reaching out to you. Chances are, they are an impersonator. You can always contact me via Matrix or Email for identity verification. \ No newline at end of file +You can scan the QR code here: + +![SimpleX Chat](/images/simplex-chat-address.png) + +## Telegram + +My Telegram is [TommyTran732](https://t.me/tommytran732). I do not check it as often as I do with Matrix. When contacting me, please use the [Secret Chat](https://telegram.org/faq#q-how-do-i-start-a-secret-chat) feature. + +## Email + +If you prefer to reach out to me via email, my address is [contact@tommytran.io](mailto:contact@tommytran.io). I do not use PGP for emails. Aliases: + +- [tommy@privsec.dev](mailto:tommy@privsec.dev) +- [tommy@arcticfoxes.net](mailto:tommy@arcticfoxes.net) + +## Other Accounts + +Discord: +- TommyTran732 + +Twitter: + +- [@TommyTran732](https://twitter.com/tommytran732) +- [@PrivSec_Dev](https://twitter.com/privsec_dev) + +Reddit: +- [PrivSec_Dev](https://www.reddit.com/user/privsec_dev) + +My Git accounts: +- [GitHub](https://github.com/tommytran732) +- [GitLab](https://gitlab.com/tommytran732) (inactive) +- [Gitea](https://git.tommytran.io/tomster) + +Packaging: +- [AUR](https://aur.archlinux.org/account/TommyTran732) (login required) +- [Docker Hub](https://hub.docker.com/u/tommytran732) (inactive) +- [Quay.io](https://quay.io/tommytran732) + +Please by wary of anyone claiming to be me or using the handle "TommyTran732" reaching out to you. Chances are, they are an impersonator. You can always contact me via Matrix or Email for identity verification. diff --git a/content/hire-me.md b/content/hire-me.md deleted file mode 100644 index 65fc072..0000000 --- a/content/hire-me.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "Hire Me" -date: 2022-09-02 ---- - -![rchsa](/images/rhcsa.png) - -I am graduating in a few months and I am looking for a full-time sysadmin job. If you are interested in hiring me, please send me an email at contact@tommytran.io. - -I will not be posting my full resume here for privacy reasons, but here are the the certifications I have gotten so far: - -- **Red Hat Certified System Administrator** | ID: 200-058-41 -- **Linux Foundation Certified System Administrator** | ID: LFCS-2000-002661-01 -- **SUSE Certified Administrator for SUSE Linux Enterprise 15** | ID: 2107 (2021-04-24) -- **CompTIA Linux+** (QYRCZ8BM0HE11LK) -- **CompTIA ITF+** (MJ29K56PQC44QWWG) -- **Linux Professional Institute Linux Essentials** (ju2ycbghb9) \ No newline at end of file diff --git a/content/packages.md b/content/packages.md new file mode 100644 index 0000000..6d3f25e --- /dev/null +++ b/content/packages.md @@ -0,0 +1,23 @@ +--- +title: "Packages" +date: 2022-09-03 +--- + +## Synapse +![Matrix](/images/matrix.jpg) + +I have a [simple fork](https://github.com/tommytran732/Synapse-Docker) of [Wonderfall's hardened Synapse Docker image](https://github.com/Wonderfall/docker-synapse) with the [Mjolnir module](https://github.com/matrix-org/mjolnir/blob/main/docs/synapse_module.md) support and the default (as opposed to light) variant of the [Hardened Memory Allocator](https://github.com/GrapheneOS/hardened_malloc). + +You can obtain the image by pulling `ghcr.io/tommytran732/synapse` or `quay.io/tommytran732/synapse`. + +## Matrix.to + +I made an Alpine Docker container for [Matrix.to](https://matrix.to) that you obtain by pulling `ghcr.io/tommytran732/matrix.to`. The default instance has been changed from [Element.io](https://app.element.io) to [ArcticFoxes.net](https://element.arcticfoxes.net). + +## pamac-flatpak AUR + +![pamac](/images/pamac.png) + +I maintain the [`pamac-flatpak`](https://aur.archlinux.org/packages/pamac-flatpak), [`pamac-flatpak-gnome`](https://aur.archlinux.org/packages/pamac-flatpak-gnome), and [`libpamac-flatpak`](https://aur.archlinux.org/packages/libpamac-flatpak) AUR packages. Originally, they were forks of [`pacmac-all`](https://aur.archlinux.org/packages/pamac-all) and [`libpamac-all`](https://aur.archlinux.org/packages/libpamac-nosnap) with snapd removed. I found snapd to be quite annoying - it is yet another AUR package I don't need, requires `cgroupsv1` for confinement, does not integrate with `gnome-software`, makes lots of loopback mounts, and so on. + +Nowadays, they are based on the [`pamac-nosnap`](https://aur.archlinux.org/packages?O=0&K=pamac-nosnap) package with some minor changes to make the build and installation process nicer and more convenient. diff --git a/content/projects.md b/content/projects.md index f45424f..f37624d 100644 --- a/content/projects.md +++ b/content/projects.md @@ -11,6 +11,18 @@ date: 2022-09-02 We focus on in-depth system configuration, security analysis, and software/hardware recommendations. Our site is based on technical merits, not ideologies and politics. +## ArcticFoxes.net + +![ArcticFoxes.net](/images/arcticfoxes.png) + +[ArcticFoxes.net](https://arcticfoxes.net) is a group of self hosted and federated services run by me. It consists of: + +- [A Matrix server](https://matrix.arcticfoxes.net) using my [hardened docker image](https://github.com/tommytran732/Synapse-Docker). I also have a [web client](https://element.arcticfoxes.net) and TURN server as accessories for the Matrix server. +- [A Nitter instance](https://nitter.arcticfoxes.net) +- [A OpenVPN to ONC converter](onc.arcticfoxes.net). This is a simpel fork of [thomkeh/ovpn2onc](https://github.com/thomkeh/ovpn2onc) with a dark theme. + +Most of the configurations and deployment files are available on [GitHub](https://github.com/ArcticFoxes-net). + ## Pterodactyl Script ![Pterodactyl](/images/pterodactyl.png) @@ -21,6 +33,16 @@ The [Pterodactyl Script](https://github.com/tommytran732/Pterodactyl-Script) is ![Arch Linux](/images/archlinux.jpg) -The Arch Setup Script is a script that I wrote to automate my Arch Linux installation which mimics openSUSE's setup with BTRFS and Snapper. At the time, there was no other installer that does this nicely because they all use the same flat layout as recommended in the Arch Wiki. The downside of using this layout is that snapper rollback does not work properly and the user has to get into the Arch ISO to manually rollback their system. This could be solved by using the openSUSE's layout for BTRFS, and I forked Easy Arch to do just that. +The Arch Setup Script is a script that I wrote to automate my Arch Linux installation which mimics openSUSE's setup with BTRFS and Snapper. At the time, there was no other installer that does this nicely because they all use the same flat layout as recommended in the Arch Wiki. The downside of using this layout is that snapper rollback does not work properly and the user has to get into the Arch ISO to manually rollback their system. This could be solved by using the openSUSE's layout for BTRFS, and I forked Easy Arch to do just that. -Over time, I have been adding more security/privacy related settings by default (such as randomized MAC address, IPv6 Privacy, Apparmor, Kernel module blacklist, encrypted /boot). The project is still actively developed, and many of the changes I made are merged upstream as well. \ No newline at end of file +Over time, I have been adding more security/privacy related settings by default (such as randomized MAC address, IPv6 Privacy, Apparmor, Kernel module blacklist, encrypted /boot). The project is still actively developed, and many of the changes I made are merged upstream as well. + +## Fedora CoreOS Ignition Files + +![Fedora CoreOS](/images/fedora-coreos.png) + +These are sample [Butane/Ingition configuration files](https://github.com/tommytran732/Fedora-CoreOS-Ignition) that you can adapt to quickly deploy a Fedora CoreOS server with the containers of your choice. + +Out of the box, you will have a set of hardened boot parameters, sysctl settings, along with a set of kernel module blacklist from Whonix's [security-misc](https://github.com/Kicksecure/security-misc/blob/master/etc/modprobe.d/30_security-misc.conf). The configurations will also give you a basic setup with Firewalld, Fail2ban, seboolean, and NTS to tighten down security. + +I use these same configurations on my production servers. diff --git a/content/services.md b/content/services.md deleted file mode 100644 index a962c3e..0000000 --- a/content/services.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: "Services" -date: 2022-09-02 ---- - -![ArcticFoxes](/images/arcticfoxes.png) - -I run some public services that you could use: - -- [ArcticFoxes.net](https://arcticfoxes.net), a small Matrix homeserver for cool nerds to hang around. Registration is open. - -- My own [Gitea instance](https://git.tommytran.io). It currently is a mirror of my public repositories and a few other projects that I find interesting. Registration is closed. - -I am quite busy right now, but I am looking at deploying Mastodon and PrivateBin in the near future. When the Gitea federation comes to fruition, I will consider converting my private Gitea instance into a public one under [ArcticFoxes.net](https://arcticfoxes.net) as well. \ No newline at end of file diff --git a/netlify.toml b/netlify.toml deleted file mode 100644 index 56f9567..0000000 --- a/netlify.toml +++ /dev/null @@ -1,33 +0,0 @@ -[build.environment] - HUGO_VERSION = "0.102.2" - -[context.deploy-preview] - command = "hugo -b $DEPLOY_PRIME_URL" - -[[plugins]] -package = "netlify-plugin-checklinks" - - [plugins.inputs] - # An array of glob patterns for pages on your site - # Recursive traversal will start from these - entryPoints = [ - "*.html", - ] - - # Recurse through all the links and asset references on your page, starting - # at the entrypoints - recursive = true - - # Checklinks outputs TAP (https://testanything.org/tap-version-13-specification.html) - # by default. Enabling pretty mode makes the output easier on the eyes. - pretty = true - - # You can mark some check as skipped, which will block checklinks - # from ever attempting to execute them. - # skipPatterns is an array of strings you can match against failing reports - skipPatterns = [ - "public/index.html", - "public/about/index.html", - "public/contact/index.html", - "public/404.html", - ] diff --git a/static/.well-known/openpgpkey/hu/dj3498u4hyyarh35rkjfnghbjxug6b19 b/static/.well-known/openpgpkey/hu/dj3498u4hyyarh35rkjfnghbjxug6b19 new file mode 100644 index 0000000..7e7257b Binary files /dev/null and b/static/.well-known/openpgpkey/hu/dj3498u4hyyarh35rkjfnghbjxug6b19 differ diff --git a/.hugo_build.lock b/static/.well-known/openpgpkey/policy similarity index 100% rename from .hugo_build.lock rename to static/.well-known/openpgpkey/policy diff --git a/static/.well-known/security.txt b/static/.well-known/security.txt new file mode 100644 index 0000000..bfae56e --- /dev/null +++ b/static/.well-known/security.txt @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +Contact: https://matrix.to/#/@tommy:arcticfoxes.net +Contact: https://simplex.chat/contact#/?v=1-4&smp=smp%3A%2F%2FN_McQS3F9TGoh4ER0QstUf55kGnNSd-wXfNPZ7HukcM%3D%40smp19.simplex.im%2F03zrijd3pM0hi2AG6XLiMMpxEsjEqj_5%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAx3xSpEh_hRUiGatqlRxGajqIcg6H6xc9jf-2UfeJGA4%253D%26srv%3Di53bbtoqhlc365k6kxzwdp5w3cdt433s7bwh3y32rcbml2vztiyyz5id.onion +Contact: mailto:contact@tommytran.io +Expires: 2024-11-05T00:00:00.000Z +Preferred-Languages: en-US, vi-VN +Canonical: https://tommytran.io/security.txt +-----BEGIN PGP SIGNATURE----- + +iHUEARYIAB0WIQT2xV5SweW8phRp+2fTDewmjT/rFwUCZUdsbQAKCRDTDewmjT/r +F/p+AQCX8BhWbTttVGZ8J7AAda7VBQEX06dowEHKCInIy65k9gEA8Q7zpP0gOb7h +JT39PRZj+cHFX7u9aYTABEmk1EwNogA= +=nxMV +-----END PGP SIGNATURE----- diff --git a/static/_headers b/static/_headers index e400e22..8f49b61 100644 --- a/static/_headers +++ b/static/_headers @@ -1,14 +1,23 @@ /* Strict-Transport-Security : max-age=63072000; includeSubDomains; preload - Content-Security-Policy : default-src 'none'; connect-src 'self'; img-src 'self'; script-src 'self'; style-src 'self'; frame-src https://www.youtube-nocookie.com; form-action 'none'; frame-ancestors 'none'; block-all-mixed-content; base-uri 'none' + Content-Security-Policy : default-src 'none'; connect-src 'self'; img-src 'self'; script-src 'self'; style-src 'self'; form-action 'none'; frame-ancestors 'none'; upgrade-insecure-requests; block-all-mixed-content; base-uri 'none' X-Content-Type-Options : nosniff Referrer-Policy : no-referrer - # Cross-Origin-Opener-Policy : same-origin X-Frame-Options : DENY X-XSS-Protection : 0 Permissions-Policy : accelerometer=(), ambient-light-sensor=(), autoplay=(), battery=(), camera=(), clipboard-read=(), display-capture=(), document-domain=(), encrypted-media=(), fullscreen=(), geolocation=(), gyroscope=(), hid=(), idle-detection=(), interest-cohort=(), magnetometer=(), microphone=(), midi=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), usb=(), sync-xhr=(), xr-spatial-tracking=() Cross-Origin-Resource-Policy : same-origin - Expect-CT: enforce, max-age=63072000 + Cross-Origin-Embedder-Policy : require-corp + # Cross-Origin-Opener-Policy : same-origin /*.xml - Content-Security-Policy : default-src 'none'; img-src 'self' data: https://www.w3.org/; style-src 'self' 'unsafe-inline'; block-all-mixed-content; base-uri 'none' + Content-Security-Policy : default-src 'none'; img-src 'self' data: https://www.w3.org/; style-src 'self' 'unsafe-inline'; upgrade-insecure-requests; block-all-mixed-content; base-uri 'none' + +/*.png + Cross-Origin-Resource-Policy : cross-origin + +/*.jpg + Cross-Origin-Resource-Policy : cross-origin + +/.well-known/openpgpkey/hu/* + Access-Control-Allow-Origin: * diff --git a/static/favicon/apple-touch-icon.png b/static/apple-touch-icon.png similarity index 100% rename from static/favicon/apple-touch-icon.png rename to static/apple-touch-icon.png diff --git a/static/favicon/favicon-16x16.png b/static/favicon-16x16.png similarity index 100% rename from static/favicon/favicon-16x16.png rename to static/favicon-16x16.png diff --git a/static/favicon/favicon-32x32.png b/static/favicon-32x32.png similarity index 100% rename from static/favicon/favicon-32x32.png rename to static/favicon-32x32.png diff --git a/static/favicon/favicon.ico b/static/favicon.ico similarity index 100% rename from static/favicon/favicon.ico rename to static/favicon.ico diff --git a/static/gpg.asc b/static/gpg.asc deleted file mode 100644 index 49fae68..0000000 --- a/static/gpg.asc +++ /dev/null @@ -1,101 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -RfEUGQb7FolM -=DBNe ------END PGP PUBLIC KEY BLOCK----- \ No newline at end of file diff --git a/static/images/fedora-coreos.png b/static/images/fedora-coreos.png new file mode 100644 index 0000000..1a17d5e Binary files /dev/null and b/static/images/fedora-coreos.png differ diff --git a/static/images/pamac.png b/static/images/pamac.png new file mode 100644 index 0000000..ae9381f Binary files /dev/null and b/static/images/pamac.png differ diff --git a/static/images/simplex-chat-address.png b/static/images/simplex-chat-address.png new file mode 100644 index 0000000..9921bc7 Binary files /dev/null and b/static/images/simplex-chat-address.png differ diff --git a/static/favicon/safari-pinned-tab.svg b/static/safari-pinned-tab.svg similarity index 100% rename from static/favicon/safari-pinned-tab.svg rename to static/safari-pinned-tab.svg diff --git a/static/sshkey b/static/sshkey new file mode 100644 index 0000000..3546a2b --- /dev/null +++ b/static/sshkey @@ -0,0 +1 @@ +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINkTKkJS7Id1WCyA5Klu/moLG9mP5hTC+v2qYqypMF1u contact@tommytran.io diff --git a/static/sshkeys b/static/sshkeys deleted file mode 100644 index 4161e07..0000000 --- a/static/sshkeys +++ /dev/null @@ -1,2 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDbVNnQVs6SVW1GvQQ7FE6afs08LMtTNmDIPtoT3+Aqa7I3HOZRgWpqh3kIz3OTOCs2zl5JHCJDaANvadjGFcdtSI+zy7bozpj5TJWGDnGkH3Rp2SBBRK6twjjrN9nbTJ2ihlkXEOA2e3SDFXEkwu6t0fLZelBUk3FWnbK/xPmsRUuEF90oxpXpZIPeFbE4nNK3HarNPL+XzA2xzSqrwNk9ICCJ9MS3OcnPpWIQR3LKLEgyPFKwy4K6WzQyNvr5uFAcV9Zrq9TM93HSOUdtFFXcDeAEu76cQorsgAyU7XbAPqSza780qF/kHhQ+Hb4q1Wmyk62nAu7dT86lujpzIWXOdFJZyb3WWjP21qe7bk8A1S5Q9lfto/bo0Rs2wHbBRtoxMrb8DTC3EtErjN/IXMZrqMZpj3hNiNxP3PYKXLWb6AbuWjQO5d4Tu4vv4QWKGyJwvkI55V0sI9a2lLODAK+x9z4K7cbGLFHqdEFCLkq7sDU3zd9q68//M/LQO3AO9sMpd8jHDg0xdgdfh5dP6grUDypz1h/HtXCT+w3Ka2geitqoTMv6y0WO1vT+c97mvbjf24rwoLiPe7qVPnxKTRPNRH1vhmOLeZsQva2ATXBCR/J+Xn4JzSWOt17N/s5ldvfD+d6FrYzDNw664efaXMIWCbVJtlKvas0I9iM2VYRM7Q== -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDcmfm4RKkVC02QrF6ajGVVlbO3+AiVVyfoO4jbUjNbBNarVNgOHNC2lyxo3DJG33uKg74/e6fwj2mr2qW7Bq/yefmMqZrwY6ZyBDOOnkmsaMjX3Q5dJVRvHaYDShseJEBVtALVZFPyYQhdCdCEI/pO1Oeh+bDgLFinWoKAx6Fau8ArjbCsU4WfmgTUQae8AkE5e+uj+2T7Nq195CgfWEnAcKTKEYTr+6Y5a8L/w6ugto41bXvbwWhgogMT7epkcsfSF14M5hi0kBTawmzSi6HsqnAs4PWadaN0IMtfZJ/ZdpNw2QjdDKReGc3AcvEUQU9840RgVmXLp0JT5kdHJZabYcpPaDRwTw3A/oNIEZCzOKve8j4aFrf003etUn7Vq5wchyqyRrk2KRnK61v8BOtF7REs5jw/hQ1PdbsGewhxmGQy3gJ670BS1apQDvrZVHUqIsl3SGcykBBQvLu0F5erZ3ENPAk0wb++ygBtqsoF0wV9rv+L/VEh7233/TUQbH6K2ggZg5SvQnjUA4JqnBcSPf8kMlEGCU+8yeGSF086vL3gpVF6VpvUa34Sh+RbLGtNPVcoTSa2yLwSHdU0NmA9Lj/0M3+ty+uK4pBU86zIIAmyB9NBN/TcpeR7PVi3J991EbVLZgwzAK7S/LAmE6vWLG1IoQbDDN7QCB9XWiFiaQ== \ No newline at end of file diff --git a/static/tommy.asc b/static/tommy.asc new file mode 100644 index 0000000..bb55855 --- /dev/null +++ b/static/tommy.asc @@ -0,0 +1,17 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mDMEZUdTmhYJKwYBBAHaRw8BAQdAhXJo1MA3p2d9ei2CS3jrGXSodpJ6srUyRtRW +m1vBhrS0IVRoaWVuIFRyYW4gPGNvbnRhY3RAdG9tbXl0cmFuLmlvPoiWBBMWCAA+ +FiEE9sVeUsHlvKYUaftn0w3sJo0/6xcFAmVHU5oCGwMFCQHhM4AFCwkIBwIGFQoJ +CAsCBBYCAwECHgECF4AACgkQ0w3sJo0/6xevWAD7BXv7f/OyLJ+tTkENbxZX2TIF +TaN2UaGtR4bTuTyD6yUBALlEmA6rvjyFd9ntzFeDo6y9tbXS8OHSxLF4TUQdI5AM +uDgEZUdTmhIKKwYBBAGXVQEFAQEHQLz2RFSlF5ZHWqqMkk5PSquvhWqWFKHApVxQ +IB8+rrEuAwEIB4h+BBgWCAAmFiEE9sVeUsHlvKYUaftn0w3sJo0/6xcFAmVHU5oC +GwwFCQHhM4AACgkQ0w3sJo0/6xedZQD8CmMzBWgtsthI/uAxBt3tEj/ntKavJlek +cTXhGIjp6KMA/3IcpK5QMB4uFKQEa+tK0Yi1Yf7KvqsgRkHRCVlkJ1UMuDMEZUdT +6RYJKwYBBAHaRw8BAQdAqXDEKTuNK66FccXmi07n/QhHXA8JzrkNrOkKu3MS0wOI +fgQYFggAJhYhBPbFXlLB5bymFGn7Z9MN7CaNP+sXBQJlR1PpAhsgBQkB4TOAAAoJ +ENMN7CaNP+sXKNQA/2HM+tJuK1ND6sEYH3efBPvvwzNZMEpNf9m227vALzliAQDk +wXjHV3t6muFwV4xIMnSt1rrSa3phD8Te2YNVmjuRBA== +=lSVd +-----END PGP PUBLIC KEY BLOCK----- diff --git a/themes/WonderMod b/themes/WonderMod new file mode 160000 index 0000000..3e21361 --- /dev/null +++ b/themes/WonderMod @@ -0,0 +1 @@ +Subproject commit 3e21361da7ae3b30da3d82491fce933856a1912e diff --git a/tommytran.io.code-workspace b/tommytran.io.code-workspace new file mode 100644 index 0000000..876a149 --- /dev/null +++ b/tommytran.io.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": {} +} \ No newline at end of file