diff --git a/.clang-format b/.clang-format
deleted file mode 100644
index 1f4f375..0000000
--- a/.clang-format
+++ /dev/null
@@ -1,19 +0,0 @@
----
-BasedOnStyle: LLVM
-IndentWidth: 4
-SortIncludes: false
-AlignConsecutiveAssignments: true
-AlignConsecutiveBitFields: true
-AlignConsecutiveMacros: true
-AlignEscapedNewlines: true
-AllowShortCaseLabelsOnASingleLine: true
-AllowShortEnumsOnASingleLine: true
-AllowShortFunctionsOnASingleLine: true
-AllowShortLambdasOnASingleLine: true
-BinPackParameters: false
-IndentCaseBlocks: true
-IndentCaseLabels: true
-IndentExternBlock: true
-IndentGotoLabels: true
----
-
diff --git a/.editorconfig b/.editorconfig
deleted file mode 100644
index 6c54233..0000000
--- a/.editorconfig
+++ /dev/null
@@ -1,11 +0,0 @@
-root = true
-
-[*]
-end_of_line = lf
-insert_final_newline = true
-indent_style = space
-indent_size = 4
-charset = utf-8
-trim_trailing_whitespace = true
-tab_width = 2
-
diff --git a/.forgejo/workflows/sitemap.yml b/.forgejo/workflows/sitemap.yml
deleted file mode 100644
index 8514d18..0000000
--- a/.forgejo/workflows/sitemap.yml
+++ /dev/null
@@ -1,41 +0,0 @@
-on:
- push:
- paths:
- - "pages/**"
- - "blog/**"
- - "sitemap.sh"
- - "index.xhtml"
-
-jobs:
- stats:
- runs-on: ubuntu-latest
- container: catthehacker/ubuntu:act-latest
- steps:
- - uses: actions/checkout@v4
- with:
- token: ${{ secrets.GIT_TOKEN }}
-
- - name: Set up repository
- run: |
- git reset --hard
- git pull
- git reset --hard
-
- - name: Generate sitemap
- run: |
- sh ./sitemap.sh
-
- - name: Stage the changes
- run: |
- git add sitemap.xml
-
- - name: Commit and Push Changes
- run: |
- if git diff --staged --quiet; then
- echo "No changes to commit."
- else
- git config --local user.email "sitemap@localhost"
- git config --local user.name "Sitemap CI/CD"
- git commit -am "[skip ci] Update sitemap" || echo "No changes to commit"
- git push origin HEAD -f
- fi
diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml
new file mode 100644
index 0000000..21fc6da
--- /dev/null
+++ b/.gitea/workflows/deploy.yml
@@ -0,0 +1,57 @@
+name: Deploy
+
+on:
+ push:
+ branches:
+ - rewrite-static
+
+jobs:
+ deploy:
+ name: Deploy website via rsync over SSH
+ runs-on: [self-hosted, linux]
+
+ env:
+ DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}
+ DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
+ DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
+ DEPLOY_PORT: ${{ secrets.DEPLOY_PORT }}
+ DEPLOY_PATH: ${{ secrets.DEPLOY_PATH }}
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
+
+ - name: Check required secrets
+ run: |
+ echo "Checking secrets availability..."
+ for var in DEPLOY_KEY DEPLOY_USER DEPLOY_HOST DEPLOY_PORT DEPLOY_PATH; do
+ if [ -z "${!var}" ]; then
+ echo "Error: Secret $var is empty or undefined!" && exit 1
+ else
+ echo "Found secret $var (length: ${#var})"
+ fi
+ done
+ shell: bash
+
+ - name: Set up SSH key
+ run: |
+ echo "Setting up SSH environment..."
+ mkdir -p ~/.ssh
+ chmod 700 ~/.ssh
+
+ echo "$DEPLOY_KEY" > ~/.ssh/id_ed25519
+ chmod 600 ~/.ssh/id_ed25519
+
+ ssh-keyscan -p "$DEPLOY_PORT" -H "$DEPLOY_HOST" >> ~/.ssh/known_hosts 2>/dev/null
+ echo "SSH setup complete."
+ shell: bash
+
+ - name: Deploy via rsync
+ run: |
+ echo "Starting rsync deployment..."
+ rsync -avz \
+ --delete \
+ -e "ssh -i ~/.ssh/id_ed25519 -p $DEPLOY_PORT -o StrictHostKeyChecking=no -o ConnectTimeout=10" \
+ ./ "${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_PATH}"
+ echo "Deployment finished successfully."
+ shell: bash
diff --git a/.gitignore b/.gitignore
index 1be9c5d..85e7c1d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1 @@
-files
-guides/xmpp
-/blog/posts/2025/why-i-don't-like-nicotine-pouches.xhtml
+/.idea/
diff --git a/0CB52690CD644413EF66A21CAEF2F9A8C0334670.asc b/0CB52690CD644413EF66A21CAEF2F9A8C0334670.asc
old mode 100644
new mode 100755
diff --git a/LICENSE b/LICENSE
index 43e91eb..3e9ebdf 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,203 +1,203 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [2023 - 2025] [Purplebored]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
diff --git a/README.md b/README.md
index 2d4fb32..5ed4317 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
## purplebored.pl
Welcome to my personal website, located at https://purplebored.pl !
-This is a simple and goofy website that serves as my personal space on the internet. (Such fancy wording ik)
+This is a simple website that serves as my personal space on the internet. (Such fancy wording ik)
### License Information
Licensed under the [Apache License, Version 2.0](LICENSE)
@@ -15,7 +15,7 @@ distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. For the full licene chcek out the LICENSE file
-(So much yap abt a license ong)
+(So much yap about a license)
### Contributing
-If you want to conrtibute something to my site just creating a issue first would be ideal!
+If you want to contribute something to my site please create a issue first, or if you know me, then just DM me about it first!
diff --git a/assets/css/style.css b/assets/css/style.css
index ff15626..0b052ff 100644
--- a/assets/css/style.css
+++ b/assets/css/style.css
@@ -1,137 +1,491 @@
-body {
- background-color: #000000;
- margin: 0;
- height: 100;
- overflow-x: hidden;
- display: flex;
- flex-direction: column;
- min-height: 100vh;
+/*
+* Prefixed by:
+* PostCSS: v7.0.29,
+* Autoprefixer: v9.7.6
+* Browsers: last 4 version
+*/
+
+@font-face {
+ font-family: "Clockopia";
+ src: url("../fonts/Clockopia.ttf") format("truetype");
}
@font-face {
- font-family: IBMWeb;
- src: url('/assets/fonts/ibm9x16.woff') format('truetype');
+ font-family: "LuxiSans";
+ src: url("../fonts/luxisr.ttf") format("truetype");
}
-/* Ascii logo */
-.ascii-logo {
- font-family: monospace;
- white-space: pre;
- color: #a57ae9;
- top: 50px;
-}
-/* End of Ascii logo */
-
-/* The main content of the website */
-.content1 {
- margin-left: 20px;
- margin-right: 20px;
- font-family: IBMWeb, Liberation Mono, monospace;
- background-color: #000000;
- color: #a57ae9;
- font-size: 1.0em;
- white-space: normal;
-}
-/* End of the main content of the website */
-
-/* You may ask yourself why are there two identical css sections. */
-.content2 {
- margin-left: 20px;
- margin-right: 20px;
- font-family: IBMWeb, Liberation Mono, monospace;
- white-space: normal;
- color: #a57ae9;
- font-size: large;
-}
-/* Very easy one is for articels or just post idk how to call them and the content1 thing if for general usage */
-
-/*Code to make footer look cool and ncie :D*/
-.footer {
- font-family: IBMWeb, Liberation Mono, monospace;
- text-align: center;
- margin-top: auto;
- padding: 1em;
- color: white;
- text-decoration: none;
- background: transparent;
-}
-/* End of the code which makes the footer look nice :( */
-
-/* Makes hyperlinks not look like shit */
-a {
- text-decoration: none;
- color: #447fc6;
+body {
+ margin: 0;
+ padding: 0;
+ display: flex;
+ flex-direction: column;
+ min-height: 100vh;
+ background-color: #0e0016;
+ color: white;
+ font-family: "system-ui", sans-serif;
+ overflow-x: hidden;
+ padding-right: 140px;
}
-/* Underlines the hyperlinks */
-::selection {
- color: #000000;
- background: #a57ae9
+.navbar {
+ width: 140px;
+ background: rgba(60, 26, 77, 0.55);
+ backdrop-filter: blur(10px);
+ -webkit-backdrop-filter: blur(10px);
+ border-left: 1px solid rgba(255, 255, 255, 0.05);
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+ align-items: center;
+ padding-top: 2rem;
+ padding-bottom: 2rem;
+ position: fixed;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ z-index: 20;
+ box-shadow: -2px 0 10px rgba(0, 0, 0, 0.4);
}
-a::selection {
- color: #000;
- background: #447fc6
-}
-
-a:not(:has(img)):hover {
- text-decoration: underline
-}
-/* End of the code which makes hyperlink usable */
-/* The Css for the article website */
-.article {
- margin-left: 35px;
- margin-right: 35px;
- font-family: monospace;
- color: #a57ae9;
- font-size: small;
+.navbar ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ width: 100%;
}
-/* CSS to make the guides look nice. */
-.ascii-logo2 {
- font-family: monospace;
- white-space: pre;
- color: #a57ae9;
- top: 50px;
+.navbar li {
+ width: 100%;
+ position: relative;
}
-.error {
- margin: 0 auto;
+.navbar a {
+ display: block;
+ color: white;
+ text-decoration: none;
text-align: center;
- font-family: monospace;
- white-space: pre;
- color: #a57ae9;
+ padding: 0.75rem 0;
+ position: relative;
+ transition: background 0.2s ease, color 0.2s ease;
}
-.snuff-warning h4 {
- margin-left: 20px;
- margin-right: 20px;
- font-family: Arial, serif;
- font-size: 16pt;
- font-weight: bold;
- text-transform: uppercase;
- text-align: center;
- border: 1mm solid black;
- padding: 4px;
- margin-bottom: 1em;
+.navbar a::before,
+.navbar a::after {
+ content: "";
+ display: block;
+ position: absolute;
+ left: 0;
+ width: 100%;
+ height: 1px;
+ background-color: rgba(255, 255, 255, 0.25);
+ transition: background-color 0.2s ease;
}
-.snuff-warning ul {
- margin-left: 20px;
- margin-right: 20px;
- list-style-type: none;
- padding-left: 0;
- margin-left: 0;
+.navbar a::before { top: 0; }
+.navbar a::after { bottom: 0; }
+
+.navbar a:hover {
+ background-color: #5e2b7a;
+ color: #fff5a8;
}
-.snuff-warning input[type="checkbox"] {
- margin-left: 20px;
- margin-right: 6px;
+.navbar a:hover::before,
+.navbar a:hover::after {
+ background-color: #fff5a8;
}
-.blog ul {
- list-style-type: none;
- padding-left: 0;
- margin-left: 0;
+.navbar-top-icons {
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+ gap: 16px;
+ margin-bottom: 1.5rem;
}
+.icon-item {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
+}
+
+.icon-item img {
+ width: 32px;
+ height: 32px;
+ object-fit: contain;
+ transition: transform 0.2s ease, opacity 0.2s ease;
+}
+
+.icon-item img:hover {
+ transform: scale(1.1);
+ opacity: 0.85;
+}
+
+.icon-label {
+ font-family: "Clockopia", sans-serif;
+ font-size: 0.8rem;
+ margin-top: 4px;
+}
+
+.tor-label { color: #6e2b9e; }
+.ygg-label { color: #92ffb3; }
+
+.mobile-nav-toggle {
+ display: none;
+ position: fixed;
+ top: 12px;
+ right: 12px;
+ z-index: 50;
+ background: rgba(60, 26, 77, 0.6);
+ color: #fff;
+ font-size: 1.8rem;
+ border: 1px solid rgba(255, 255, 255, 0.3);
+ border-radius: 6px;
+ padding: 4px 10px;
+ cursor: pointer;
+ backdrop-filter: blur(6px);
+ -webkit-backdrop-filter: blur(6px);
+}
+
+.footer {
+ position: relative;
+ width: 100%;
+ padding: 1rem 0;
+ text-align: center;
+ font-family: IBMWeb, "Liberation Mono", monospace;
+ color: #fff;
+ background: transparent;
+ margin-top: auto;
+ z-index: 10;
+}
+
+a { text-decoration: none; color: #447fc6; }
+
+::-moz-selection { color: #000000; background: #a57ae9; }
+::selection { color: #000000; background: #a57ae9; }
+a::-moz-selection { color: #000; background: #447fc6; }
+a::selection { color: #000; background: #447fc6; }
+a:not(:has(img)):hover { text-decoration: underline; }
+
+.content {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex: 1;
+ padding: 4rem 10%;
+ gap: 5%;
+ z-index: 10;
+ position: relative;
+ box-sizing: border-box;
+ flex-wrap: wrap;
+ max-width: calc(100% - 140px);
+}
+
+.left {
+ flex: 1;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.uzi {
+ width: 90%;
+ max-width: 650px;
+ height: auto;
+ pointer-events: none;
+}
+
+.middle {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ text-align: left;
+ z-index: 10;
+ max-width: 800px;
+}
+
+.middle h1 {
+ font-family: "Clockopia", sans-serif;
+ font-size: 3.5rem;
+ margin-bottom: 1rem;
+ color: #fff5a8;
+}
+
+.middle p {
+ font-size: 1.1rem;
+ line-height: 1.7;
+ margin-bottom: 1rem;
+ max-width: 550px;
+}
+
+.buttons {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+ margin-top: 1.5rem;
+}
+
+.buttons img {
+ width: 88px;
+ height: 31px;
+ border: none;
+ image-rendering: pixelated;
+}
+
+.services-page {
+ max-width: 900px;
+ margin: 0 auto;
+ padding: 6rem 2rem 8rem 2rem;
+ text-align: left;
+ box-sizing: border-box;
+}
+
+.service-card {
+ background: rgba(255, 255, 255, 0.05);
+ border: 1px solid rgba(255, 255, 255, 0.08);
+ padding: 1.5rem;
+ margin: 1.5rem 0;
+ border-radius: 6px;
+ backdrop-filter: blur(6px);
+ box-shadow: 0 0 12px rgba(0, 0, 0, 0.25);
+}
+
+.service-card h2 {
+ font-family: "Clockopia", sans-serif;
+ color: #fff5a8;
+ margin-top: 0;
+ margin-bottom: .75rem;
+}
+
+.service-card ul {
+ margin-left: 1.25rem;
+ line-height: 1.7;
+ color: #ddd;
+}
+
+.service-card a {
+ color: #fff5a8;
+ text-decoration: none;
+}
+
+.service-card a:hover {
+ text-decoration: underline;
+}
+
+@media (max-width: 900px) {
+ .services-page {
+ padding-left: 1.5rem;
+ padding-right: 1.5rem;
+ padding-top: 5rem;
+ text-align: center;
+ }
+ .service-card ul {
+ text-align: left;
+ }
+}
+
+
+/* Background */
+#night {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: #0e0016;
+ z-index: -9999;
+ pointer-events: none;
+}
+
+.clouds {
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: auto;
+ z-index: -5;
+ pointer-events: none;
+}
+
+.clouds img {
+ width: 100%;
+ height: auto;
+ display: block;
+ opacity: 0.5;
+ filter: blur(1px);
+}
+
+/* Project Page */
+.project-page {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
+ max-width: calc(100% - 140px);
+ margin: 0 auto;
+ padding: 5rem 2rem 8rem;
+}
+
+.project-page h1,
+.project-page h2,
+.project-page h3 {
+ font-family: "Clockopia", sans-serif;
+ color: #fff5a8;
+}
+
+.project-page a {
+ color: #fff5a8;
+ text-decoration: none;
+}
+
+.project-page a:hover {
+ text-decoration: underline;
+}
+
+.project-page ul {
+ text-align: left;
+ margin: auto;
+ max-width: 600px;
+}
+
+.project-page p {
+ max-width: 700px;
+ line-height: 1.5;
+ margin-bottom: auto;
+}
+
+/*Shit to make it not terrible for mobile users.*/
+@media (max-width: 1200px) {
+ .content {
+ flex-direction: column;
+ text-align: center;
+ padding: 3rem 2rem;
+ max-width: 100%;
+ }
+
+ .left, .middle {
+ flex: unset;
+ width: 100%;
+ }
+
+ .uzi {
+ width: 60%;
+ max-width: 600px;
+ margin-bottom: 2rem;
+ }
+
+ .middle {
+ text-align: center;
+ align-items: center;
+ }
+}
+
+/* Full mobile mode */
+@media (max-width: 900px) {
+ body {
+ padding-right: 0;
+ }
+
+ .navbar {
+ position: relative;
+ width: 100%;
+ height: auto;
+ flex-direction: row;
+ justify-content: center;
+ padding: 0.5rem 0;
+ border-left: none;
+ border-right: none;
+ }
+
+ .navbar ul {
+ display: flex;
+ gap: 1rem;
+ }
+
+ .content,
+ .project-page {
+ max-width: 100%;
+ flex-direction: column;
+ padding: 2rem 1.5rem;
+ text-align: center;
+ }
+
+ .middle {
+ text-align: center;
+ align-items: center;
+ max-width: 100%;
+ }
+
+ .uzi {
+ width: 70%;
+ margin-bottom: 2rem;
+ }
+
+ .footer {
+ padding-bottom: 2rem;
+ }
+
+ .navbar-top-icons {
+ margin-bottom: 0.5rem;
+ gap: 10px;
+ }
+
+ .icon-item img {
+ width: 24px;
+ height: 24px;
+ }
+
+ .icon-label {
+ font-size: 0.7rem;
+ }
+}
+.mobile-nav-toggle {
+ display: none;
+ position: fixed;
+ top: 12px;
+ right: 12px;
+ z-index: 50;
+ background: rgba(60, 26, 77, 0.6);
+ color: #fff;
+ font-size: 1.8rem;
+ border: 1px solid rgba(255, 255, 255, 0.3);
+ border-radius: 6px;
+ padding: 4px 10px;
+ cursor: pointer;
+ backdrop-filter: blur(6px);
+ -webkit-backdrop-filter: blur(6px);
+}
+
+@media (max-width: 900px) {
+ .mobile-nav-toggle {
+ display: block;
+ }
+
+ .navbar {
+ position: fixed;
+ right: -100%;
+ top: 0;
+ bottom: 0;
+ width: 200px;
+ padding-top: 3.5rem;
+ flex-direction: column;
+ height: 100vh;
+ transition: right 0.3s ease;
+ }
+
+ .navbar.open {
+ right: 0;
+ }
+
+ .navbar ul {
+ flex-direction: column;
+ gap: 0;
+ }
+
+ body {
+ padding-right: 0;
+ }
+}
\ No newline at end of file
diff --git a/assets/errors/401.xhtml b/assets/errors/401.xhtml
deleted file mode 100644
index 82c7dbf..0000000
--- a/assets/errors/401.xhtml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
diff --git a/assets/errors/favicon.png b/assets/errors/favicon.png
deleted file mode 100644
index e6d5883..0000000
Binary files a/assets/errors/favicon.png and /dev/null differ
diff --git a/assets/errors/hi.txt b/assets/errors/hi.txt
deleted file mode 100644
index 37909ae..0000000
--- a/assets/errors/hi.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-uhh hi! as you can see my error thingy is far from being done. This is just a temporay file to let you know if you for whatever reason are here.
-
-have a good day/night
\ No newline at end of file
diff --git a/assets/fonts/Clockopia.ttf b/assets/fonts/Clockopia.ttf
new file mode 100644
index 0000000..123ea4f
Binary files /dev/null and b/assets/fonts/Clockopia.ttf differ
diff --git a/assets/fonts/ibm9x16.woff b/assets/fonts/ibm9x16.woff
deleted file mode 100644
index 5ec7718..0000000
Binary files a/assets/fonts/ibm9x16.woff and /dev/null differ
diff --git a/assets/fonts/luxisr.ttf b/assets/fonts/luxisr.ttf
new file mode 100644
index 0000000..c47fd20
Binary files /dev/null and b/assets/fonts/luxisr.ttf differ
diff --git a/assets/images/blog/2025/ozonar.png b/assets/images/blog/2025/ozonar.png
deleted file mode 100644
index 37d7c9d..0000000
Binary files a/assets/images/blog/2025/ozonar.png and /dev/null differ
diff --git a/assets/images/buttons/fsky.png b/assets/images/buttons/fsky.png
deleted file mode 100644
index 6a5fd51..0000000
Binary files a/assets/images/buttons/fsky.png and /dev/null differ
diff --git a/assets/images/buttons/fsky_night.png b/assets/images/buttons/fsky_night.png
new file mode 100644
index 0000000..120ca16
Binary files /dev/null and b/assets/images/buttons/fsky_night.png differ
diff --git a/assets/images/buttons/greatsword.png b/assets/images/buttons/greatsword.png
new file mode 100644
index 0000000..6a8b49f
Binary files /dev/null and b/assets/images/buttons/greatsword.png differ
diff --git a/assets/images/buttons/nyx.png b/assets/images/buttons/nyx.png
deleted file mode 100644
index 799fae8..0000000
Binary files a/assets/images/buttons/nyx.png and /dev/null differ
diff --git a/assets/images/buttons/zayd.png b/assets/images/buttons/zayd.png
deleted file mode 100644
index 755c8e8..0000000
Binary files a/assets/images/buttons/zayd.png and /dev/null differ
diff --git a/assets/images/clouds.png b/assets/images/clouds.png
new file mode 100644
index 0000000..1a22841
Binary files /dev/null and b/assets/images/clouds.png differ
diff --git a/assets/images/icons/tor.png b/assets/images/icons/tor.png
new file mode 100644
index 0000000..2e48faa
Binary files /dev/null and b/assets/images/icons/tor.png differ
diff --git a/assets/images/icons/ygg.png b/assets/images/icons/ygg.png
new file mode 100644
index 0000000..9b13f7c
Binary files /dev/null and b/assets/images/icons/ygg.png differ
diff --git a/assets/images/pfp.png b/assets/images/pfp.png
new file mode 100644
index 0000000..a37e529
Binary files /dev/null and b/assets/images/pfp.png differ
diff --git a/assets/images/uzi.png b/assets/images/uzi.png
new file mode 100644
index 0000000..5a6aa49
Binary files /dev/null and b/assets/images/uzi.png differ
diff --git a/assets/js/script.js b/assets/js/script.js
new file mode 100644
index 0000000..3f41bc2
--- /dev/null
+++ b/assets/js/script.js
@@ -0,0 +1,175 @@
+"use strict";
+function create_night(canvas_element) {
+ const context = canvas_element.getContext("2d");
+ const star_range = 0.7; /* Variation in star size */
+ const star_spread = 0.002; /* Star density per pixel */
+ const concentration_corner = "top-left"; /* Concentration corner position */
+ const concentration_strength = 5.0; /* How much should it be concentrated? */
+ const twinkle_intensity = 5.0; /* How noticeable should the twinkle be? */
+ const interaction_radius = 150; /* Radius around mouse/touch where stars react */
+ const interaction_brightness_factor = 5.0; /* How much brightness increases */
+ const interaction_size_factor = 1.5; /* How much the stars should grow in size (only during interaction) */
+ const magic = [
+ 16.31189, 32454.4619, 9371.1474, 6848, 1544, 6848, 2156,
+ ]; /* Just some magic numbers */
+ /* Seeded "random" number */
+ function seeded_random(seed) {
+ const value = Math.sin(seed) * 10000;
+ return value - Math.floor(value);
+ }
+ let stars = [];
+ let time = 0;
+ let mouse_x = -1,
+ mouse_y = -1;
+ /* Determine corner position for concentration */
+ function get_corner(width, height) {
+ switch (concentration_corner) {
+ case "top-right":
+ return { x: width, y: 0 };
+ case "bottom-left":
+ return { x: 0, y: height };
+ case "bottom-right":
+ return { x: width, y: height };
+ default:
+ return { x: 0, y: 0 }; /* top-left */
+ }
+ }
+ /* Function to generate star shape */
+ function draw_star(x, y, radius, alpha) {
+ const num_points = 5 + Math.floor(Math.random() * 3);
+ const angle = Math.PI / num_points;
+ context.beginPath();
+ for (let idx = 0; idx < num_points; idx++) {
+ const angle_offset = (idx * 2 * Math.PI) / num_points;
+ const outer_x = x + radius * Math.cos(angle_offset);
+ const outer_y = y + radius * Math.sin(angle_offset);
+ context.lineTo(outer_x, outer_y);
+ /* Inner points for star shape */
+ const inner_radius = radius / 2 + Math.random() * 0.2;
+ const inner_x = x + inner_radius * Math.cos(angle_offset + angle);
+ const inner_y = y + inner_radius * Math.sin(angle_offset + angle);
+ context.lineTo(inner_x, inner_y);
+ }
+ context.closePath();
+ context.fillStyle = `rgba(255, 255, 180, ${alpha})`;
+ context.fill();
+ }
+ /* Function to generate star background */
+ function generate_stars() {
+ const { width, height } = canvas_element;
+ const star_count = Math.floor(width * height * star_spread);
+ const corner = get_corner(width, height);
+ stars = [];
+ for (let idx = 0; idx < star_count; idx++) {
+ const base_random = seeded_random(idx * magic[0]);
+ /* Uniform random position */
+ const raw_x = seeded_random(base_random * magic[1]) * width;
+ const raw_y = seeded_random(base_random * magic[2]) * height;
+ /* Calculate distance from the corner to control concentration */
+ const dx = raw_x - corner.x;
+ const dy = raw_y - corner.y;
+ const distance = Math.sqrt(dx * dx + dy * dy);
+ /* Apply exponential falloff based on distance (closer = more likely to be drawn) */
+ const max_distance = Math.sqrt(width * width + height * height);
+ const weight = Math.exp(
+ -concentration_strength * (distance / max_distance),
+ );
+ /* Skip stars that don't meet the concentration threshold */
+ if (seeded_random(base_random * magic[3]) > weight) {
+ continue;
+ }
+ /* Randomized star properties */
+ const radius =
+ seeded_random(base_random * magic[4]) * star_range +
+ 0.4 +
+ Math.random() * 0.2;
+ const twinkle_speed =
+ seeded_random(base_random * magic[5]) * 1.5 + 0.3;
+ const twinkle_phase =
+ seeded_random(base_random * magic[6]) * Math.PI * 2;
+ stars.push({
+ x: raw_x,
+ y: raw_y,
+ radius,
+ twinkle_speed,
+ twinkle_phase,
+ original_radius: radius,
+ });
+ }
+ }
+ /* Resize canvas and regenerate stars on window resize */
+ function resize_canvas() {
+ canvas_element.width = window.innerWidth;
+ canvas_element.height = window.innerHeight;
+ generate_stars();
+ }
+ window.addEventListener("resize", resize_canvas);
+ resize_canvas();
+ /* Handle mouse/touch movement effects */
+ function handle_interaction(event) {
+ if (event.touches) {
+ mouse_x = event.touches[0].clientX;
+ mouse_y = event.touches[0].clientY;
+ } else {
+ mouse_x = event.clientX;
+ mouse_y = event.clientY;
+ }
+ }
+ window.addEventListener("mousemove", handle_interaction);
+ window.addEventListener("touchmove", handle_interaction);
+ /* Animate stars (twinke) */
+ function animate() {
+ time += 0.01;
+ const { width, height } = canvas_element;
+ context.fillStyle = "#0e0016";
+ context.fillRect(0, 0, width, height);
+ for (const star of stars) {
+ const twinkle = Math.sin(
+ time * star.twinkle_speed + star.twinkle_phase,
+ );
+ let alpha = 0.6 + twinkle_intensity * (0.5 + 0.5 * twinkle);
+ /* Interaction effect based on mouse/touch proximity */
+ if (mouse_x !== -1 && mouse_y !== -1) {
+ const dx = mouse_x - star.x;
+ const dy = mouse_y - star.y;
+ const distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < interaction_radius) {
+ const effect = Math.max(
+ 0,
+ 1 - distance / interaction_radius,
+ );
+ alpha *=
+ 1 +
+ effect *
+ interaction_brightness_factor; /* Make the star brighter */
+ star.radius =
+ star.original_radius *
+ (1 +
+ effect *
+ interaction_size_factor); /* Grow the star size */
+ }
+ }
+ draw_star(star.x, star.y, star.radius, alpha);
+ }
+ requestAnimationFrame(animate);
+ }
+ animate();
+}
+function base_main() {
+ const night = document.getElementById("night");
+ create_night(night);
+}
+document.addEventListener("DOMContentLoaded", () => {
+ base_main();
+});
+
+document.addEventListener("DOMContentLoaded", () => {
+ const toggle = document.querySelector(".mobile-nav-toggle");
+ const navbar = document.querySelector(".navbar");
+
+ if (toggle && navbar) {
+ toggle.addEventListener("click", () => {
+ navbar.classList.toggle("open");
+ });
+ }
+});
diff --git a/blog/blog.xhtml b/blog/blog.xhtml
deleted file mode 100644
index e080212..0000000
--- a/blog/blog.xhtml
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
- =Purpleblog=
-
-
-
-
-
-
=== Purpleblog ===
-
- Hello and welcome to my "new" blog. I used to use htmly but decided to stop using it since I had some issues with it. It was nice to write the blogs but the expireince for the user was mediocre at best. At least in my opinion.
- Well the blogs on here will be exactly the same as on blog.purplebored.pl just written manually by hand in xhtml. This is overall the better option and it will make my blog aviable over ygg, tor, and i2p.
-
- Alright I gonna be honest. I don't think I am going to write any blogs anymore. The truth is that I am not really good at writing them, I also have no idea about what to write!
- I kinda tried to write reviews and I did not like doing it that much like even now I have no clue at all what to write I am not really good at blogs I always sucked at it my not good English skills are also not really helping this situation.
- I will be not deleting my blog I will be still keeping it but for the last like few months I actually wrote nothing. Some people are born with a skill for writing long posts like this but I am sadly not one of them.
- I will be of course keeping my site and still updating it but this will be probably abandoned sadly. People tell me that writing is a skill you aquaire but I don't think so I just plainly speaking suck at it :(
- So yeah this is a short post but that's it and that's also one of the reasons I will be quitting writing blog posts I just can't write anything long enough. Maybe once I have some projects I will be writing about them, but for now this is it.
- Big thanks to the people reading my blog (If there even are any lol) and hopefully cya when I maybe change my mind about this.
-
-Okay so I went to the cinema to watch the Minecraft movie. Gonna be honest I am terrible at writing reviews but I gonna try my best here.
-
-Gonna start off by saying at the end of the day it's a kids comedy. Like if y'all want to watch it don't expect a movie with a good story and mature humor you won't get it from there but even after this I am actually happily surprised. The CGI looked way worse in the trailers, and even I got a smirk on my face from a few of the jokes. The soundtrack was also decent, and somehow the casting was also pretty alright. The story over all was sadly really predictable and the entire plot was also meh. Like I don't know what else to say it was just alright I went and saw it with my younger brother and his friend since I needed to supervise them and they liked it. The children in the cinema also liked it and were laughing at the jokes, if y'all got a young brother and care enough to go to the cinema then yeah I would say it's worth it to see, but if you want to see it by yourself then I don't think it's worth it. So overall I do not regret the money spent the movie was actually fully fine. If they actually invested into the story a bit more I would actually say it's would be pretty amazing I don't know what else to say it was a decent movie, worth it to watch with a younger sibling but not worth it to watch by yourself.
-
-Also funny story I overheard some kids talking about how they liked it but they wished it was a animation and not live action. So yeah even the kids believe it shouldn't have been live action LMFAO.
-
-Solid 6/10 in my opinion could be worse.
-
-So the Red bull snuff is one of the most popular snuffs here in Poland. It's a also a very popular first snuff for many of people. For me it was the second snuff I ever tried and here is my small review after using it for around 3 weeks:
-
-Going to start of with saying it's very strong and has a nice minty eucalyptus taste to it. Personally I am really mixed about the taste I don't think it's bad but I do think it's overrated. I saw a lot of people praising it for being the best snuff and the best snuff for beginners which I totally don't agree with. It's in my opinion too strong to beginners and there are better option. Price wise I would say it's in the mid range. I won't be telling the price in my reviews since that changes a lot with the taxes on tobacco changing a lot of the time and they differ a lot by the country. The box it comes in is a average generic Pöschl Tabak box which in my opinion sucks. The boxes tend to open in the pockets sometimes and the clips tend to break off which is really annoying. The aroma at first is amazing but it tends to go away after a while since the box it comes in isn't really "tight" I don't know how to explain it. The snuff last for quite a long while I had my 10g pack for around 3 or maybe even 4 weeks by this point. It also really works well if you have a runny nose since it clears it real good.
-
-To summarize: I believe that Red bull is over all good but I also believe that it is way too overrated and very much not a good snuff for beginners. Overall in my opinion it's a big and strong 8/10. Good but not perfect. If you been taking snuff for a while already and never tried it you should try it BUT if you never tried snuff then I would choose a less stronger snuff like maybe OZONA stuff or GLETSCHER PRISE.
-
-So the time finally came. I finished my 5grams of Ozona R-type. This was honestly a really hard snuff to review I have very mixed feelings about this. Well I am going to probably start off by saying it's very weak like probably the weakest one I tried so far. The taste is also pretty chemical but that doesn't mean it's bad it's still pretty good. I also gonna explain what the new "types" mean. Before they were called for example: Ozona Cherry, Raspberry, Orange, etc etc. But now they are called the first letter of the flavor. So Ozona R-type is Ozona Raspberry. It's a stupid and annoying change which I don't really like but you get used to it.
-
-
-
-Above you can see the differences between the old and new packaging
-
-So the flavor is a pretty decent chemical raspberry. It also has some mint in it. Very very good for beginners. I gave it to some of my friends which don't take snuff and they quite liked it (Unlike Red Bull which was somewhat too strong for them.) I personally found it mid since I like stronger snuffs. The packaging is pretty neat so I gonna talk about it. It's a 5gram metal round thingy which you rotate until it opens a hole. It kept the scent for quite a long time, it was also very convenient to use AND easy to open if you want to add a different snuff to it. Honestly I like this type of packaging most. It's nice, small, good, and simply convenient. Honestly I don't know what else to say if you are a beginner searching for some good and weak snuff then you should give Ozona R-Type snuff a shot. But if you are already a snuff user and like stronger snuffs then I would avoid it.
-
-And here comes the hard part. Giving it a rating. It's really hard since the taste is good but it's weak which makes it good for beginners but pretty mediocre for people who already are taking snuff and are used to stronger ones. I think it's a strong 6/10 for people who already take snuff and like something stronger and a BIG STRONG 8/10 for new snuff takers.
-
-
-
diff --git a/errors/favicon.png b/errors/favicon.png
deleted file mode 100644
index 35efa69..0000000
Binary files a/errors/favicon.png and /dev/null differ
diff --git a/errors/hi.txt b/errors/hi.txt
deleted file mode 100644
index 37909ae..0000000
--- a/errors/hi.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-uhh hi! as you can see my error thingy is far from being done. This is just a temporay file to let you know if you for whatever reason are here.
-
-have a good day/night
\ No newline at end of file
diff --git a/favicon.png b/favicon.png
deleted file mode 100644
index 0859c52..0000000
Binary files a/favicon.png and /dev/null differ
diff --git a/feed_gen.py b/feed_gen.py
deleted file mode 100644
index 3ba7e43..0000000
--- a/feed_gen.py
+++ /dev/null
@@ -1,84 +0,0 @@
-import os
-import datetime
-from bs4 import BeautifulSoup
-from feedgen.feed import FeedGenerator
-from pytz import UTC # Ensures timezone-aware datetime
-
-# Configuration
-BASE_URL = 'https://purplebored.pl'
-POSTS_DIR = './blog/posts'
-FEED_OUTPUT_DIR = './feeds'
-AUTHOR_NAME = 'Purplebored'
-AUTHOR_EMAIL = 'purplebored@posteo.com'
-
-def parse_xhtml_post(filepath):
- with open(filepath, 'r', encoding='utf-8') as f:
- soup = BeautifulSoup(f, 'lxml')
-
- # Try
- og_title = soup.find('meta', attrs={'name': 'og:title'})
- if og_title and og_title.get('content'):
- title = og_title['content']
- else:
- # Fallback to tag
- title_tag = soup.find('title')
- title = title_tag.get_text() if title_tag else 'Untitled'
-
- # Parse
- date_meta = soup.find('meta', {'name': 'date'})
- if date_meta and date_meta.get('content'):
- pub_date = datetime.datetime.strptime(date_meta['content'], '%Y-%m-%d')
- else:
- pub_date = datetime.datetime.fromtimestamp(os.path.getmtime(filepath))
-
- pub_date = pub_date.replace(tzinfo=UTC)
-
- # Extract article or body content
- content = soup.find('article') or soup.find('body')
-
- # Generate relative URL
- rel_path = os.path.relpath(filepath, POSTS_DIR)
- url = f'{BASE_URL}/blog/posts/{rel_path}'.replace('\\', '/')
-
- return {
- 'title': title,
- 'url': url,
- 'date': pub_date,
- 'content': str(content)
- }
-
-def generate_feeds(posts):
- fg = FeedGenerator()
- fg.id(BASE_URL)
- fg.title('Purplebored Blog')
- fg.author({'name': AUTHOR_NAME, 'email': AUTHOR_EMAIL})
- fg.link(href=BASE_URL, rel='alternate')
- fg.language('en')
- fg.description('A blog about snuff reviews and other thoughts.')
-
- for post in sorted(posts, key=lambda x: x['date'], reverse=True):
- fe = fg.add_entry()
- fe.id(post['url'])
- fe.title(post['title'])
- fe.link(href=post['url'])
- fe.published(post['date'])
- fe.content(post['content'], type='xhtml')
-
- os.makedirs(FEED_OUTPUT_DIR, exist_ok=True)
- fg.rss_file(os.path.join(FEED_OUTPUT_DIR, 'feed.rss'))
- fg.atom_file(os.path.join(FEED_OUTPUT_DIR, 'feed.atom'))
-
-def main():
- posts = []
- for root, dirs, files in os.walk(POSTS_DIR):
- for file in files:
- if file.endswith('.xhtml'):
- filepath = os.path.join(root, file)
- post_data = parse_xhtml_post(filepath)
- posts.append(post_data)
-
- generate_feeds(posts)
- print(f'✅ Generated {len(posts)} posts in RSS and Atom feeds.')
-
-if __name__ == '__main__':
- main()
diff --git a/feeds/feed.atom b/feeds/feed.atom
deleted file mode 100644
index bcc9df3..0000000
--- a/feeds/feed.atom
+++ /dev/null
@@ -1,114 +0,0 @@
-
-https://purplebored.plPurplebored Blog2025-09-25T19:58:02.453463+00:00Purpleboredpurplebored@posteo.compython-feedgenA blog about snuff reviews and other thoughts.https://purplebored.pl/blog/posts/2025/my-review-of-the-minecraft-movie.xhtmlMy review of the Minecraft Movie2025-09-25T19:58:02.453546+00:00
-
-
=== My Review of the "Minecraft Movie" ===
-
-Okay so I went to the cinema to watch the Minecraft movie. Gonna be honest I am terrible at writing reviews but I gonna try my best here.
-
-Gonna start off by saying at the end of the day it's a kids comedy. Like if y'all want to watch it don't expect a movie with a good story and mature humor you won't get it from there but even after this I am actually happily surprised. The CGI looked way worse in the trailers, and even I got a smirk on my face from a few of the jokes. The soundtrack was also decent, and somehow the casting was also pretty alright. The story over all was sadly really predictable and the entire plot was also meh. Like I don't know what else to say it was just alright I went and saw it with my younger brother and his friend since I needed to supervise them and they liked it. The children in the cinema also liked it and were laughing at the jokes, if y'all got a young brother and care enough to go to the cinema then yeah I would say it's worth it to see, but if you want to see it by yourself then I don't think it's worth it. So overall I do not regret the money spent the movie was actually fully fine. If they actually invested into the story a bit more I would actually say it's would be pretty amazing I don't know what else to say it was a decent movie, worth it to watch with a younger sibling but not worth it to watch by yourself.
-
-Also funny story I overheard some kids talking about how they liked it but they wished it was a animation and not live action. So yeah even the kids believe it shouldn't have been live action LMFAO.
-
-Solid 6/10 in my opinion could be worse.
-
-So the Red bull snuff is one of the most popular snuffs here in Poland. It's a also a very popular first snuff for many of people. For me it was the second snuff I ever tried and here is my small review after using it for around 3 weeks:
-
-Going to start of with saying it's very strong and has a nice minty eucalyptus taste to it. Personally I am really mixed about the taste I don't think it's bad but I do think it's overrated. I saw a lot of people praising it for being the best snuff and the best snuff for beginners which I totally don't agree with. It's in my opinion too strong to beginners and there are better option. Price wise I would say it's in the mid range. I won't be telling the price in my reviews since that changes a lot with the taxes on tobacco changing a lot of the time and they differ a lot by the country. The box it comes in is a average generic Pöschl Tabak box which in my opinion sucks. The boxes tend to open in the pockets sometimes and the clips tend to break off which is really annoying. The aroma at first is amazing but it tends to go away after a while since the box it comes in isn't really "tight" I don't know how to explain it. The snuff last for quite a long while I had my 10g pack for around 3 or maybe even 4 weeks by this point. It also really works well if you have a runny nose since it clears it real good.
-
-To summarize: I believe that Red bull is over all good but I also believe that it is way too overrated and very much not a good snuff for beginners. Overall in my opinion it's a big and strong 8/10. Good but not perfect. If you been taking snuff for a while already and never tried it you should try it BUT if you never tried snuff then I would choose a less stronger snuff like maybe OZONA stuff or GLETSCHER PRISE.
-
-So the time finally came. I finished my 5grams of Ozona R-type. This was honestly a really hard snuff to review I have very mixed feelings about this. Well I am going to probably start off by saying it's very weak like probably the weakest one I tried so far. The taste is also pretty chemical but that doesn't mean it's bad it's still pretty good. I also gonna explain what the new "types" mean. Before they were called for example: Ozona Cherry, Raspberry, Orange, etc etc. But now they are called the first letter of the flavor. So Ozona R-type is Ozona Raspberry. It's a stupid and annoying change which I don't really like but you get used to it.
-
-
-
-Above you can see the differences between the old and new packaging
-
-So the flavor is a pretty decent chemical raspberry. It also has some mint in it. Very very good for beginners. I gave it to some of my friends which don't take snuff and they quite liked it (Unlike Red Bull which was somewhat too strong for them.) I personally found it mid since I like stronger snuffs. The packaging is pretty neat so I gonna talk about it. It's a 5gram metal round thingy which you rotate until it opens a hole. It kept the scent for quite a long time, it was also very convenient to use AND easy to open if you want to add a different snuff to it. Honestly I like this type of packaging most. It's nice, small, good, and simply convenient. Honestly I don't know what else to say if you are a beginner searching for some good and weak snuff then you should give Ozona R-Type snuff a shot. But if you are already a snuff user and like stronger snuffs then I would avoid it.
-
-And here comes the hard part. Giving it a rating. It's really hard since the taste is good but it's weak which makes it good for beginners but pretty mediocre for people who already are taking snuff and are used to stronger ones. I think it's a strong 6/10 for people who already take snuff and like something stronger and a BIG STRONG 8/10 for new snuff takers.
-
2025-09-12T23:19:11.980358+00:00https://purplebored.pl/blog/posts/2025/blog-future.xhtml Future of my blog 2025-09-25T19:58:02.453500+00:00
-
-
=== The future of my blog ===
-
- Alright I gonna be honest. I don't think I am going to write any blogs anymore. The truth is that I am not really good at writing them, I also have no idea about what to write!
- I kinda tried to write reviews and I did not like doing it that much like even now I have no clue at all what to write I am not really good at blogs I always sucked at it my not good English skills are also not really helping this situation.
- I will be not deleting my blog I will be still keeping it but for the last like few months I actually wrote nothing. Some people are born with a skill for writing long posts like this but I am sadly not one of them.
- I will be of course keeping my site and still updating it but this will be probably abandoned sadly. People tell me that writing is a skill you aquaire but I don't think so I just plainly speaking suck at it :(
- So yeah this is a short post but that's it and that's also one of the reasons I will be quitting writing blog posts I just can't write anything long enough. Maybe once I have some projects I will be writing about them, but for now this is it.
- Big thanks to the people reading my blog (If there even are any lol) and hopefully cya when I maybe change my mind about this.
-
Hi, I am a 17-year-old retard called Purplebored, also known as Niko o/. Right now you are on my own little website which I call my home on the World Wide Web! Nothing special, but I hope you like it :D
+
+
I like making simple websites, and I am also a privacy advocate. I also love tobacco, and I am a big nicotine addict. I speak Polish and English, but I am also learning Russian. Regarding programming, I currently only know basic HTML. From other stuff, I also know some Linux and quite a lot about Windows — especially the older versions like Windows 7.
- Hi, I am Purplebored, o/ also known as Niko. Right now you are
- on my own little website which I call my home on the World Wide
- Web!
-
-
- I like making websites like this. And I am also somewhat of a
- privacy advocate. I also love tobaccoo and I really like nasal snuff. I even write a little bit about it but I am still very much a snuff newbie. I speak Polish and English but I am
- also learning Russian. Regarding programming I currently only know
- basic HTML. From
- other stuff I also know some Linux! (Not much but enough to daily
- drive it)
-
+ Hi, I’m Purplebored, also known as Niko. Welcome to my site and here are some information about me:
+
+
+
+ I like making simple websites like this, and I love self-hosting stuff when I can. I try to avoid most of the modern bloat out there, so that's why I have my own personal website instead of a social media account, or I use XMPP instead of using Discord.
+ I am also a privacy-minded person, so I try to avoid big tech shit as much as possible.
+
+ Oh, and the most important part I am Polish and I REALLY love my country. I am proud to be Polish, and if I had the chance to be born again I would choose Poland every day.
+
+
What I Do
+
+
Create small websites when I am bored (Like this one!)
+
Self-host services I like and use for example Mumble, or XMPP.
+
Create tiny shit from time to time like my Discord Userbot IRC bridge
+
Experiment with Linux, servers, and general sysadmin things
+
Fuck around with Windows (especially older versions like Windows 7)
+
+
Languages I Speak
+
+
Polish (native)
+
English (fluent in writing terrible in speaking.)
+
Russian (early stages of learning)
+
+
+
Random Facts About Me
+
+
I love tobacco and yes, I'm definitely a nicotine fien
+
I spend way too much time talking about nicotine and Poland
- Ah yes 88x31 also known as buttons, a staple in personal websites
- I would say. They are so cool in my opinion and I love having
- them. I even have my own 88x31 which you can download
-
- Here!
-
-
- (you can also just use that link instead of downloading the
- button. That would be even better actually because if I update my
- button it's going to automatically update on your website.)
-
-
Discord: niko2077 (Please avoid this!! Only use this if really need to! Even using email without PGP would be better!)
+
+
If you’re reporting a bug on this website, or one of my projects,
+ you can email me about it, OR if you have an account on my git you can also use that to report the issue.
- Below you’ll find all the guides I’ve written. Each guide is
- available for download as a PDF or .docx file. Download links
- are located at the top of each guide.
-
-
- My Private Pastebin instance.
-
- (Slightly out ofdate)
-
- Mumble - You can find it on mumble.purplebored.pl (Default port.). Simply connect with your mumble client and talk! You can also connect with ygg.
-
- Soju (irc Bouncer) soju.purplebored.pl - For now it's for close "homies" only.
-
- XMPP server. (Running Prosody 13.x.) - For now it's also for close "homies" only.
- My servers compliance. (95%)
-
- Gamja (Web IRC client.) - A web IRC client I host for my soju. Link.
-
+ MINISTER ZDROWIA OSTRZEGA: UŻYWANIE TYTONIU SZKODZI ZDROWIU.
+
+ THE MINISTER OF HEALTH WARNS: USING TOBACCO IS HARMFUL TO YOUR HEALTH.
+
+ I do not condone snuff taking or any other nicotine use. Snuff is a tobacco based product and contains nicotine which is known to be highly addictive. The content on this page is purley informational.
+
+
+
+ Hey I first should maybe explain what nasal snuff is for the people who don't know, so
+
+
+
What's nasal snuff?
+
+ Snuff is a type of smokeless tobacco product made from finely ground or pulverized tobacco leaves. It is sniffed (also sometimes written as "snuffed".) into the nasal cavity, delivering nicotine and a flavored scent to the user.
+
+ Snuff is also healthier than normal smoking. BTW Healthier does not equal healthy!
+ Snuff is still a tobacco products and still carriers risks with it.
+
+
+
How did my journey with snuff start?
+
+ It started from pure curiosity, and from me being too poor to afford cigarettes. I saw a box of Gletscher Prise and decided to get it.
+ And holy fuck was I blown away by how good it was. The first time felt like breathing in 8K or something like that.
+
+
+
Why do I take snuff?
+
+ Mostly for the flavours it offers. Also, I just love the snuff culture I personally find it a lot more respectful and interesting then cigarette smoking.
+ Also, sometimes when I don't smoke for some reason, I like to use it to get that nicotine hit.
+
+
+
What's so interesting about snuff?
+
+ Snuff is weirdly fascinating because there are so many types fine, coarse, dry, menthol nukes, floral perfumes,
+ and blends that smell like someone emptied a spice cabinet. Half the fun is just figuring out what strange scent
+ you’ve opened this time and wondering who thought it was a good idea.
+
+ Hi and welcome to my projects page! For now I only have one project, but I am planning on making more of them. You can read about my only project bellow :D
+
+
+
= IRC to Discord Bridge =
+
+ A simple and modern IRC ↔ Discord userbot bridge written in Node.js, used to bridge Discord channels and group chats with IRC rooms.
+
+
(Also worth explaining: a userbot sometimes called a selfbot is a bot that runs on a user account.)
Multi-Bridge Support — bridge multiple channels and rooms with one config.
+
Reactions Bridging — sends a message when a message is reacted to.
+
Attachments Bridging — automatically forwards images and files to IRC.
+
TLS/Non-TLS IRC Support — works with both secure and standard IRC ports.
+
Group Chat Bridges — supports Discord group chats via selfbot.
+
YAML Configuration — simple and human readable config file.
+
+
+
Why a Userbot Bridge?
+
I wanted to stop using Discord, but still chat in a group chat — no other bridge supported that, so I decided to build my own.
+ It started as a small private project, but after making it stable enough and usefull enough for more people, I open sourced it for anyone who needs something similar. (Which I guess it's not a lot of people :P)
=== IRC to Discord bridge (With userbot support.) ===
- A simple, and modern IRC to Discord userbot bridge written in Node JS used to bridge Disocrd channels and Discord groupchats.
-
- (Also worth to explain: A userbot (Or selfbot as I sometimes refer to it.) is a bot running on a user account.)
-
- Source code, and instructions how to run it.
-
Features:
-
-
Multi-Bridge Support - You can bridge multiple channels with multiple IRC rooms all with one config.
-
Reactions Bridging - Sends a message when a message was reacted to.
-
Attachments Bridging - Automatically forwards links to images and attachments from Discord messages to IRC.
-
TLS/Non-TLS IRC Support - Works with both secure (TLS) and standard IRC ports.
-
Group chat bridges - Since this all works with a selfbot it means that you can bridge a Discord group chat to a IRC room.
-
YAML Configuration - Simple and a human readable config.
-
-
Using a userbot for a bridge why?
-
- The why is actually pretty simple I wanted to stop using discord but I still wanted to chat in a discord group chat, but no other bridge supported bridging groupchats so I decided to "vibecode" my own bridge. I also added support for channels since I wanted to host some channels too and that's how this bridge came to life.
-
- At first it was not even meant to be open source, but after I made it decent enough I decided to open source it since I am guessing other people might need a bridge like this too!
-
-
Some project info:
- This project is licensed under the Apache 2.0 License.
-
- This project is written in Node.js
-
- This project is only pretty much done by me and I am terrible at JS so updates will be quite slow.
-
- This bridge can use a userbot on the Discord side. Userbots are againsts Discord ToS. No one has been banned yet for using it but it is a posibilty.
-
-
Here are some public and semi-public stuff I run from my servers. I host my stuff from two servers. One named NL1 in the Netherlands and one named PL1 in Poland.
+ Some require trust to get an account, some are open, and others are on a case-by-case basis.
+
+
+
Mumble Server
+
A privacy-friendly VOIP. No accounts needed, low latency, works even on potato (Polish) connections.
+
+
Server: mumble.purplebored.pl
+
Port: 64738 (TLS)
+
Access: Public
+
Location:NL1
+
+
+
+
+
Soju IRC Bouncer
+
And pretty decent modern IRC bouncer. Only people I know quite a lot and who trust me, and I am them get an account.
- MINISTER ZDROWIA OSTRZEGA: UŻYWANIE TYTONIU SZKODZI ZDROWIU
- THE MINISTER OF HEALTH WARNS: USING TOBACCO IS HARMFUL TO YOUR HEALTH
-
-
-
- So I am going to start off explaining what nasal snuff even is. Well, snuff is a smokeless tobacco product made from finely ground tobacco leaves. It is snuffed (snorted) into the nasal cavity, delivering nicotine and a nice flavored scent.
- Snuff overall is also considered safer than smoking, BUT that does not mean snuff is healthy. Using snuff is still very harmful to your health and it's also 18+ in most countries.
-
-
-
List of Snuffs I tried (in order from the ones I tried first to last):
-
-
Gletscher Prise
-
Red Bull
-
Ozona R-type
-
Alpina
-
MED N.99
-
Köningsprise
-
41 White Elephant
-
GAWITH Original Snuff
-
Ozona President snuff
-
JBR Snuff black
-
Packard's Club snuff
-
Mc Chrystal Aztec
-
Mc Chrystal Sicilian Burst
-
Bernard F Original
-
Bernad's steife prise
-
Ozona O-type
-
-
How did I start taking snuff: Well it all started with me being too poor to afford tobacco to roll cigarettes. I saw a nice blue box on the shelf and asked about it. The clerk in the tobacco store explainded that it was snuff and how to take it etc etc. It was also cheap so I decided to give it a shot. Taking snuff for the first time was God damn amazing and after that I started getting more and more brands and watching content related to snuff and learning more about it. Now after taking snuff for a few months I really love it and I am even tempted to fully quit smoking and replace it with snuff. Nasal Snuff is far from a healthy alternative BUT it is better then regular smoking. It's also a lot cheaper.
-
- I also started to review some of the snuffs I tried so here is a list of the ones already reviewed and the ones I will review in the near future.
- Snuff reviews:
- Well I probably going to start off by saying I really like tobacco products and especially snuff. I like snuff enough that I started writing snuff reviews lol. I also using old and obscure stuff just for fun when really bored.
-
- I also quite like learning new languages currently learning Russian since I really like Russian music it's very fire.
-
- Well I also like fishing I am still not very good at it and started recently but I am slowly learning !!
-
- I also like mechanical watches and watches in general I currently daily drive a Russian Vostok amphibia and I am very happy with it. But I also own and sometimes wear a Casio F-91W.
-
+ purplebored.pl is a personal project providing services to close friends and certain individuals.
+ By using purplebored.pl and it's services you agree to abide to those Terms of Service.
+
+ Last update: 29.11.2025
+
+
+
User Eligibility:
+
+ You are older than 16 years old (or the age of digital consent in your country of residence, if higher).
+ If you are under that age please do not use anything purplebored.pl provides, and do not ask for any accounts.
+
+
+
Community Standards
+
+
Abide by Polish and Dutch law.
+
Do not harras, stalk, or abuse anyone.
+
Distribute hate speech, extremist content, or call to violence
+
Send spam
+
Attempt to disrupt, attack, or intentionally overload the services
+
Distribute malware or attempt unauthorized access to systems
+
Possess, store, share, request, promote, or justify CSAM or child sexual exploitation in any form.
+
+ Violation of these terms may lead to account deletion.
+
+
User Responsibility
+
+ You and only you are responsible for keeping your login details confidential and must choose passwords that meet the highest security standards as allowed by the services and things I provide. I will never ask you to give me your password. Never give your passwords to anyone claiming to be me or someone from purplebored.pl.
+
+
+ By registering an account, you agree to take full responsibility for all the activities under your username and password.
+ You must immediately notify me using the contact details provided in this document if you believe that your account or login details may have been compromised, hacked, or stolen.
+
+
+
Service availability and disclaimer
+
+ This is a personal, hobby-run service. I do not guarantee good uptime, data retention, message delivery, or security. Use everything I provide at your own risk.
+
+
+
Account Termination
+
+ You can request deletion of your account at any time by contacting me with the relevant details.
+
+ Citing from their website: "Yggdrasil is a new experimental compact routing scheme. It is designed to be a
+ future-proof and decentralised alternative to the structured routing protocols commonly used today on the
+ Internet, as well as an enabling technology for future large-scale mesh networks"
+
+
+
Why use Yggdrasil?
+
+ Yggdrasil is a completely separate network from the “normal” internet. It works as a global, encrypted
+ mesh network where every device becomes part of a huge, interconnected system. It doesn’t rely on ISPs,
+ central servers, or big companies to function.
+
+
+
How to join Yggdrasil?
+
+ Check out the official installation page here.
+
+
+
What I run on Yggdrasil
+
+ I host an Yggdrasil mirror of my website.
+ If you’re on Ygg, you can reach ot using the link below:
+