How to become a Contributor
In this tutorial we're going to look at how you can contribute to the opsec blog, we'll look into how the work is being organized, and how to contribute via Forgejo.
The Nihilism Blog Organisation
First of all, to know what tutorials we'd like to have completed, check out our Opsec Forgejo Project board:
Each tutorial (even if completed) has it's own assigned issue on Forgejo
You can pick one that you'd like to do, if you see one that is in either the "to be brainstormed" or the "to be assigned" columns (example: Easy Private Chats - SimpleX.
If there is no todolist on each assigned forgejo issue, you are free to brainstorm it like so:
If a blogpost forgejo issue doesn't have a todolist yet, please follow this general template to write it:
Privacy - Easy Private Chats with SimpleX
To be explained:
- Graph of the targeted setup
- why is this setup relevant ? What are the threats ? What are we trying to achieve (Privacy / Anonymity / Deniability) ?
- what are your options ?
- comparing option A B and C
- In this tutorial we're going to use option B because it is superior due to these criterias blah blah blah
To be showcased:
- how to install the clientside application
- how to install the serverside application
- how to configure the application
- show that it works as intended
The idea being that each issue needs to have a clear todolist to bring clarity on what needs to be done in it. Please check if the tutorial is already assigned to someone already or not:
At first, I am assigning only one contributor per tutorial , and only one tutorial per contributor at a time, with a default deadline of 1 month. to complete the assigned tutorial. (if you want to extend the deadline, you'll have to contact me first).
In short, please choose a tutorial that is neither done, nor assigned yet, and then ask me directly if you can get assigned to it.
The list of tutorials that are not assigned yet are in the second column, once you have chosen one just ping me on Opsec SimpleX group chat.
You can also submit a suggestion to me directly if you think this blog is missing something crucial, such as a brand new blogpost idea (although make sure it remains on topic for Privacy / Anonymity / Deniability) i am NOT looking for regular Sysadmin tutorials here.
If you think one of the existing tutorials is missing something, feel free to criticize them in their assigned issues (ping me when you do so, so i don't miss it):
After discussing with me what task you want to do, we'll confirm on the price for that tutorial and after i get your confirmation i'll assign it to you, and that's when you can start to work on it.
Disclaimer: if you're not used to writing technical stuff, please aim for the tutorials that are labeled as "Simple" and that you actually understand. Don't try to bite more than you can chew, otherwise i might refuse further contributions coming from you. You should be at least familliar with the topic you intend to talk about.
What's on topic and offtopic ?
check out this tutorial for the full explanation
How to contribute new tutorials
Now you first need to sign up on forgejo, click the Register button and fill out your details.
DO NOT give your real email here, you can put a dummy one. Email is not verified.
If account creation is successful, you'll be automatically logged in.
Now, you can ask to join our Contributors private chatroom where we brainstorm new contributions, formulate todolists, assign those todolists to contributors like you, and review those contributions:
From there, you can fork the repository, from your new account:
You can leave everything as default as shown below:
Now from there you continue from the commandline, do a git clone the repository you just forked, and do the edits you need to do:
[ mainpc ] [ /dev/pts/18 ] [~/Documents]
→ apt install git tor torsocks -y
[ mainpc ] [ /dev/pts/18 ] [~/Documents]
→ torsocks git clone http://git.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion/optimist/opsec-blogposts
Cloning into 'blog-contributions'...
remote: Enumerating objects: 3400, done.
remote: Counting objects: 100% (3400/3400), done.
remote: Compressing objects: 100% (2729/2729), done.
remote: Total 3400 (delta 1588), reused 2109 (delta 609), pack-reused 0 (from 0)
Receiving objects: 100% (3400/3400), 149.35 MiB | 6.82 MiB/s, done.
Resolving deltas: 100% (1588/1588), done.
[ mainpc ] [ /dev/pts/18 ] [~/Documents]
→ cd opsec-blogposts
If you are reusing the repository after you're done sending pull requests, don't forget to do a git pull to make sure you're working on an up-to-date repository, as i am frequently pushing commits.
[ mainpc ] [ /dev/pts/18 ] [blog-contributions]
→ torsocks git pull http://git.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion/optimist/opsec-blogposts
Now that you're on the latest commit, you can start to do your own changes from inside vscodium directly:
wget -qO - https://gitlab.com/paulcarroty/vscodium-deb-rpm-repo/raw/master/pub.gpg \
| gpg --dearmor \
| sudo dd of=/usr/share/keyrings/vscodium-archive-keyring.gpg
echo 'deb [ signed-by=/usr/share/keyrings/vscodium-archive-keyring.gpg ] https://download.vscodium.com/debs vscodium main' \
| sudo tee /etc/apt/sources.list.d/vscodium.list
sudo apt update && sudo apt install codium
codium
now from there if you have a new tutorial to create you can copy the template tutorial folder called "0_template" into another folder:
In the new tutorial folder (here it's 1_newtutorial) you will find the template index.md file that you can edit from vscodium directly:
You can also view your edits in real time from vscodium's built-in markdown visualizer as shown above.
Make sure that you follow the quality standard i described here: start with the Why, then the What, then the How. Follow the template and edit it accordingly to fit the tutorial you want to contribute.
DISCLAIMER: We are not taking any shortcuts in this blog, I expect you to talk about the path, to list the steps that are on that path, and more importantly want you to show the audience how YOU walk that path.
For the "How" parts specifically, as you are expected to explain and show the audience how to do things, make sure you use images and screenshots like so:

To take screenshots like i do, you can use flameshot, it has everything you need for screenshots. When you take screenshots, dont forget to draw arrows to mention where the user needs to click, add text if something needs to be clarified, etc. and then save your screenshot in the same folder as your blogpost contribution (in this case, in opsec-blogposts/1_newtutorial/1.png)
apt install flameshot -y
flameshot
`
Sidenote: If you are showcasing any IRL steps to make, take pictures to explain what needs to be done, just like how i did when i showcased how to install GrapheneOS.
If you are showcasing a complex tutorial please make a graph to explain what you are talking about. One graph will convey the equivalent of a wall of text in one clear image, it's a matter of efficiently conveying information to the audience. I used to make graphs using yEd Graphs (but it's closed source) so instead as of q3 2024 i'm using Drawio to make them, both tools have got everything you need to write complex graphs.
[ mainpc ] [ /dev/pts/3 ] [blog/opsec/manifesto]
→ apt search draw.io
Sorting... Done
Full Text Search... Done
draw.io/now 24.7.17 amd64 [installed,local]
draw.io desktop
[ mainpc ] [ /dev/pts/3 ] [blog/opsec/manifesto]
→ apt install draw.io
[ mainpc ] [ /dev/pts/3 ] [blog/opsec/manifesto]
→ drawio
If you want to use my logos for onymity, surveillance, centralisation, complexity, etc you can find them in the opsec-blogposts/logos/ directory:
Then, i'll let you go through the drawio documentation to learn how to use it, as there's alot to cover to add logos, change shapes, add text, add arrows, etc:
But in the end you should have a good looking graph like this one to both highlight the problem, and the solution as per the tutorial template:
and if there are any commands (or terminal output) to be shown, copy paste from your terminal directly into the index.md file don't take screnshots of it, as this is going to help us save some disk space, you can use the backticks code blocks for that purpose :
```sh
[ localhost ] [ /dev/pts/23 ] [~]
→ neofetch
_,met$$$$$gg. user@localhost
,g$$$$$$$$$$$$$$$P. --------------
,g$$P" """Y$$.". OS: Debian GNU/Linux 12 (bookworm) x86_64
,$$P' `$$$. Host: KVM/QEMU (Standard PC (Q35 + ICH9, 2009) pc-q35-7.2)
',$$P ,ggs. `$$b: Kernel: 6.1.0-33-amd64
`d$$' ,$P"' . $$$ Uptime: 3 days, 6 hours, 13 mins
$$P d$' , $$P Packages: 1610 (dpkg), 6 (snap)
$$: $$. - ,d$$' Shell: zsh 5.9
$$; Y$b._ _,d$P' Resolution: 3840x2160
Y$$. `.`"Y$$$$P"' WM: i3
`$$b "-.__ Theme: Adwaita-dark [GTK2/3]
`Y$$ Icons: hicolor [GTK2/3]
`Y$$. Terminal: tmux
`$$b. CPU: 11th Gen Intel i7-11700K (4) @ 3.600GHz
`Y$$b. GPU: 00:01.0 Red Hat, Inc. Virtio 1.0 GPU
`"Y$b._ Memory: 11838MiB / 32096MiB
`"""
```
Now let's say that your tutorial is ready to be sent over for review. So now you need to git push it to your forked repository like so:
[ mainpc ] [ /dev/pts/18 ] [~/Documents/opsec-blogposts]
→ git config --global user.email "optimist@nowhere.jez"
[ mainpc ] [ /dev/pts/18 ] [~/Documents/opsec-blogposts]
→ git config --global user.name "optimist"
[ mainpc ] [ /dev/pts/18 ] [~/Documents/opsec-blogposts]
→ git add -A
[ mainpc ] [ /dev/pts/18 ] [~/Documents/opsec-blogposts]
→ git commit
new tutorial contribution
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch main
# Your branch is up to date with 'origin/main'.
#
# Changes to be committed:
# new file: opsec/1_newtutorial/index.md
ESC :wq
[ mainpc ] [ /dev/pts/18 ] [~/Documents/opsec-blogposts]
→ git push
Username for 'http://git.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion': optimist
Password for 'https://optimist@git.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion':
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 4 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 388 bytes | 388.00 KiB/s, done.
Total 4 (delta 3), reused 0 (delta 0), pack-reused 0
remote:
remote: Create a new pull request for 'optimist:main':
remote: http://git.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion/optimist/opsec-blogposts/compare/main...optimist:main
remote:
remote: . Processing 1 references
remote: Processed 1 references in total
To http://git.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion/optimist/opsec-contributions
7c759d3..7067b5c main -> main
Now you have pushed your changes to your forked respository, from there you can make a Pull request (asking me to pull in your changes, to the main repository) as follows:
TODO
now from there your pull request is created, and I'll review it as soon as I get the time:
If it's not complete, I'll comment in there asking you to add what's missing, changes that you must actually finish before the deadline. To add further changes simply add more commits to it
[ mainpc ] [ /dev/pts/18 ] [~/Documents/opsec-blogposts]
→ vim newtutorial/index.md
[ mainpc ] [ /dev/pts/18 ] [~/Documents/opsec-blogposts]
→ git add -A
[ mainpc ] [ /dev/pts/18 ] [~/Documents/opsec-blogposts]
→ git commit
forgot to do this change!
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch main
# Your branch is up to date with 'origin/main'.
#
# Changes to be committed:
# modified: newtutorial/index.md
ESC :wq
[main eb4b994] forgot to do this change!
1 file changed, 1 insertion(+), 1 deletion(-)
[ mainpc ] [ /dev/pts/18 ] [~/Documents/blog-contributions]
→ torsocks git push
Username for 'http://git.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion': optimist
Password for 'https://optimist@git.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion':
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 4 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 432 bytes | 432.00 KiB/s, done.
Then wait for a maintainer (either me or Oxeo0) to confirm the content is complete, and then i'll accept the pull request and merge it into the main repository.
Warning: your contribution is supposed to follow the quality standard, if your contribution doesn't follow the quality standard closely, we're going to keep refusing your contribution until you make it good enough to be acceptable.
If you intend on becoming a maintainer you need to keep submitting contributions that are at least 95% completed each time. The worst you could do is submit a contribution that is 30% completed and waste our time with a tedious reviewing process (which will force us to stop accepting contributions coming from you aswell, if it keeps happening), We'll tolerate it if that's your first contribution, but you should strive to improve your writing skills with each new contribution that you submit. The best contributors (which are fit to become maintainers) are supposed to send nearly completed contributions upon the first review..
Updating existing tutorials
Sometimes it happens that a tutorial is outdated, has errors or just needs some methodology updates. If you have an idea for something that could be added, or if you want to fix some errors in the tutorial, contact us on simplex or open an issue on Forgejo. We will discuss the changes and make sure they're going in the right direction. If it's a small change (like fixing typos or modifying just a few sentences), you can make a pull request with the changes without contacting us.
Usually, there are already a few issues for blog updates listed on the project board. If you want to help, feel free to pick one and start working on it.
The steps are similar to what we have for creating new tutorial - fork the repository, create a branch and edit appropriate blog post. When you're done with your changes, open a pull request so that we can review them.
Depending on how much of the tutorial is actually changed, you should credit yourself accordingly. For the sake of this example, let's say you're oxeo0 (the person making an update) and Nihilist is the original author of the blog post.
Minor fixes
If the changes you've made are small (let's say less than 20% of the blog post), you should keep the name of the original author. You may change the date to inform readers it has been changed recently, but this is not strictly required. Do not add your XMR address in the footer. This doesn't mean that you won't be getting paid. If you're working on an issue on the project board, there's often a reward even for small edits.
Complete rewrite
Sometimes the tutorial needs to be rewritten entirely (more than 75% changes). In this case, you can treat the tutorial as if it was written by you from the beginning.
Suggest changes
nihilist 2025-04-03
8AUYjhQeG3D5aodJDtqG499N5jXXM71gYKD8LgSsFB9BUV1o
7muLv3DXHoydRTK4SZaaUBq4EAUqpZHLrX2VZLH71Jrd9k8 Donate XMR to the author: