This commit is contained in:
nm1 2026-11-04 00:33:23 +05:30
commit 74ae93a96e
40 changed files with 94691 additions and 0 deletions

View file

@ -0,0 +1,111 @@
7zip
The 7z file format uses a combination of various compression algorithms, with the primary one being LZMA (Lempel-Ziv-Markov chain algorithm). LZMA is known for its high compression ratio and fast decompression. Here is an overview:
- *LZMA/LZMA2:* This is the default and most commonly used algorithm when creating 7z archives. LZMA2 is an improved version of LZMA, offering better multithreading support.
- *PPMd:* Stands for Prediction by Partial Matching, which is good at compressing text data.
- *BCJ/BCJ2:* These are Branch/Call/Jump conversion filters that pre-process executable files to improve compression.
- *DEFLATE:* A widely used compression algorithm that is also used in ZIP file format.
- *BZip2:* Another block-sorting compression algorithm that is particularly effective at compressing large text files.
Here are some technical details of LZMA/LZMA2, in case they are needed for advanced utilization:
- *Dictionary size:* Highly customizable, allowing the compressor to store patterns, which can dramatically affect compression ratio and memory requirements.
- *Compression speed versus Decompression speed:* These are adjustable; typically, LZMA offers slower compression speeds but fast decompression speeds.
- *Multi-threading support:* LZMA2 in particular can utilize multiple processor cores to improve compression speed on modern computers.
For archival purposes using 7z, it is also possible to enable solid compression, which treats multiple files within the archive as a single data block for potentially better compression ratios.
Encryption algorithm : AES-256
Terminal
https://www.redhat.com/sysadmin/encrypting-decrypting-7zip
Encrypting
```bash
$ tar -cf directory.tar <directory>
$ 7z a -p -mhe=on directory.tar.7z directory.tar
or
7z a -pYourPassword -mhe=on directory.tar.7z directory.tar
```
Here a means adding files to archive
mhe=on means header encryption means metadata like file names will be encrypted too
For non interactive password typing type password just after `-p` with no space
also for level of compression
`7z a path/to/archive.7z -mx=0|1|3|5|7|9 path/to/file_or_directory`
0 means lowest compression while 9 being highest
&nbsp;
**for exluding directories**
To exclude directories when creating a 7z archive, use the
-x switch with the ! wildcard operator, and add an r flag (for recursive) to the switch name if the directories might be in subfolders.
The basic syntax for creating an archive and excluding a specific directory named exclude_dir is:
`7z a archive.7z source_dir/ -xr\!exclude_dir/`
dont forget `\` before `!` as ! is reserved for events
Decrypting
```bash
7z x archive.7z
```
here x means extracting
mroe flags
- `-aoa`: Overwrite All existing files without asking
- `-aos`: Skip extracting any files that already exist (prevents replacing).
- `-aou`: Auto-rename the extracted file (e.g., file_1.txt) if the target name exists.
- `-aot`: Auto-rename the existing file and extract the new one.
&nbsp;
**for splitting**
`7z a -v100m archive.7z my_folder/`
for mass compression of folders
```sh
#!/bin/bash
# Check if 7z is installed
if ! command -v 7z &> /dev/null
then
echo "7z command not found! Please install 7zip."
exit 1
fi
# Loop through all directories in the current directory
for dir in */; do
# Make sure it's a directory
if [ -d "$dir" ]; then
# Remove the trailing slash from the directory name
dir_name=${dir%/}
# Create a .7z archive for each directory
echo "Creating archive for $dir_name..."
7z a "${dir_name}.7z" "$dir_name"
fi
done
echo "Done!"
```
&nbsp;
to print only filepaths instead of other info
`7z l -ba archive.7z | grep -oP '(?<=^.{53}).*'`
from
https://stackoverflow.com/questions/55355466/7z-list-only-filenames
to list only top level use this
`7z l -ba archive.7z | grep -oP '(?<=^.{53}).*' | grep -v '/'`

View file

@ -0,0 +1,96 @@
Android emulator on linux
- https://repodev.com/blog/install-android-sdk-without-android-studio
- https://stackoverflow.com/questions/70752639/i-need-to-install-android-api-30-but-i-cannot-see-that-api-in-the-sdk-platform
https://dl.google.com/android/repository/sys-img/google_apis/x86-30_r09.zip : for downloadng system images
https://androidsdkmanager.azurewebsites.net/SDKPlatform
&nbsp;
- Download commandlinetools and gradle
https://www.mediafire.com/file/zjubjy2d2nmblwf/commandlinetools-linux-10406996_latest.zip/file
https://www.mediafire.com/file/26sokfserayh28a/gradle-8.5-bin.zip/file
Or use official sites
https://developer.android.com/studio/index.html#command-line-tools-only
https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip : ddl link for cmdtools
https://gradle.org/releases/ : for gradle
compatibility matrix:
https://docs.gradle.org/current/userguide/compatibility.html
- Files hierarchy
```
/home/username/bin/android/sdk/cmdline-tools/latest/
|_bin/
|_lib/
|_NOTICE.txt
|_source.properties
/home/username/bin/android/gradle/gradle-x.x.x/
|_bin/
|_docs/
|_init.d/
|_lib/
|_src/
|_LICENSE
|_NOTICE
|_README
```
- Go to bin directory for cmdtools
Then
` ./sdkmanager "platforms;android-30" "system-images;android-30;google_apis;x86_64" "platform-tools"`
`./sdkmanager --licenses`
Also install these
`sudo pacman -S libmtp android-tools android-udev`
- Add path in `.bashrc`
```
vi ~/.bashrc
# Android SDK files
export ANDROID_HOME="$HOME/bin/android/sdk"
export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools
# Gradle
export PATH=$PATH:$HOME/bin/android/gradle/gradle-x.x/bin
```
- Running
Create avd
`avdmanager create avd -n image_v29 -k "system-images;android-29;google_apis;x86_64"`
if there is error ie `emulator` must be installed then use this
`./sdkmanager --channel=3 emulator`
then
`avdmanager list avd`
Start it by going to emulator directory then
`./emulator -avd image_v29`
&nbsp;
- Android versions
[android versions](../../../undefined)
or
https://developer.android.com/tools/releases/platforms
&nbsp;
Open SDK Manager: First, locate and open the SDK Manager. You can find it in the tools directory of your Android SDK installation.
&nbsp;
Launch SDK Manager: Run the sdkmanager command in your terminal or command prompt. Navigate to the tools/bin directory within your Android SDK installation and use the following command:
`sdkmanager --list`
This command will list all available packages and their versions.
&nbsp;
Select and Install Previous Android Versions: Once you see the list of available packages, you can find the specific version you want to install. For instance, to install Android 9.0 (API level 28):
`sdkmanager "platforms;android-28"`
Replace "platforms;android-28" with the appropriate package name of the desired Android version. This command will download and install Android 9.0 (API level 28).
&nbsp;
Additional Components: If you need additional components such as system images or tools for a specific version, you can install them using similar commands:
`sdkmanager "system-images;android-28;google_apis;x86_64"`
Again, adjust the package name to match the specific version and components you require.

View file

@ -0,0 +1,22 @@
Cons
- Firefox
1. githib css not loading properly also its binary cant be downloaded most of times
2.
![firefox_extension_mess.png](../../../_resources/firefox_extension_mess.png)
3. User have to use firefox version 68.11 to able to install extension from xpi file
or use this
https://www.maketecheasier.com/install-addon-firefox-android/
- Linux
1. windows handles battery , hidpi and multiple screens a bit better.
2. Poor audio and video linux
3. wine is pain to seup and still performance issues in games
4. no IDM,winrar,spytify
signal
ya. but signal do have 2 cons.
1. it dont have option to store media files in internal storage
2. u cant transfer chats from iphone to android and vice versa

View file

@ -0,0 +1,15 @@
- https://m.youtube.com/watch?v=YNUSxFX4elY the worst drm system in modern times
- SafetyNet (Android one)
Perhaps the most telling line of the explainer is that it "takes inspiration from existing native attestation signals such as [Apple's] App Attest and the [Android] Play Integrity API." Play Integrity (formerly called "SafetyNet") is an Android API that lets apps find out if your device has been rooted. Root access allows you full control over the device that you purchased, and a lot of app developers don't like that. So if you root an Android phone and get flagged by the Android Integrity API, several types of apps will just refuse to run. You'll generally be locked out of banking apps, Google Wallet, online games, Snapchat, and some media apps like Netflix. You could be using root access to cheat at games or phish banking data, but you could also just want root to customize your device, remove crapware, or have a viable backup system. Play Integrity doesn't care and will lock you out of those apps either way. Google wants the same thing for the web.
- WEI
[Google’s nightmare “Web Integrity API” wants a DRM gatekeeper for the web _ Ars Technica (11_2_2023 12_48_03 PM).html](../../../_resources/Google’s%20nightmare%20“Web%20Integrity%20API”%20wants%20a%20DRM.html)
Google's plan is that, during a webpage transaction, the web server could require you to pass an "environment attestation" test before you get any data. At this point your browser would contact a "third-party" attestation server, and you would need to pass some kind of test. If you passed, you would get a signed "IntegrityToken" that verifies your environment is unmodified and points to the content you wanted unlocked. You bring this back to the web server, and if the server trusts the attestation company, you get the content unlocked and finally get a response with the data you wanted.
&nbsp;
and how exactly attestation test will verify we dont know that so that we cant think of someway to bypass it

View file

@ -0,0 +1,184 @@
Docker
- Installing docker
https://itsfoss.com/install-docker-arch-linux/
- Configuration
- Add user to docker group
`sudo usermod -aG docker $USER`
- Log out and Log Back In
After adding your user to the Docker group, you need to either log out and log back in or reboot your system. This step is necessary for the group changes to take effect. An alternative is to use the following command to apply the group change immediately:
`newgrp docker`
- If again needed a permission then
- Check Docker Daemon Permissions
`ls -l /var/run/docker.sock`
The output should show that the group is set to docker. If not, you can adjust the permissions with:
`sudo chown root:docker /var/run/docker.sock`
- To list images use
`docker images`
- To list containers use
`docker ps`
- To delete container or image forcefully respectively
`docker rm -f <container_id>` and `docker rmi -f <images_id>`
- Issues
https://stackoverflow.com/questions/51188657/image-is-being-used-by-stopped-container-error
building image:
`docker build -t username/first_app:1.0`
it will produce an output and will produce image starting with sha……
To run the image use:
`docker run <image_name/code>`
Now if we try to run it with port(here in eg port is 8080) then it wont run because by default its not accessible outside container so to expose it we can use port forwarding.
`docker run -p 5000:8080 <image_name/code>`
port 8080 of container is forwarded to port 5000 of outside container. 5000:8080 is mapping
- For publishing
Now login through the CLI by executing:
```
docker login
```
Push your Docker Image to the Docker Hub repository with the following command:
```
docker image push <repository>/<image>:<tag>
```
Example:
```
docker image push dhanushkamath/dockerize-node:1.0.0
```
You’ve successfully published your first image to the world!
Running this container on a different computer that has Docker only requires a single command:
```
docker run dhanushkamath/dockerize-node:1.0.0
```
- Reducing image size
https://devopscube.com/reduce-docker-image-size/
&nbsp;
**Dockerhub**
Anonymous and Free Docker Hub users are limited to 100 and 200 container image pull requests per six hours.
![764c7f377091033262190448212db4e5.png](../../../_resources/764c7f377091033262190448212db4e5.png)
&nbsp;
When using docker login the auth token will be stored in `SHOME/.docker/config.json` so using different users we can login to different accounts simuntaneously
&nbsp;
**Pushing images to dockerhub**
- When we create image using `docker build -t image_name:tagname .` then we get a image of name specified. To push image in dockerhub, image name should be in format `username/repo:tagname` . So instead of creating image again with same format we can create a link/tag to local image with
`docker tag local_image_name:tagname username/repo_name:tagname`. so for same image we have 2 different names. Now we can just push with
`docker image push username/repo_name:tagname`
Then finally to download it use
`docker pull username/repo_name:tagname`
&nbsp;
### Docker container with multiple node instances
- Use pm2 for it
Structure of files in host
```text
puppetter_test
index.js
ecosystem.config.js
... (other files)
ytDownloadSpace
app.js
... (other files)
ytdlApi
app.js
... (other files)
Dockerfile
```
Dockerfile
```yaml
FROM alpine
RUN apk add --update nodejs npm bash
# App 1
WORKDIR /src/puppetter_test
COPY puppetter_test/ ./
RUN npm install
# App 2
WORKDIR /src/ytDownloadSpace
COPY ytDownloadSpace ./
RUN npm install
# App 3
WORKDIR /src/ytdlApi
COPY ytdlApi/ ./
RUN npm install
RUN npm install -g pm2
#config file
WORKDIR /src/puppetter_test
EXPOSE 8081
# starting pm2 with --no-daemon flag to keep it running in foreground
# instead of background to prevent docker container from stopping
CMD pm2 start ecosystem.config.js --no-daemon
```
`ecosystem.config.js`
```js
module.exports = {
apps: [
{
name: 'main',
script: 'index.js',
watch: true,
env: {
NODE_ENV: 'production',
PORT: 8081
}
},
{
name: 'ytdownloadspace',
script: '../ytDownloadSpace/app.js',
watch: true,
env: {
NODE_ENV: 'production',
PORT: 8080
}
},
{
name: 'ytdlApi',
script: '../ytdlApi/app.js',
watch: true,
env: {
NODE_ENV: 'production',
PORT: 8083
}
}
]
};
```
- docker import and export images
https://stackoverflow.com/questions/24482822/how-to-share-my-docker-image-without-using-the-docker-hub
Based on this blog, one could share a docker image without a docker registry by executing:
`docker save --output latestversion-1.0.0.tar dockerregistry/latestversion:1.0.0`
Once this command has been completed, one could copy the image to a server and import it as follows:
`docker load --input latestversion-1.0.0.tar`

View file

@ -0,0 +1,99 @@
Basics
https://www.youtube.com/watch?v=kTp5xUtcalw&t=335s : freecodecamp ones
https://www.youtube.com/playlist?list=PLinedj3B30sDvBfeK9EPz9pcJNlM0f3ph : piyush garg ones
https://www.youtube.com/watch?v=pR5jOQnfNtY : docker in mobile
### Microservices architecture
- A variant of the service oriented architecture(SOA) structural style - arranges an aplication as a collection of loosely coupled services
- In a microservices architecture, services are fine-grained and the protocols are lightweight.
&nbsp;
### Monolithic architecture
- built as a single unt
- deployed as a single unit (building time would be high)
- duplicated on each server
- ex: 3-tier apps like MVC architecture
&nbsp;
### Microservices
- Breaking big system into smaller parts and each with its own responsibility.
- Scale these smaller pieces independtly from each other
- Loosely coupled : No strong bond because we expose functionality though api
- Enable autonomous development by different teams, languages : Can be written by smaller teams so outsourcing and independent development is possible so they can even use different programming languages too.
- Each microservices can have its own separate database
&nbsp;
### Diagrams
Monolithic architecture
![cfeaae3664097859094bd46e16924d96.png](../../../../_resources/cfeaae3664097859094bd46e16924d96.png)
For deploying in more servers
![1b58f6f7bcd5f68fb6e365e7991f188a.png](../../../../_resources/1b58f6f7bcd5f68fb6e365e7991f188a.png)
&nbsp;
Microservice architecture
![163d5f38ffe0f64657b0d3a1312cfa5d.png](../../../../_resources/163d5f38ffe0f64657b0d3a1312cfa5d.png)
For scaling
![d2bc6210f22ed3406dc38acd75e05d66.png](../../../../_resources/d2bc6210f22ed3406dc38acd75e05d66.png)
Monolith to microservices
![4259a2dba0bfe5fc0527f1ac50bb13b1.png](../../../../_resources/4259a2dba0bfe5fc0527f1ac50bb13b1.png)
&nbsp;
## Microservice anti patterns
### Challenges
- Risk of unneccessary complexities when converting monlithic to so many microservices
- numerous services can be impacted too
- Security of microsercices is also a challenge
&nbsp;
### Microservices Benefits
- Improved fault isolation : wont take whole system down if one of them go down
- less vendor lock in or technology in bcz of use of open source technologies
- Easier to understand
- Smaller and faster development
- Scalibility
### Microservices - Drawbacks
- Complexity is added to resolve complexity issues
So need to start it slowly with a pace that everyone can keep it
- Its easier to test independent services but it is also necessary to test whole system to check if they r communicating with each other properly or not.
- Is deployment really simpler
- challenges with multiple times
- One microservice update other microservices too
- Need to have multiple databases too
- Latency issues : As there r so many routes needs to be taken as each microservice will call api to talk to each other so there will be latency issues too
- Transient errors : Sometimes between calls there maybe errors which can be fixed with retry so make sure to do that
- Multiple point of failure
- Security issues as when communicating we may not want to expose everything and needed to be take care of that
&nbsp;
&nbsp;
## Cloud Natives
- Cloud natives uses containers, service meshes, microservices, immutable infrastructure and declaritive APIs.
Immutable infrastructure means instead of updating it we replace with newer versions.
These technologies is used to build and run scalable applications in modern, dynamic environments such as public, private and hybrid cloud.
- use of metrics, creation and updation are automated and frequent deployment of eye impact changes
- using of open source projects
&nbsp;
### Cloud native concepts
- Speed and agility
- Application architecture
![929b7cd5a0ec2b5a24e845e33d790b83.png](../../../../_resources/929b7cd5a0ec2b5a24e845e33d790b83.png)
- Mentality : Pets vs Cattle
- Unlike VM where we need to take care it, infrastructure in this immutable and disposable like cattle
- Provisioned in minites and destroyed on demand
- Never updated or repaired, just re-provisioned/replaced.
- Cloud Native Trail Map
- Breaks journey into measurable objects
- Containerization
- Done through docker containers
- CI/CD
- Setup Continuous Integration/Continuous Delivery (CI/CD) so changes to source code automatically result in a new container being built, tested and deployed to staging and eventually perhaps to production
- Orchestration : Eg : Kubernetes and deploy using help chart
- Obervability and analysis : Monitoring, logging and tracing .
- Service proxy, discovery and mesh : Eg :envoy, CoreDNS, LinkerD
- Networking, Policy and Security: Eg : CNI, Open policy agent, Falco

View file

@ -0,0 +1,41 @@
Containers
A container is a unit of deployment. It contains everything for a code to run. We take the container, push them on server and it should run. Container contains code, runtime, system tools and system libraries. It can have external dependencies too like database or cache
Reason of using container
- Move faster by deploying smaller units
- Use few resources
- Fit more into the same host
- Faster automation when using CI/CD techniques
- Portability
- Isolation
Virtual machine vs containers
- VM runs on hardware where OS is installed. OS hypervisor lets us create virtual machine where we install an OS . So we would have bios and firmware too as it is hardware even though it is virtual. VM is basically **virtualize the hardware**
- In containers we still have hardware and OS. Container runtime is installed in the OS instead of creating virtual machine.Container images are run in the memory. Container dont need to boot as it uses the HOST kernel and they dont have to boot. They will need small disk space as there is no OS with few megabytes of hard disk and 64 or 128MB of RAM required.
![1676a37516bad6609caceb44553e4ad9.png](../../../../_resources/1676a37516bad6609caceb44553e4ad9.png)
![d8041f9ddaf662c8a6dda065e2b7e6ff.png](../../../../_resources/d8041f9ddaf662c8a6dda065e2b7e6ff.png)
&nbsp;
&nbsp;
### More
Containers are made up of layers
![b0b2e7e0b4a84a18e328a6a58da63379.png](../../../../_resources/b0b2e7e0b4a84a18e328a6a58da63379.png)
Eg : `docker pull` command will download container image and each layer will be downloaded individually and each layer has unique id. If a layer already exist then it wont download again as docker uses local cache to store container's images.
Advantage is if we download version 2 then it wont download whole image, just the layers which is not present
So a goal is to create docker container images which smallest number of layers possible
Layers in the docker : Top one is both read-write but lower ones in read-only.
&nbsp;
### Container registry
- Centralized container repository
- Think Github but for containers.
- Docker hub is a great example
- Major providers have container registry services like AWS, azure and GCP.
&nbsp;
**Orchestrator**
- Allow us to Manage, scale monitor the containers that we run on servers
- We can use our own like kubernates, swarm, service fabric
- or we can use a managed cluster offered by cloud providers.

View file

@ -0,0 +1,146 @@
Docker
- Docker is both the company and platform
- An open source container runtime
- Cross platform desktop support
- Command line tool
- "Dockerfile" file format for building container images
- Windows let us create both windows and linux containers
&nbsp;
**Docker cli commands**
- `docker info` : display system information
- `docker version`
- `docker login` : by default it will login to dockerhub
&nbsp;
Docker running commands
- `docker run [imageName]` : execute image in memory. image is not present in cache, it will be downloaded automatically.
there is another flag named `--name` to give name to docker instance which will run. if we dont provide docker will generate random name.
eg : `docker run --name web [imageName] ` here web is the name
**imposing limits on docker instance**
`docker run --memory="256m" nginx`
`docker run --cpus=".5" nginx`
- `docker run -d [imageName]` : to run container in background so u can still use the terminal
- `docker stop [containerName]` : will stop the execution but it will still in memory
- `docker kill [containerName]` : to remove container in memory which r stuck
- `docker image inspect` : useful for debugging
- **Note**: When we use run we create a container from the image. Also when we use flags with `run` certain configuration are set too To stop execution we can use stop command but using start we can again start it with same configuration too.
![16f5148001e1c91c62a9aed090efbc81.png](../../../../_resources/16f5148001e1c91c62a9aed090efbc81.png)
&nbsp;
**Usage**
![346b020fe6804da78af6f91d63c6aa46.png](../../../../_resources/346b020fe6804da78af6f91d63c6aa46.png)
**Attach shells**
![a357f658bd6b32ebe4584769b0f29942.png](../../../../_resources/a357f658bd6b32ebe4584769b0f29942.png)
Working command
`docker exec -it web3 bash`
here `web3` is container name which is running in background
for executing commands for background running containers
`podman exec web3 bash -c "ls"`
for non running containers
`docker run -it --name archc8 archlinux:latest /usr/bin/bash`
for non running containers so basically creating a new container
`docker run -it alpine:latest sh -c "apk add --update bash && exec bash"`
By using the `--rm` flag with either the docker run or docker create command, you ensure that the container is automatically removed once it stops
&nbsp;
**to start distro and keep it running**
`podman run -itd --name ubuntu1 ubuntu /bin/bash`
**Clearing things up**
![72f71c083a32dcfdf87ae3ba9ed6d614.png](../../../../_resources/72f71c083a32dcfdf87ae3ba9ed6d614.png)
For removing containers, they must be stopped first
&nbsp;
&nbsp;
## Docker build containers
- ![4fa99c7ed58f4879895649bee949120d.png](../../../../_resources/4fa99c7ed58f4879895649bee949120d.png)
- `docker build -t ngthml:1.0 dockers/` (dockers folder contain Dockerfile)
- If Dockerfile name is not DockerFile then specify that name with `-f` flag.
- Eg of dockerfile
```text
FROM nginx:alpine
COPY . /usr/share/nginx/html
```
FROM command specify base image and when we build something we use image which already exist. nginx:alpine is very lightweight
then copy whole folder containing Dockerfile to `/usr/share/nginx/html` of alpine
- Nodejs Dockerfile
alpine is very lightweight and there isnt even bash installed so we cant have interactive shell too. But we can install bash by
`docker exec -it node_hello apk add --update bash`
or including it in `RUN apk add --update nodejs npm bash`
```text
FROM alpine
RUN apk add --update nodejs npm
COPY . /src
WORKDIR /src
RUN npm install
EXPOSE 8080
ENTRYPOINT ["node", "./app.js"]
```
- RUN apk .... : Using RUN we can execute commands when generating container. in this case using apk package manager of alpine we are installing nodejs and npm.
Then we copy current folder to `/src` and making it as work directory too.
- `WORKDIR` is a combination or cd and mkdir as we dont need to make directory too as workdir will handle it. `RUN cd` wont have effect as when using RUN commands will be run in different shell so thats why using WORKDIR is preferred
WORKDIR / changes the working directory for future commands.
RUN cd / has no impact on the subsequent RUNs.
- EXPOSE will make sure which port shoould be accessible by other containers or host system
- ENTRYPOINT means commands that will run when the container start
**Difference between run,cmd and entrypoint**
https://www.bmc.com/blogs/docker-cmd-vs-entrypoint/
https://www.cloudbees.com/blog/understanding-dockers-cmd-and-entrypoint-instructions
- RUN. Mainly used to build images and install applications and packages, RUN builds a new layer over an existing image by committing the results.
- CMD. Sets default parameters that can be overridden from the Docker Command Line Interface (CLI) when a container is running. eg : `cmd node app.js`
- ENTRYPOINT. Default parameters that cannot be overridden when Docker Containers run with CLI parameters.
**Example**
if there is `cmd node app.js` and
`docker run nodecontainer node app2.js`
then in docker container it will be
`node app2.js` as it will override
&nbsp;
if there is `entrypoint ["node", "app.js"]` and
`docker run nodecontainer node app2.js`
then in docker container it will be
```bash
node app.js
node app2.js
```
instead of overriding `node app2.js` is appended
- docker tag
- Assign a name and tag to a specific image ID:
`docker tag id name:tag`
- Assign a tag to a specific image:
`docker tag image:current_tag image:new_tag`
- docker cp
to copy files from docker container to host
`docker cp <containerId>:/file/path/within/container /host/path/target`
eg:
`docker cp node_hello_sh:/ alpine_node/`
&nbsp;
to copy files from host to docker container
`docker cp /host/path/target container_id:/file/path/within/container`
eg:
`docker cp foo.txt container_id:/foo.txt`
- docker logs
`docker logs <container_id>`
or when creating container
`docker run --log-level=debug ...`
- Expose port of already created container
While it is not possible to expose port we can access it by `http://container_ip:PORT`. we can find container ip by
`docker inspect container_name | grep IPAddress` . run `docker ps` to find container name first
- environment variables when starting a container from image
`docker run --name my-tomcat -p 127.0.0.1:8080:8080 -e APP_DB_DB=mydb -e APP_DB_USER=dbuser -e APP_DB_PASS=dbpass --link mongo-myapp:mongo -v /path-to/tomcat/webapps:/usr/local/tomcat/webapps -d tomcat:8-jre8-alpine`
- creating image from container
after making some changes in container we can create its own image too
`docker commit nginx_base` where nginx_base is name of container
this will create image but it have no tag so crating its tag with
`docker tag 0c17f0798823 hello_world_nginx`
or simply add tag when creating image
`docker commit nginx_base hello_world_nginx`
here hello_world_nginx is name of image
- docker volume
`docker run -v $PWD:/data -it archivebox/archivebox init --setup`
`-v $PWD:/data`: This mounts the current working directory (represented by $PWD, which is a shell variable) on your host machine to the /data directory inside the Docker container. This is crucial because it allows ArchiveBox to store its data (archived websites, indexes, etc.) persistently on your host machine, even if the container is stopped or removed. The -v flag stands for "volume."
- docker import and export images
https://stackoverflow.com/questions/24482822/how-to-share-my-docker-image-without-using-the-docker-hub
Based on this blog, one could share a docker image without a docker registry by executing:
`docker save --output latestversion-1.0.0.tar dockerregistry/latestversion:1.0.0`
Once this command has been completed, one could copy the image to a server and import it as follows:
`docker load --input latestversion-1.0.0.tar`

View file

@ -0,0 +1,2 @@
podman
https://www.youtube.com/watch?v=Z5uBcczJxUY : Stop Using Docker. Use Open Source Instead

View file

@ -0,0 +1,118 @@
projects
## spring quiz app
- location : `/home/hpes/Videos/imp/java/spring/genz/quiz_back_docker-compose`
**following will not work**
- to go to bash use this
`docker run --rm -it --name quiz-app quiz-app-docker:1.0 bash`
- run app (use -d for detach mode)
`docker run -p 8085:8080 --rm --name quiz-app quiz-app-docker:1.0`
- build
`docker build -t quiz-app:1.0 .`
- Dockerfile
```
FROM alpine:latest
RUN apk add --update bash openjdk17 maven mariadb mariadb-client
COPY . /spring-app
WORKDIR /spring-app
RUN mvn package
# Initialize MySQL database (this step will only run the first time)
RUN mysql_install_db --user=root --basedir=/usr --datadir=/var/lib/mysql
RUN mysqld_safe --user=root & \
sleep 3 && \
mysql -e "create database quiz;" && \
mysql quiz < quiz.sql
EXPOSE 8080
RUN chmod +x entrypoint.sh
# Start the MySQL service and your backend
CMD sh /spring-app/entrypoint.sh
```
&nbsp;
**docker compose method** (1.3 gb)
docker-compose.yml
```yml
version: '3.8'
services:
mysql:
image: mysql:latest # You can use a different version if necessary
environment:
MYSQL_ROOT_PASSWORD: strong_password
ports:
- "3307:3306" # Expose MySQL on port 3307
volumes:
- /var/lib/docker/volumes/mysql_app_data/_data:/var/lib/mysql # Persist MySQL data
spring-app:
build: .
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/quiz?allowMultiQueries=true
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: strong_password
ports:
- "8085:8080" # Expose Spring Boot app on port 8080
depends_on:
- mysql # Ensure MySQL starts before Spring Boot app
```
Dockerfile for spring-app
```
FROM alpine:latest
RUN apk add --update bash openjdk17 maven
COPY . /spring-app
WORKDIR /spring-app
RUN mvn package
EXPOSE 8080
CMD java -jar target/demo-0.0.1-SNAPSHOT.jar
```
two commands
`docker-compose build` and `docker-compose up`
&nbsp;
## youtube playlist downloader
200 mb
- location : `/home/hpes/Videos/imp/nodejs/production/youtube downloader/`
- `docker build -t ytdown:1.0 .`
DockerFile
```
FROM alpine
RUN apk add --update nodejs npm bash
# App 1
WORKDIR /src/puppetter_test
COPY puppetter_test/ ./
RUN npm install
# App 2
WORKDIR /src/ytDownloadSpace
COPY ytDownloadSpace ./
RUN npm install
# App 3
WORKDIR /src/ytdlApi
COPY ytdlApi/ ./
RUN npm install
RUN npm install -g pm2
#config file
WORKDIR /src/puppetter_test
EXPOSE 8081
CMD pm2 start ecosystem.config.js --no-daemon
# CMD ["node", "app.js"]
```
&nbsp;
for vps
[setup.md](../../../../_resources/setup.md)

View file

@ -0,0 +1,464 @@
- RC4
- NodeJs
```jsx
const rc4 = require("arc4");
const fs=require('fs')
const data=fs.readFileSync('stacer.jpeg')
const uData=new Uint8Array(data)
const key = "123456789123456789";
// const data = e.target.result;
const fSize = data.byteLength;
const cipher = rc4("arc4", key);
// const enc = cipher.encodeBuffer(uData);
const enc = cipher.encodeArray(uData);
console.log("🚀 ~ file: script.js:76 ~ fr.addEventListener ~ enc:", enc);
// const dec = cipher.decodeBuffer(enc);
const dec = cipher.decodeArray(enc);
console.log("🚀 ~ file: script.js:78 ~ fr.addEventListener ~ dec:", dec);
const decBuffer=Buffer.from(dec)
fs.writeFileSync('stacerdec.jpeg',decBuffer)
```
- Javascript(Client side)
```jsx
// Function to read a file and return its content as a promise
function readFile(fileInput) {
return new Promise((resolve, reject) => {
const file = fileInput.files[0];
if (!file) {
reject("No file selected");
return;
}
const reader = new FileReader();
reader.onload = (event) => {
resolve(event.target.result);
};
reader.readAsArrayBuffer(file);
});
}
// Function to save encrypted data to a file
function saveEncryptedFile(encryptedData) {
const blob = new Blob([encryptedData]);
const a = document.createElement("a");
a.href = URL.createObjectURL(blob);
a.download = "encrypted_file.enc";
a.click();
}
// Function to save decrypted data to a file
function saveDecryptedFile(decryptedData) {
const blob = new Blob([decryptedData]);
const a = document.createElement("a");
a.href = URL.createObjectURL(blob);
a.download = "decrypted_file.txt"; // Change the file extension as needed
a.click();
}
// Function to encrypt a file using ARC4
async function encryptFile() {
const fileInput = document.getElementById("fileInput");
const fileContent = await readFile(fileInput);
const rc4 = ARC4("your_secret_key");
const encryptedData = rc4.encrypt(new Uint8Array(fileContent));
saveEncryptedFile(encryptedData);
}
// Function to decrypt an encrypted file using ARC4
async function decryptFile() {
const encryptedFileInput = document.getElementById("encryptedFileInput");
const encryptedContent = await readFile(encryptedFileInput);
const rc4 = ARC4("your_secret_key");
const decryptedData = rc4.decrypt(new Uint8Array(encryptedContent));
saveDecryptedFile(decryptedData);
}
```
- AES
```jsx
// merging splitted Uint8arrays to single one
const mergeTo1D=(uarrays)=>{
if(uarrays.length===0)
{
return []
}
const sum=0
for(let urray of urray)
{
sum+=urray/length
}
const mergedArray= new Uint8Array(sum)
mergedArray.set(uarrays[0],0)
for(let i=1;i<uarrays.length;i++)
{
mergedArray.set(uarrays[i],uarrays[i-1].length)
}
return mergedArray
}
```
- nodejs
Streamlined encyption using native crypto module of nodejs
 
encryption.js
```jsx
const fs = require("fs");
const crypto = require("crypto");
const CryptoJS = require("crypto-js");
require("crypto-js/aes");
// const fileName='redis-stack-server-7.2.0-v4-x86_64.AppImage'
// const fileName='Joplin-2.12.18.AppImage'
// const fileName='stacer.jpeg'
const fileName='Black.Mirror.S06E01.Joan.Is.Awful.720p.10Bit.Hindi.English.Esubs.MoviesMod.org.mkv'
// Input and output file paths
const inputFile = fileName; // Replace with your input file path
const outputFile = `${fileName}.enc`; // Replace with your output file path
// Encryption parameters
// const key = "YourSecretKey"; // Replace with your encryption key
const key = crypto.randomBytes(32);
const iv = crypto.randomBytes(16); // Initialization Vector (IV)
fs.writeFileSync('key.bin',key);
fs.writeFileSync('iv.bin',iv);
// console.log('key: ',key.toString())
// console.log('iv: ',iv.toString())
// Create a readable stream for the input file and a writable stream for the output file
const inputStream = fs.createReadStream(inputFile);
const outputStream = fs.createWriteStream(outputFile);
// Encrypt and write the file in chunks
const encryptionStream = crypto.createCipheriv("aes-256-cbc", Buffer.from(key), iv);
inputStream.pipe(encryptionStream).pipe(outputStream);
// Handle events and errors
inputStream.on("error", (err) => console.error("Input Stream Error:", err));
outputStream.on("error", (err) => console.error("Output Stream Error:", err));
outputStream.on("finish", () => console.log("Encryption completed."));
// Optionally, you can handle stream close events as well
inputStream.on("close", () => console.log("Input stream closed."));
outputStream.on("close", () => console.log("Output stream closed."));
```
&nbsp;
decryption.js
```jsx
const fs = require("fs");
const crypto = require("crypto");
const CryptoJS = require("crypto-js");
require("crypto-js/aes");
// const fileName='Joplin-2.12.18.AppImage'
// const fileName='stacer.jpeg'
const fileName='Black.Mirror.S06E01.Joan.Is.Awful.720p.10Bit.Hindi.English.Esubs.MoviesMod.org.mkv'
// Input and output file paths
const inputFile = `${fileName}.enc`; // Replace with your output file path
const outputFile = `${fileName}.dec`; // Replace with your output file path
const key=fs.readFileSync('key.bin');
const iv=fs.readFileSync('iv.bin');
const inputStream = fs.createReadStream(inputFile);
const outputStream = fs.createWriteStream(outputFile);
// Decrypt and write the file in chunks
const decryptionStream = crypto.createDecipheriv("aes-256-cbc", Buffer.from(key), iv);
inputStream.pipe(decryptionStream).pipe(outputStream);
// Handle events and errors
inputStream.on("error", (err) => console.error("Input Stream Error:", err));
outputStream.on("error", (err) => console.error("Output Stream Error:", err));
outputStream.on("finish", () => console.log("Decryption completed."));
// Optionally, you can handle stream close events as well
inputStream.on("close", () => console.log("Input stream closed."));
outputStream.on("close", () => console.log("Output stream closed."));
```
- client side javascript(browser)
 
encryption.html
```jsx
<!DOCTYPE html>
<html>
<head>
<title>Large File Encryption</title>
</head>
<body>
<input type="file" id="fileInput" >
<button id="encryptButton">Encrypt</button>
<a id="downloadLink" style="display: none" download="encrypted-file.txt">Download Encrypted File</a>
<script>
const algorithmName="AES-GCM"
// const algorithmName="AES-CBC"
document.getElementById("encryptButton").addEventListener("click", async () => {
const fileInput = document.getElementById("fileInput");
const file = fileInput.files[0];
if (!file) {
alert("Please select a file.");
return;
}
const chunkSize = 1024 * 1024; // 1 MB chunks
const key = await window.crypto.subtle.generateKey({ name: algorithmName, length: 256 }, true, ["encrypt","decrypt"]);
const keyData = await window.crypto.subtle.exportKey('jwk', key);
// Create a data blob with the key data
const keyBlob = new Blob([JSON.stringify(keyData)], { type: 'application/json' });
// Create a download link for the key
const keyUrl = URL.createObjectURL(keyBlob);
const downloadLink = document.createElement('a');
downloadLink.href = keyUrl;
downloadLink.download = 'encryption-key.json';
downloadLink.click();
const iv=new Uint8Array(16);
const ivBlob= new Blob([JSON.stringify(iv)], { type: 'application/json' })
const ivUrl=URL.createObjectURL(ivBlob)
const ivdownloadlink=document.createElement('a')
ivdownloadlink.href= ivUrl
ivdownloadlink.download ='encryption-iv.json'
ivdownloadlink.click()
const reader = new FileReader();
const fileData = [];
let offset = 0;
reader.onload = async function () {
// const algorithm= { name: "AES-GCM", iv }
const algorithm= { name: algorithmName, iv }
console.log('algorithm: ',algorithm)
const chunk = new Uint8Array(reader.result);
const encryptedChunk = await window.crypto.subtle.encrypt(
algorithm,
key,
chunk
);
// const encryptedChunk=chunk
fileData.push(encryptedChunk);
offset += chunk.length;
if (offset < file.size) {
readSlice(offset);
} else {
// All chunks are encrypted; combine them and provide a download link.
const encryptedData = new Blob(fileData, { type: file.type });
const url = URL.createObjectURL(encryptedData);
const downloadLink = document.getElementById("downloadLink");
downloadLink.href = url;
downloadLink.style.display = "block";
console.log('finished')
}
};
function readSlice(offset) {
const slice = file.slice(offset, offset + chunkSize);
reader.readAsArrayBuffer(slice);
}
readSlice(0);
});
</script>
</body>
</html>
```
&nbsp;
decryption.js
```jsx
<!DOCTYPE html>
<html>
<head>
<title>File Decryption</title>
</head>
<body>
<h1>File Decryption</h1>
<!-- Input for the encrypted file -->
<input type="file" id="encryptedFileInput" />
<!-- Input for the encryption key (as JSON) -->
<input type="file" id="keyInput" accept=".json" />
<!-- Input for the IV (as JSON) -->
<input type="file" id="ivInput" accept=".json" />
<button id="decryptButton">Decrypt</button>
<a id="downloadLink" style="display: none;">Download Decrypted File</a>
<script>
document.getElementById("decryptButton").addEventListener("click", async () => {
// Get the encrypted file
const encryptedFileInput = document.getElementById("encryptedFileInput");
const encryptedFile = encryptedFileInput.files[0];
// Get the encryption key and IV (as JSON)
const keyInput = document.getElementById("keyInput");
const ivInput = document.getElementById("ivInput");
const keyFile = keyInput.files[0];
const ivFile = ivInput.files[0];
if (!encryptedFile || !keyFile || !ivFile) {
alert("Please select the encrypted file, key, and IV.");
return;
}
// Read the key and IV as JSON
const keyData = await keyFile.text();
const ivData = await ivFile.text();
// Convert the JSON data to JavaScript objects
const keyObj = JSON.parse(keyData);
const iv = JSON.parse(ivData);
console.log('iv: ', new Uint8Array(iv))
// const importAlgorithm = {
// name: "AES-GCM",
// namedCurve: "P-256", // Adjust this curve based on your JWK.
// }
const algorithmName="AES-GCM";
// const algorithmName="AES-CBC";
// const importAlgorithm = {
// name: "AES-GCM"
// };
const importAlgorithm = {
name: algorithmName
};
// const ivSize=12
const ivSize=16
const keyUsage = ["encrypt","decrypt"];
const key = await crypto.subtle.importKey("jwk", keyObj, importAlgorithm, false, keyUsage)
// 1 mb( size while encrypting + 12 bytes(iv size) )
const chunkSize= (1024*1024)+ivSize
const reader = new FileReader();
const fileData = [];
let offset = 0;
reader.onload = async function () {
console.log('chunk loaded')
const chunk = new Uint8Array(reader.result);
const decryptedChunk = await window.crypto.subtle.decrypt(
{ name: algorithmName, iv: new Uint8Array(ivSize) },
key,
chunk
);
fileData.push(decryptedChunk);
offset += chunk.length;
if (offset < encryptedFile.size) {
readSlice(offset);
} else {
// All chunks are encrypted; combine them and provide a download link.
const decryptedData = new Blob(fileData, { type: encryptedFile.type });
const url = URL.createObjectURL(decryptedData);
const downloadLink = document.getElementById("downloadLink");
downloadLink.href = url;
downloadLink.download="someting.dec"
downloadLink.style.display = "block";
downloadLink.click()
console.log('finished')
}
};
function readSlice(offset) {
const slice = encryptedFile.slice(offset, offset + chunkSize);
reader.readAsArrayBuffer(slice);
}
readSlice(0);
// // Read the encrypted file
// const encryptedData = await encryptedFile.arrayBuffer();
// // Decrypt the file using the Web Crypto API
// try {
// const decryptedData = await window.crypto.subtle.decrypt(
// {
// name: "AES-GCM",
// iv : new Uint8Array(12)
// },
// key,
// encryptedData
// );
// // Create a Blob from the decrypted data
// const decryptedBlob = new Blob([decryptedData]);
// // Create a download link for the decrypted file
// const downloadLink = document.getElementById("downloadLink");
// downloadLink.href = URL.createObjectURL(decryptedBlob);
// downloadLink.download = "decrypted_file.txt"; // Set the desired file name
// downloadLink.style.display = "block";
// } catch (error) {
// console.error("Decryption error:", error);
// alert("Decryption failed. Please check the key and IV.");
// }
});
</script>
</body>
</html>
```

View file

@ -0,0 +1,53 @@
FreeBSD
- fastest bandwidth I've had, beats Linux 2x over
- no hugely fragmented distro bullshit
- amazing networking stack, small, clean codebase, clean base system that gets stable updates, but the packages are updated much more often
freebsd has the most readable kernel code I have ever seen
- So, on FreeBSD you have a base system, everything except user-installed stuff basically. The stuff you install using the package manager does not touch that base system, the base system only gets updated when you update from a release to another. But it's not like Debian, so stuff you install using pkg, the package manager, will get rolling updates.
the result is that you can't do anything with your packages that would make your system unbootable
you could remove every package on your system and still have a functioning base

View file

@ -0,0 +1,18 @@
Markdown preview rendering
- https://docusaurus.io/
install using
`npx create-docusaurus@latest my-website classic`
Then run it by
`cd my-website`
`npx docusaurus start`
or
```bash
npm init docusaurus@latest my-website classic
cd my-website
npm run start
```
docusarous source code with node_modules
docusaurus_bkp.7z https://files.catbox.moe/ibwmte.7z
https://www.mediafire.com/file/9clkafkf7vbxgoj/docusaurus_bkp.7z/file
docusaurus_preview.mp4 https://small.fileditchstuff.me/s6/mEZTgPTjZwvecEmOfAD.mp4

View file

@ -0,0 +1,86 @@
Media Hosting
- https://www.reddit.com/r/webdev/comments/u7o4iw/any_good_directlink_video_hosting_platforms/
[Any good direct-link video hosting platforms r_webdev.pdf](../../../_resources/Any%20good%20direct-link%20video%20hosting%20platforms%20r_web.pdf)
https://github.com/FahadBinHussain/awesome-file-hosts
[awesome-file-hosts-main.zip](../../../_resources/awesome-file-hosts-main.zip)
- https://nafanz.github.io/
[Spreadsheet (16_10_2026 9:09:24 pm).html](../../../_resources/Spreadsheet%20%2816_10_2026%209:09:24%20pm%29.html)
&nbsp;
- https://transfer.sh/
- https://www.youtube.com/watch?v=c_arQ-6ElYI : stealing storage from discord
https://www.youtube.com/watch?v=QiGKrBDqmKg : from telegram
https://disboxapp.github.io/web/
https://github.com/devdetour/TelegramFUSE
Stealing Storage from Telegram.mp4 https://files.catbox.moe/3esww5.mp4
Stealing Storage from Discord.mp4 https://files.catbox.moe/hlqhtk.mp4
[TelegramFUSE-main.zip](../../../_resources/TelegramFUSE-main.zip)
- https://app.skiff.com/drive/dashboard : skiff drive
- https://www.playbook.com/ : 100GB free
- https://fileditch.com/ : 15gb per file peragema storage
similary akirabox(30 days after last download) and filester
- https://pomf2.lain.la/ : 1gb per file peragema storage
https://pone.rs/ : 1gb permanent
https://host.hosti.in/ : 20 gb permanent (well not that reliable)
https://qu.ax/aIEmt : 256 mb max
https://leopard.hosting.pecon.us : 100mb, ddl, no api but maybe can be reverse engineered
https://pillows.su/ : for only audio, max is 200mb
https://filejump.com/ : 5gb, webdav
- https://psitransfer.imagisphe.re/ : 1 week max temp storage
https://nowtransfer.de/ : same but for 8 weeks(same ui too)
these 2 using this https://github.com/psi-4ward/psitransfer
storage.to, : 1 week max, no direct ddl
https://buzzheavier.com/ : 8 days, do provide direct links
pixeldrain (6gb/day, 60 days limit)
https://www.files.dp.ua/, https://dropmefiles.net : 14 days max, wait for download no ddl
https://www.tempsend.com/ : 1 week
https://www.udrop.com : atleast a week, no ddl access, 100 gb max storage for account
https://patchy.moe/ : 4gb file, 14 days
https://savedly.net : 7 days
- https://hypeshare.io/ : 7 days, 100 downloads max
https://1cloudfile.com/ : 20 days, no ddl link
https://ufile.io/ : 30 days, no api or ddl link
https://datanodes.to/ : 5 days, 3gb / file, no ddl
https://spacebyte.in : 25gb, indian (shit , getiing breaking in between, maybe chunk non resume bs)
- sync
![33fe54064980572fe7f6d73007eb6f5c.png](../../../_resources/33fe54064980572fe7f6d73007eb6f5c.png)
- https://bunkr.site/faq : 30 days 2gb/file temp storage
- minio : https://www.stackhero.io/en/services/MinIO/pricing, s3 compatible, trial of 2 months but no credit card required
- nextcloud
https://github.com/thetuxinator/nextcloud_providers
https://help.nextcloud.com/t/a-list-of-hosters/193327
https://nch.pl/login : 15gb free
https://cloud.magdeburg.jetzt/ : 5gb free
https://my.adminforge.d : 3gb free
- https://chomikuj.pl : unlimited, cons : only in polish,limited quota of 50 mb when not logged in
(thjis is unreliable and even for downloading original account is requied so only to be used when to transsfer or temp backup of files)
video:
https://cloudinary.com :
Upload API - Hourly requests : Unlimited
Admin API - Hourly requests : 500
Maximum number of users
3
Maximum number of product environments
1
Maximum image file size
10 MB
Maximum video file size
100 MB
Maximum online image manipulation size
100 MB
Maximum raw file size
10 MB
Maximum image megapixels
25 MP
Maximum total number of megapixels in all frames
50 MP

View file

@ -0,0 +1,3 @@
Mirrors
1. Aliucord,cutTheCord,vendetta, lightcord(desktop) : Discord mirror

View file

@ -0,0 +1,104 @@
- https://www.tecmint.com/free-open-source-cloud-storage-tools-for-linux/
-
![IMG_20230905_144031.jpg](../../../_resources/IMG_20230905_144031.jpg)
- ![a40ea2a8fa99b25b1fd49c2b3e6bdf90.png](../../../_resources/a40ea2a8fa99b25b1fd49c2b3e6bdf90.png)
-https://gitly.org/ : minimal github.com. cant host pages, dont have any ci/cd functionality
- https://www.shuttle.rs : rust backend hosting paltform
&nbsp;
- https://pixelfed.org/servers : pixelfed (decentralized image sharing)
- Mountain duck sync
- https://news.itsfoss.com/moosync/ : Moosync music player is an interesting cross-platform app for your local collection and streaming music.
- Pinephone : open source hardware phone
- https://github.com/makeplane/plane : Open Source JIRA, Linear and Height Alternative. Plane helps you track your issues, epics, and product roadmaps in the simplest way possible.
- GitHub - notable/notable: markdown note taking app similar to oplin with no mobile client
- https://f-droid.org/en/packages/org.schabi.newpipe/ : newpipe, youtube open source client
- animepipe : like newpipe but can watch live too
https://piped.kavin.rocks/ : web client
https://github.com/TeamPiped/Piped/wiki/Instances
[Instances · TeamPiped_Piped Wiki · GitHub (11_10_2023 1_36_12 AM).html](../../../_resources/Instances%20·%20TeamPiped_Piped%20Wiki%20·%20GitHub%20%2811_10_2.html)
- https://itsfoss.com/open-source-password-managers/
- https://github.com/vfsfitvnm/ViMusic : client of yt music
- https://github.com/RobinLinus/snapdrop : file sharing LAN
- https://medevel.com/19-lan-file-transfer-file-sharing/
- Nuclear music player : can download, fetch lyrics from various services. Electron and heavy
- mpv music player : to directly play some individual files. a cli tool
- jami : communication app : https://jami.net/
- https://news.itsfoss.com/celeste/ : celeste a open source file sync GUI client in rust
- https://news.itsfoss.com/ardour-8-2-release/ : for Digital Music Creators
- Cmus, qmmp (consoles) : music player
- gmusicbrowser , quodlibet(gtk) : music player for linux
- https://news.itsfoss.com/exciting-apps-2023/ : 8 Exciting Open Source Apps Linux Users Loved Exploring in 2023
- https://news.itsfoss.com/xplorer/ : xplorer
- https://news.itsfoss.com/atom-creators-zed-open-source/ : zed(code editor)
- https://hoppscotch.io/ : postman alternative
https://www.reddit.com/r/selfhosted/comments/152ew7v/good_alternative_to_postman/
https://github.com/usebruno/bruno
https://github.com/usebruno/bruno/pull/2755/files : bruno with raw file upload
https://github.com/flawiddsouza/Restfox : web client
thunderclient vs code extension altenative : flashpost, echoapi
[bruno-main.zip](../../../_resources/bruno-main.zip)
https://github.com/stepci/awesome-api-clients
[awesome-api-clients-main.zip](../../../_resources/awesome-api-clients-main.zip)
```txt
https://firecamp.dev/
Restfox https://restfox.dev/
bruno https://github.com/usebruno/bruno
Hoppscotch https://hoppscotch.io/
Hit https://hit.yolo42.com/
HTTP Client https://www.jetbrains.com/help/idea/http-client-in-product-code-editor.html
Hurl https://hurl.dev
Kreya https://kreya.app
Milkman https://github.com/warmuuh/milkman
Nap https://github.com/davesheldon/nap
Paw https://paw.cloud
restclient.el https://github.com/pashky/restclient.el
REST Client https://github.com/Huachao/vscode-restclient
Socketfox https://socketfox.dev
Step CI https://stepci.com
vim-http-client https://github.com/aquach/vim-http-client
vscode-restclient https://github.com/Huachao/vscode-restclient
verb https://github.com/federicotdn/verb
rest client: https://addons.mozilla.org/en-US/firefox/addon/restclient/
httpie: https://httpie.io/
httprepl : https://devblogs.microsoft.com/dotnet/httprepl-a-command-line-tool-for-interacting-with-restful-http-services/
API Dash - https://github.com/foss42/apidash
Pororoca - https://github.com/alexandrehtrb/Pororoca supports HTTP/2 and HTTP/3, full compatibility with Postman collections and environments
Gist with updates https://gist.github.com/sangelxyz/f73b1f7581318979275322dc13094e19
```

View file

@ -0,0 +1,103 @@
Privacy
- Quotes
https://yourstory.com/2017/06/edward-snowden-quotes-privacy
[Edward Snowden's quotes on the importance of privacy (11_2_2023 12_55_02 PM).html](../../../_resources/Edward%20Snowden_s%20quotes%20on%20the%20importance%20of%20priva.html)
1. Arguing that you don't care about the right to privacy because you have nothing to hide, is no different than saying you don't care about free speech because you have nothing to say.
2. "Sometimes the scandal is not what law was broken, but what the law allows."
3. It's crazy how "they're just trying to make money" is considered a proper justification for anything corporations do. I also don't see how "spying on kids" is any less creepy than spying on people.
4. I need privacy, not because my actions are questionable, but because your judgment and intentions are.
- Govt ID verification
- Comments
I personally hate this. Why should my ID be on 150 services, each with their own servers and security levels?
It's not safe. There are other ways to verify contact details, I don't want to upload my ID to every service.
I would promptly leave if I'm asked to do this.
It's not private, it's not secure, it's not needed.
Most of the spam messages come from @gmail and @onmicrosoft domains so let's not kid ourselves that this will help in any meaningful way in combating spam.
&nbsp;
As someone who works for an MSP that has several governmental clients, I can assure you with confidence that those registrars cut corners somewhere, and that PII is stored in some form. Logs, “anonymized” analytics, backups, replication DR, etc.
This is a problem I complain constantly about, but my clients always shut me down for being “overly paranoid.”
The best way to prevent data leaks is to have never had the data in the first place.
&nbsp;
- Aadhar card india
In india we need 'aadhar card' to buy a sim which is a national id card which have information such as photo,name,address and biometrics. Also biometrics verification needed to buy sim
India's Aadhar database isnt secure and is hacked before
So by giving phone numbes they can cross check details with leaked aadhar card details and get our address and biometric details too
- Importance of VPN
1. Hide domain address from ISP
2. Access to geoblock content and evade censorship
3. Spoofing IP to bypass restrictions when site use IP to ban users or limit them
4. Even when we use https there is a chance of MITM(Man in the Middle) attack which is in between device and website so https would be useless
5. Some countries (such as India) block the raw.githubusercontent.com domain, which is where some of our files are hosted on
6. ![58a4df88506057184ffb8054b4d63784.png](../../../_resources/58a4df88506057184ffb8054b4d63784.png)
- Privacy orineted setings or apps
https://privacy.sexy/
https://github.com/imribiy/useful-regs-bats
https://github.com/imribiy/group-policy-library
- https://www.makeuseof.com/tag/how-to-delete-personal-data-public-record-websites/
-
- https://anonymousplanet.org/\
https://anonymousplanet.org/guide.html
https://files.sdrive.app/b6e2b6cd-897c-4bbb-b102-1c710e37dfd1.pdf
https://files.sdrive.app/3eff131c-bdc9-4655-9c60-7fb00927af6c.html
The Hitchhiker’s Guide to Online Anonymity The Hitchhiker’s Guide to Online Anonymity.pdf
https://files.catbox.moe/imdlhy.pdf
The Hitchhiker’s Guide to Online Anonymity _ The Hitchhiker’s Guide to Online Anonymity (6_6_2024 5_43_59 am).html
https://files.catbox.moe/zzzuvz.html
&nbsp;
- https://reports.exodus-privacy.eu.org/en/ : to check if a certain app has facebook trackers or not
- https://stealths.net/ : to get burner credit card
- Whonix is a debian based operating system and it's built on security, your IP is hidden because of the technique of isolation. It's built on two major programs:
System,
Gateway
The gateway acts as a middleman and it forces every request reaching your system into the Tor network making you untrackable
- People say that 'no one is interested to spy on you loser' but would u rather open a bathroom door if your room mate say 'no need to close bcz I won't bother u and I don't wanna see u shit'
Reason is not about if anyone spies it's more about not letting us keep profiting from data and have peace of mind so that we live with dignity
- russia :
Q: when trying to connect to vpn?
A: It blocks responses from the server
so there's literally nothing
from inside you don't even get a message, it's just as if the server didn't exist
Q : can u connect to tor without bridge?
A : no we need to use bridge for that
what r banned in russia
political stuff, twitter, anything facebook, some media
- dangerous stuffs
- https://scholar.harvard.edu/files/mickens/files/thisworldofours.pdf
- https://xkcd.com/538/
- discord phone number thing
https://support.discord.com/hc/en-us/community/posts/1500001194821-Discord-now-requires-your-personal-phone-number-to-use-Discord-after-account-is-locked-Something-s-going-on-here-error
&nbsp;
privacy measures with discord
https://discuss.privacyguides.net/t/strategies-how-to-use-discord-or-any-service-that-requires-an-account-more-privately/17502

View file

@ -0,0 +1,46 @@
caddy
either install go binary and place it where root user can access or use your package manager to install
and for domains which are not public use this TLD
`.local`, `.internal`, `.localhost` and make to sure to register them like this
```sh
sudo nano /etc/hosts
```
then
add this
`127.0.0.1 exampler1267.internal`
Caddyfile example
```txt
localhost:3009 {
respond "Hello, world!"
}
# :8007 {
# bind 0.0.0.0
# tls internal
# reverse_proxy :8008
# }
https://localhost:8007 {
bind 0.0.0.0
tls internal
reverse_proxy :8008
}
https://192.168.29.234:8007 {
bind 0.0.0.0
tls internal
reverse_proxy :8008
}
```
use `caddy start` and `caddy stop` to start and end process

View file

@ -0,0 +1,337 @@
resource
https://github.com/spantaleev/matrix-docker-ansible-deploy
matrix homeserver
some servers
- synapse : standard one and feature rich but heavy
lightweight ones
https://git.telodendria.org/jakubgencur/Telodendria, conduit,dendrite and https://github.com/heusalagroup/hghs, https://github.com/matrix-construct/tuwunel
trying tuwunel
1. download release https://github.com/matrix-construct/tuwunel/releases/download/v1.5.1/v1.5.1-release-all-x86_64-v3-linux-gnu-tuwunel.zst
2. executing it will work but first needed to be configured
3. create a toml file say `config.toml` and use example from https://matrix-construct.github.io/tuwunel/configuration/examples.html#example-configuration (it acts as template). or [config.toml](../../../../_resources/config.toml)
```toml
[global]
# The server_name is the pretty name of this server. It is used as a
# suffix for user and room IDs/aliases.
#
# See the docs for reverse proxying and delegation:
# https://tuwunel.chat/deploying/generic.html#setting-up-the-reverse-proxy
#
# Also see the `[global.well_known]` config section at the very bottom.
#
# Examples of delegation:
# - https://matrix.org/.well-known/matrix/server
# - https://matrix.org/.well-known/matrix/client
#
# YOU NEED TO EDIT THIS. THIS CANNOT BE CHANGED AFTER WITHOUT A DATABASE
# WIPE.
#
# example: "girlboss.ceo"
#
server_name = "muty.org"
# This is the only directory where tuwunel will save its data, including
# media. Note: this was previously "/var/lib/matrix-conduit".
#
database_path = "database"
allow_registration = true
# Enabling this setting opens registration to anyone without restrictions.
# This makes your server vulnerable to abuse
#
yes_i_am_very_very_sure_i_want_an_open_registration_server_prone_to_abuse = true
# by adding 0.0.0.0 it will not only be available for localhost but for devices sharing same wifi too
address = ["127.0.0.1", "::1","0.0.0.0"]
```
&nbsp;
synapse
https://element-hq.github.io/synapse/latest/setup/installation.html#installing-as-a-python-module-from-pypi
pip way
after creating a folder and cd to it
```sh
python3 -m venv env # to create venv
source env/bin/activate # to activate it
pip install --upgrade pip
pip install --upgrade setuptools
pip install matrix-synapse
```
configuration
`python -m synapse.app.homeserver \
--server-name my.domain.name \
--config-path homeserver.yaml \
--generate-config \
--report-stats=[yes|no]`
starting it
`synctl start`
or for non daemon
`python3 -m synapse.app.homeserver -c homeserver.yaml`
more configuration
```yml
enable_registration: true
enable_registration_without_verification: true
url_preview_enabled: true
url_preview_ip_range_blacklist: null
```
using postgresql instead of sqlite for production
https://element-hq.github.io/synapse/latest/postgres.html#porting-from-sqlite
![Using Postgres - Synapse.pdf](../../../../_resources/Using%20Postgres%20-%20Synapse.pdf)
1. Make sure to install `psycopg2` by `source env/bin/activate && pip install psycopg2-binary`
&nbsp;
&nbsp;
**connecting with ngrok**
The error you're seeing—"homeserver configuration found with <url> is unusable"—typically comes from **Element** (or another Matrix client) when it discovers your homeserver's configuration (via `.well-known` or direct probing) but decides the setup is invalid or unreachable for some reason.
This is **very common** when using **ngrok** to expose a local Synapse server (especially on localhost:8008), because ngrok creates a temporary HTTPS URL, but several things break federation/client discovery.
### Most likely causes with ngrok
1. **Your `server_name`** in `homeserver.yaml` is still set to something like `localhost`, `127.0.0.1`, or your local machine name (not the ngrok URL).
- Synapse **must** know its public identity → `server_name: your-ngrok-subdomain.ngrok-free.app` (or whatever your ngrok URL is without https://).
- Clients expect the homeserver to present itself consistently under that name.
2. **No `.well-known/matrix/server`** and/or `.well-known/matrix/client`** delegation set up.
- Modern clients (especially Element) strongly prefer or require **delegation** via these files when the base URL ≠ server_name.
- With ngrok you almost always need them.
3. **Ngrok free tier limitations** — the random/free URLs often cause strict clients to reject the certificate or see the setup as "unusable" because:
- The domain doesn't match expectations
- No proper TLS setup or mixed HTTP/HTTPS probing
- Ngrok injects a page/captchas sometimes → breaks /.well-known requests
4. **You're entering the wrong URL in the client**:
- Don't enter `http://localhost:8008`
- Don't enter `https://xxxx.ngrok-free.app:8008` (ngrok already forwards to 8008)
- Usually just enter `https://xxxx.ngrok-free.app` (or your custom ngrok domain)
### Quick fix steps (most reliable for ngrok)
1. **Stop Synapse**, edit `homeserver.yaml`:
```yaml
server_name: "abcd1234.ngrok-free.app" # ← use your ACTUAL ngrok URL here (no https://, no port)
# If you want federation later (optional but recommended)
federation_domain_whitelist: [] # or leave commented
# Make sure these are NOT forcing http or weird ports
public_baseurl: https://abcd1234.ngrok-free.app/ # optional but helps
```
→ Restart Synapse
2. **Set up .well-known delegation** (this is usually what fixes the "unusable" error):
Create a simple static web server (or use Python's built-in one) on port 80 or 443 if you can, but since you're using ngrok for 8008, the easiest is:
- Run a tiny HTTP server in a separate terminal (in a new folder):
```bash
mkdir well-known
cd well-known
mkdir -p .well-known/matrix
```
Create two files:
`.well-known/matrix/server`:
```json
{
"m.server": "abcd1234.ngrok-free.app:443"
}
```
`.well-known/matrix/client`:
```json
{
"m.homeserver": {
"base_url": "https://abcd1234.ngrok-free.app"
}
}
```
- Start a simple server in that folder:
```bash
python3 -m http.server 8080
```
- Run a **second ngrok** tunnel just for this well-known:
```bash
ngrok http 8080
```
→ Get a new ngrok URL, e.g. `https://abcd-wellknown.ngrok-free.app`
- Then in your **main** homeserver.yaml add/change:
```yaml
serve_server_wellknown: false # optional
```
But actually tell clients to use the well-known domain as the homeserver URL.
Better: use your main ngrok URL as server_name, and serve the .well-known files via Synapse itself (add to homeserver.yaml):
```yaml
additional_wellknown_roots:
- path: /.well-known/matrix/server
content: '{"m.server": "your-ngrok-url:443"}'
- path: /.well-known/matrix/client
content: '{"m.homeserver": {"base_url": "https://your-ngrok-url"}}'
```
Restart Synapse → it will serve them directly.
3. **In Element** (web/desktop/mobile):
- Custom server / Edit → enter exactly `https://your-ngrok-url` (no port, no /)
- It should discover the config and say something like "Homeserver configuration found with https://your-ngrok-url"
- If it still says unusable → open browser dev tools (F12) → Network tab → look what request to `/_matrix/client/versions` or `/.well-known` fails and why (404, 502, cert error, etc.)
### Even easier alternatives if ngrok keeps fighting you
- Use a free static tunnel like **bore.pub**, **pinggy.io**, or **localhost.run** (sometimes behave better with Matrix)
- Get a cheap domain + Cloudflare Tunnel (zero trust) — much more reliable for Synapse
- Use Tailscale / Headscale + funnel — exposes localhost securely without public URL hassle
Test first with `curl https://your-ngrok-url/_matrix/client/versions` — should return JSON with `"versions": [...]`.
If you share:
- Your exact `server_name:` line
- The full ngrok URL you're using
- What exactly you enter in Element
- The **exact** error message (including the <url> part)
I can narrow it down further!
&nbsp;
&nbsp;
### for converting to https for LAN IP
resource : https://medium.com/@antelle/how-to-generate-a-self-signed-ssl-certificate-for-an-ip-address-f0dd8dddf754
![How to generate a self-signed SSL certificate for an IP address _ by Dimitri Witkowski _ Medium.pdf](../../../../_resources/How%20to%20generate%20a%20self-signed%20SSL%20certificate%20for%20.pdf)
**Self sign certificate way**
- create the following file named `openssl.cnf`. `192.168.1.50` is LAN IP
```
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
prompt = no
[ req_distinguished_name ]
C = US
ST = State
L = City
O = Local
CN = 127.0.0.1
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
IP.1 = 127.0.0.1
DNS.1 = localhost
IP.2 = 192.168.1.50
```
- now using this configuration, generate certificate and private key
`openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt -config openssl.cnf -extensions req_ext`
- not finallly in `homeserver.yaml` add these cetificates and enable tls
```yaml
server_name: "muta.org"
pid_file: /home/hpmi/Downloads/executables/synapse/homeserver.pid
# 1. Add these two lines globally to define your certificate paths
tls_certificate_path: "/home/hpmi/Downloads/executables/synapse/server.crt"
tls_private_key_path: "/home/hpmi/Downloads/executables/synapse/server.key"
listeners:
- bind_addresses:
- ::1
- 0.0.0.0
port: 8008
resources:
- compress: false
names:
- client
- federation
tls: true # 2. Change this from false to true
type: http
x_forwarded: true
```
- Now trust these certificates in client. in browser or maybe some apps there might be prompt to trust them so do that. in browser open the server LAN IP(not the client one) in tab and select 'accpet risk and continue'. in case of desktop like linux add them like this. add that crt file in this location `/usr/local/share/ca-certificates/` and then run command for updating `sudo update-ca-certificates`
&nbsp;
for a full ca one use
`openssl req -x509 -newkey rsa:4048 -keyout key.pem -out cert.pem -days 365 -nodes -subj "/CN=localhost" -addext "basicConstraints=critical,CA:TRUE"`
with https there can be issues with client which give no proper option to allow self signed certifciates so best way is to use both and use http where it can be used
in `homeserver.yaml`
```yaml
listeners:
# HTTPS
- port: 8448
bind_addresses:
- "0.0.0.0"
- "::1"
type: http
tls: true
x_forwarded: false
resources:
- names:
- client
- federation
compress: false
# HTTP
- port: 8008
bind_addresses:
- "0.0.0.0"
- "::1"
type: http
tls: false
x_forwarded: false
resources:
- names:
- client
- federation
compress: false
```
Client
Nheko
for managing multiple accounts use profile
`flatpak run im.nheko.Nheko -p default` or `flatpak run im.nheko.Nheko`
if not flatpak and directly installed
`nheko -p default`
for something other than default
`nheko -p work`

View file

@ -0,0 +1,174 @@
spacebar chat
also on
https://sbar.fyi
client on
https://git.sovrahi.com/oh64/Fermo
Date created : 11 feb 2026
**Server setup**
1. Get the files from https://github.com/spacebarchat/server
2. Now make sure to have node, python and psql installed. check version requiremnts on site
3. Install all node depedencies with `npm i`
4. Setup the postgresql database by creating a database say `spacebar` with query `create database spacebar`
5. Create a .env file in root of project and type `postgres://postgres:PASS@localhost:5432/spacebar` here PASS is password. by default password maybe your system one which is used to install program
6. Now run `npm run build` to build distribution files and `npm run start` to execute those
7. There will be error related to invalid values of configs. In database spacebar many tables will be created. One such is config. So update some values. If using cli then execute following queries
```sql
update config set value='"http://localhost:3001"' where key='general_serverName';
update config set value='"http://localhost:3001/api/v9"' where key='api_endpointPublic';
update config set value='"http://localhost:3001"' where key='cdn_endpointPublic';
update config set value='"http://localhost:3001"' where key='cdn_endpointPrivate';
update config set value='"ws://localhost:3001"' where key='gateway_endpointPublic';
```
or
in .env use
```txt
DATABASE=postgres://postgres:PASS@localhost:5432/spacebar
CONFIG_PATH=config.json
STORAGE_LOCATION=/mnt/hdd/files #Optional
```
for more environment variables refer to this
https://docs.spacebar.chat/setup/server/configuration/env/
now the config.json will be created when using npm run start and then mutate the values too. after mutating values this will be config.json
[config.json](../../../../_resources/config.json)
&nbsp;
**Client setup**
1. after cloning and moving to that directory simply `npm run build` and `npm start` will work
2. In order to connect with custom server, add instance like this. here instanced named 'MySpacebar' is added. this file is in `src/webpage/instances.json`
```json
[
{
"name": "Spacebar",
"description": "The official Spacebar instance.",
"image": "https://raw.githubusercontent.com/spacebarchat/spacebarchat/master/branding/png/Spacebar__Icon-Discord.png",
"url": "https://spacebar.chat"
},
{
"name": "MySpacebar",
"description": "My Own Spacebar instance.",
"url": "http://localhost:3001"
},
{
"name": "Fastbar",
"description": "The best Spacebar instance with 95% uptime, running under on a NVME drive running with bleeding edge stuff <3",
"image": "https://spacebar.greysilly7.xyz/logo.png",
"url": "https://greysilly7.xyz",
"language": "en",
"country": "US",
"display": true,
"urls": {
"wellknown": "https://greysilly7.xyz",
"api": "https://api-spacebar.greysilly7.xyz/api",
"cdn": "https://cdn-spacebar.greysilly7.xyz",
"gateway": "wss://gateway-spacebar.greysilly7.xyz"
},
"contactInfo": {
"discord": "greysilly7",
"github": "https://github.com/greysilly7",
"email": "greysilly7@gmail.com"
}
}
]
```
&nbsp;
personal bash script to open server, client and scn server
```sh
#!/bin/bash
SESSION="spacebar_session"
FIRST_COMMAND='nvm use 24 && cd "/home/hpmi/Videos/imp/github_forks/set2/spacebar/server" && npm run start'
# SECOND_COMMAND='nvm use 24 && cd "/home/hpmi/Videos/imp/github_forks/set2/spacebar/spacebar client/Fermi" && npm run start1'
SECOND_COMMAND='nvm use 24 && cd "/home/hpmi/Videos/imp/github_forks/set2/spacebar/spacebar client/Fermo" && caddy run --config ./Caddyfile'
THIRD_COMMAND='cd "/media/hpmi/Seagate/main/symlinks/selfBot/files" && python3 -m http.server 3003'
tmux new-session -d -s $SESSION
#C-m emulates pressing enter key
tmux send-keys -t $SESSION:0 "$FIRST_COMMAND" C-m
#create a new window of index 1 with name 'logs'
tmux new-window -t $SESSION:1 -n "client"
tmux send-keys -t $SESSION:1 "$SECOND_COMMAND" C-m
tmux new-window -t $SESSION:2 -n "cdn_serve"
tmux send-keys -t $SESSION:2 "$THIRD_COMMAND" C-m
tmux attach-session -t $SESSION
```
&nbsp;
fermo
so fork fermo then `npm build`
now for static hosting, make some rewrites
by caddy
```txt
http://localhost:8080 {
root * "/home/hpmi/Videos/imp/github_forks/set2/spacebar/spacebar client/Fermo/dist/webpage"
file_server
# Fallback rewrites for specific path prefixes
rewrite /channels/* /app.html
rewrite /invite/* /invite.html
rewrite /template/* /template.html
# Static file routing with a custom 404 fallback
try_files {path} {path}/ /404.html
}
```
nginx
```
server {
listen 80;
server_name localhost;
root /path/to/fermo/dist/webpage;
index index.html;
location /channels/ {
rewrite ^ /app.html last;
}
location /invite/ {
rewrite ^ /invite.html last;
}
location /template/ {
rewrite ^ /template.html last;
}
# Static files and directories
location / {
try_files $uri $uri/ /404.html;
}
error_page 404 /404.html;
}
```
&nbsp;
for spacebarchat ferno pull requests
You can log in with codeberg or Github or create a full sovrahi account, to send a commit the easiest way is to create a token in the forgejo token and do
https://[yourtoken]@git.sovrahi.com/yourfork
Then create a pull request
how to explain it better hmmm
you go on https://git.sovrahi.com/oh64/Fermo click on "Fork" then confirm
once in your fork copy the link to it (the url should be different)
in your account setting, go in https://git.sovrahi.com/user/settings/applications
Create a new token need to give it read and write for repository
then on your computer (you need git installed) you make a `git clone https://git.sovrahi.com/yoururl` OR this step you can also do git clone `https://[yourtoken]@git.sovrahi.com/yoururl`
but if you do it the first way it will ask for the token when you will try to push
on the fermo repo, on pull request, click on "new pull request" explain your things and create it!
![5719f80d5a9d122e8691c52648e90f60.png](../../../../_resources/5719f80d5a9d122e8691c52648e90f60.png)

Some files were not shown because too many files have changed in this diff Show more