Compare commits

...

10 commits

Author SHA1 Message Date
Korbs
3593d4c42e update 2024-12-03 23:06:11 -05:00
Korbs
54c5e38455 Update Privacy Policy 2024-12-03 23:05:58 -05:00
Korbs
aad9fa8804 Remove blog section, use new Pandora component 2024-12-03 23:05:50 -05:00
Korbs
f1cd50fe9d Update links, move theme button, fix mobile menu icon 2024-12-03 23:05:34 -05:00
Korbs
7f4edf307f Fix links, update date 2024-12-03 23:05:17 -05:00
Korbs
2037a41f81 Remove left-right padding for Headings 2024-12-03 23:05:06 -05:00
Korbs
6bff4150ec Remove old stuff 2024-12-03 23:04:54 -05:00
Korbs
c085380219 Add Pandora 2024-12-03 23:04:43 -05:00
Korbs
6cf8fde198 Clean up Astro config 2024-12-03 23:04:33 -05:00
Korbs
035e622fb8 Remove recommended reading page 2024-12-03 23:04:25 -05:00
32 changed files with 120 additions and 1061 deletions

View file

@ -1,9 +1,7 @@
import { defineConfig } from 'astro/config';
import markdoc from '@astrojs/markdoc';
import robotsTxt from 'astro-robots-txt';
import mdx from '@astrojs/mdx';
import vue from "@astrojs/vue";
import betterImageService from "astro-better-image-service";
import node from '@astrojs/node';
export default defineConfig({
@ -13,69 +11,16 @@ export default defineConfig({
'/docs/': '/docs/zorn/introduction/',
'/docs/minpluto': '/docs/zorn/introduction/'
},
integrations: [markdoc(), mdx(),
betterImageService({
limitInputPixels: true
}),
(await import("@playform/compress")).default(),
robotsTxt({
policy: [{
userAgent: 'Googlebot',
disallow: '/'
}, {
userAgent: 'Bingbot',
disallow: '/'
}, {
userAgent: '404checker',
disallow: '/'
}, {
userAgent: 'MJ12Bot',
disallow: '/'
}, {
userAgent: 'AspiegelBot',
disallow: '/'
}, {
userAgent: 'PetalBot',
disallow: '/'
}, {
userAgent: 'AhrefsBot',
disallow: '/'
}, {
userAgent: 'SEMrushBot',
disallow: '/'
}, {
userAgent: 'DotBot',
disallow: '/'
}, {
userAgent: 'Slurp',
disallow: '/'
}, {
userAgent: 'DuckDuckBot',
disallow: '/'
}, {
userAgent: 'YandexBot',
disallow: '/'
}, {
userAgent: 'MauiBot',
disallow: '/'
}, {
userAgent: 'baiduspider',
disallow: '/'
}, {
userAgent: 'adidxbot',
disallow: '/'
}, {
userAgent: 'microsoftbot',
disallow: '/'
}, {
userAgent: 'OtherBot',
disallow: '/'
}]
}), vue()],
integrations: [
mdx(),
vue(),
robotsTxt({policy: [{userAgent: 'Googlebot',disallow: '/'}, {userAgent: 'Bingbot',disallow: '/'}, {userAgent: '404checker',disallow: '/'}, {userAgent: 'MJ12Bot',disallow: '/'}, {userAgent: 'AspiegelBot',disallow: '/'}, {userAgent: 'PetalBot',disallow: '/'}, {userAgent: 'AhrefsBot',disallow: '/'}, {userAgent: 'SEMrushBot',disallow: '/'}, {userAgent: 'DotBot',disallow: '/'}, {userAgent: 'Slurp',disallow: '/'}, {userAgent: 'DuckDuckBot',disallow: '/'}, {userAgent: 'YandexBot',disallow: '/'}, {userAgent: 'MauiBot',disallow: '/'}, {userAgent: 'baiduspider',disallow: '/'}, {userAgent: 'adidxbot',disallow: '/'}, {userAgent: 'microsoftbot',disallow: '/'}, {userAgent: 'OtherBot',disallow: '/'}]})
],
output: 'server',
adapter: node({
mode: 'standalone',
}), server: {
}),
server: {
port: 5522,
host: true
},

BIN
bun.lockb

Binary file not shown.

View file

@ -20,6 +20,7 @@
"@meilisearch/instant-meilisearch": "^0.22.0",
"@playform/compress": "^0.1.6",
"@sudovanilla/errors": "^3.0.0",
"@sudovanilla/pandora": "^1.7.0",
"@tryghost/content-api": "^1.11.21",
"astro": "^4.16.14",
"astro-better-image-service": "^2.0.37",

View file

@ -1,197 +0,0 @@
---
// Properties
const {
Title,
Description,
Image,
ImageAlt,
ImageProperties,
CTA_Primary,
CTA_Primary_Link,
CTA_Secondary,
CTA_Secondary_Link,
Label,
LabelVarient,
Custom,
CreditImage
} = Astro.props;
// Icons
import { InfoCircle } from "@iconoir/vue";
---
<div class="large-card">
<div class="lc-start">
<h2 id={Title}>{Title}</h2>
<p>{Description}</p>
<div class="lc-cta">
{
CTA_Secondary ? (
<a id="cta-secondary" href={CTA_Secondary_Link}>
{CTA_Secondary}
</a>
) : null
}
{
CTA_Primary ? (
<a id="cta-primary" href={CTA_Primary_Link}>
{CTA_Primary}
</a>
) : null
}
{
Label ? (
<a class:list={'label-varient-' + LabelVarient} style="pointer-events: none;" href="#">{Label}</a>
) : null
}
</div>
</div>
<div class="lc-end">
{Custom ? <slot/> : <img loading="lazy" src={Image} alt={ImageAlt} style={ImageProperties} />}
{CreditImage ? <InfoCircle title={CreditImage} id="video-credit-js" width={16} height={16} /> : null}
</div>
</div>
<style lang="scss">
.large-card {
display: flex;
align-items: center;
flex-direction: row-reverse;
justify-content: space-between;
gap: 48px;
margin: 24px 0px 140px 0px;
@media screen and (max-width: 800px) {
flex-direction: column-reverse;
}
&:nth-child(3) {
flex-direction: row;
@media screen and (max-width: 800px) {
flex-direction: column-reverse;
}
img {
box-shadow: 10px 10px 0px 0px #13151a;
transition: 1s box-shadow;
&:hover {
box-shadow: 20px 20px 0px 0px #13151a;
transition: 1s box-shadow;
}
}
}
&:nth-child(5) {
flex-direction: row;
@media screen and (max-width: 800px) {
flex-direction: column-reverse;
}
img {
box-shadow: 10px 10px 0px 0px #13151a;
transition: 1s box-shadow;
&:hover {
box-shadow: 20px 20px 0px 0px #13151a;
transition: 1s box-shadow;
}
}
}
&:nth-child(7) {
flex-direction: row;
@media screen and (max-width: 800px) {
flex-direction: column-reverse;
}
img {
box-shadow: 10px 10px 0px 0px #13151a;
transition: 1s box-shadow;
&:hover {
box-shadow: 20px 20px 0px 0px #13151a;
transition: 1s box-shadow;
}
}
}
&:nth-child(9) {
flex-direction: row;
@media screen and (max-width: 800px) {
flex-direction: column-reverse;
}
img {
box-shadow: 10px 10px 0px 0px #13151a;
transition: 1s box-shadow;
&:hover {
box-shadow: 20px 20px 0px 0px #13151a;
transition: 1s box-shadow;
}
}
}
&:nth-child(11) {
flex-direction: row;
@media screen and (max-width: 800px) {
flex-direction: column-reverse;
}
img {
box-shadow: 10px 10px 0px 0px #13151a;
transition: 1s box-shadow;
&:hover {
box-shadow: 20px 20px 0px 0px #13151a;
transition: 1s box-shadow;
}
}
}
.lc-start {
min-width: 50%;
max-width: 50%;
@media screen and (max-width: 800px) {
min-width: inherit;
max-width: inherit;
width: 100%;
}
#Zorn {
font-family: MajorMonoDisplay;
}
a {
background: transparent;
border: 1px white solid;
padding: 8px 16px;
border-radius: 3rem;
display: inline-block;
margin: 12px 2px 36px 2px;
transition:
0.3s background,
0.6s color;
&:hover {
background: white;
color: black;
transition:
0.3s background,
0.6s color;
}
}
.label-varient-Warning {
border-color: rgb(247, 247, 149) !important;
background: rgb(247, 247, 149) !important;
color: black !important;
}
.label-varient-New {
border-color: rgb(94, 255, 94) !important;
background: rgb(94, 255, 94) !important;
color: black !important;
}
}
.lc-end {
position: relative;
#video-credit-js {
position: absolute;
bottom: 0px;
right: 0px;
margin: 24px;
padding: 12px;
}
}
img {
border-radius: 10px;
width: 100%;
box-shadow: -10px 10px 0px 0px #13151a;
transition: 1s box-shadow;
&:hover {
box-shadow: -20px 20px 0px 0px #13151a;
transition: 1s box-shadow;
}
}
}
</style>

View file

@ -1,41 +0,0 @@
---
const {Equal} = Astro.props
---
<div class="card-grid">
<slot/>
</div>
{Equal ?
<style lang="scss">
.card-grid {
display:flex;
gap: 24px;
margin-bottom: 12px;
justify-content: flex-start;
flex-direction: row;
}
.card-grid > .large-card {
width: 50%;
}
@media only screen and (max-width: 700px) {
.card-grid {
grid-template-columns: 100%;
}
}
</style>
:
<style lang="scss">
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit,minmax(200px,1fr));
grid-gap: 25px;
margin-top: 50px;
}
@media only screen and (max-width: 700px) {
.card-grid {
flex-wrap: wrap;
}
}
</style>
}

View file

@ -14,7 +14,7 @@ const { Title, Description } = Astro.props;
<style lang="scss">
.heading {
padding: 42px 16px;
padding: 42px 0px;
display: flex;
align-items: center;
gap: 16px;

View file

@ -1,41 +0,0 @@
**Privacy Guides**
Check out privacy alternatives to software, apps, and other tools you use. Privacy Guides also providies a decent knowledge base on privacy eassentials on enhancing your privacy in life and provides a great run-down on threat modeling.
https://www.privacyguides.org/
<br/>
<br/>
**Privacy Respecting**
A list of free services as alternatives to software, apps, and other tools you use.
https://github.com/nikitavoloboev/privacy-respecting?tab=readme-ov-file#what
<br/>
<br/>
**Offshore.CAT**
Offshore.CAT is a compiled list of the real & genuine, along with the bad & garbage offshore services that we have either used/have had experience with in the past.
https://offshore.cat/
<br/>
<br/>
**AlterativeTo**
A large database of alternatives to software, apps, and other tools you use. Make sure to use the "Filter" function of AlternativeTo to only use open source and privacy focused alternatives.
https://alternativeto.net/
<br/>
<br/>
<style>
a {
text-decoration: underline
}
</style>

View file

@ -1,201 +0,0 @@
---
const { Selected, Project, Search } = Astro.props
import {ArrowDownCircle} from "@iconoir/vue"
---
<div class="mobile-docs-dropdown">
<span onclick="ToggleMDD()">{Project} <ArrowDownCircle/></span>
<div class="mdd-expandable">
<slot/>
</div>
</div>
<div class="sidebar">
<div class="sb-docs">
<slot/>
</div>
</div>
<script is:inline>
/*
@licstart The following is the entire license notice for the
JavaScript code in this page.
Copyright (C) 2024 SudoVanilla
The JavaScript code in this page is free software: you can
redistribute it and/or modify it under the terms of the GNU
General Public License (GNU GPL) as published by the Free Software
Foundation, either version 3 of the License, or (at your option)
any later version. The code is distributed WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
As additional permission under GNU GPL version 3 section 7, you
may distribute non-source (e.g., minimized or compacted) forms of
that code without the copy of the GNU GPL normally required by
section 4, provided you include this license notice and a URL
through which recipients can access the Corresponding Source.
@licend The above is the entire license notice
for the JavaScript code in this page.
*/
function ToggleMDD() {
var MobileDocsDropdown = document.querySelector(".mdd-expandable");
if (MobileDocsDropdown.style.display === "flex") {
MobileDocsDropdown.style.display = "none";
document.querySelector('.mobile-docs-dropdown span').style.padding = "6px 0px";
document.querySelector('.mobile-docs-dropdown span svg').style.transform = "rotate(0deg)";
} else {
MobileDocsDropdown.style.display = "flex";
document.querySelector('.mobile-docs-dropdown span').style.padding = "24px 0px";
document.querySelector('.mobile-docs-dropdown span svg').style.transform = "rotate(180deg)";
}
}
</script>
<style lang="scss">
.mobile-docs-dropdown {
backdrop-filter: blur(24px) brightness(0.6);
border-radius: 6px;
border: 1px #2b2b2b solid;
padding: 6px 14px;
width: calc(100% - 32px);
display: none;
span {
display: flex;
justify-content: space-between;
align-items: center;
transition: 0.3s padding;
svg {
transition: 0.3s transform;
}
}
.mdd-expandable {
display: none;
flex-direction: column;
gap: 0px;
h2 {
font-size: 16px;
}
a {
display: flex;
align-items: center;
gap: 12px;
font-size: 18px;
}
}
}
</style>
<style lang="scss" is:global>
.sidebar {
max-width: 224px;
width: 100%;
.key {
display: flex;
align-items: center;
font-size: 12px;
background: #594646;
border-radius: 4px;
padding: 0px 6px;
height: 24px;
gap: 2px;
p {color: white !important;}
svg {
width: 10px;
color: white;
}
}
.sidebar-global-search {
margin-bottom: 6px;
width: 100%;
background: #282323;
border: 1px var(--border-color) solid;
border-radius: 6px;
display: flex;
justify-content: space-between;
align-items: center;
padding: 6px 6px 6px 12px;
cursor: pointer;
&:hover {
border-color: var(--border-color-hover);
}
svg {
color: white;
}
p {
margin: 0px;
color: gray;
}
}
.sb-project {
display: flex;
flex-direction: column;
gap: 6px;
.project-selected {
background: rgb(19, 18, 18);
border: 1px var(--border-color) solid;
}
a {
display: flex;
border-radius: 6px;
align-items: center;
padding: 6px 12px;
font-size: 14px;
justify-content: space-between;
border: 1px transparent solid;
&:hover {
border-color: var(--border-color-hover);
}
p {
margin: 0px;
}
img {
border-radius: 4px;
width: 24px;
height: 24px;
object-fit: cover;
}
.sb-doc-amount {
opacity: 0.5;
font-size: 12px;
}
}
}
.sb-docs {
display: flex;
flex-direction: column;
gap: 6px;
.doc-selected {
background: rgb(19, 18, 18);
border: 1px var(--border-color) solid;
}
h2 {
font-size: 12px;
padding-left: 12px;
}
a {
display: flex;
border-radius: 6px;
align-items: center;
padding: 6px 12px;
font-size: 14px;
gap: 6px;
border: 1px transparent solid;
&:hover {
border-color: var(--border-color-hover);
}
svg {
width: 16px;
height: 16px;
}
p {
font-size: 14px;
margin: 0px;
}
}
}
}
</style>

View file

@ -4,10 +4,10 @@ import { Copyright } from "@iconoir/vue";
<div class="footer">
<div>
<a href="#">Privacy Policy</a>
<a href="#">Refund Policy</a>
<a href="/privacy-policy/">Privacy Policy</a>
<a href="/refund-policy/">Refund Policy</a>
</div>
<p><Copyright/> 2014 - 2024 SudoVanilla</p>
<p><Copyright/> 2014 - 2025 SudoVanilla</p>
</div>
<style lang="scss" is:global>

View file

@ -18,15 +18,20 @@ SunLight
<a class="header-link-item" href="/blog/">Blog</a>
<a class="header-link-item" href="https://ark.sudovanilla.org/">Ark</a>
<a class="header-link-item" href="/instances/">Instances</a>
<a class="header-link-item" href="/docs/">Docs</a>
<a class="header-link-item special" href="/donate/">Donate</a>
<!-- <a class="header-link-item" href="/init/">Init Privacy</a> -->
<a class="header-link-item" href="/donate/">Donate</a>
<a class="header-link-item" href="https://status.sudovanilla.org/">Status</a>
</div>
<a href="/"><SudoVanilla OnlyLogo WithLogo /></a>
<p>{MobileTitle}</p>
<button onclick="ToggleMobileMenu()">
<MenuScale/>
</button>
<div style="display: flex; align-items: center;">
<button id="toggle-da-theme" data-color-mode-switch style="display: none;"></button>
<button onclick="document.querySelector('#toggle-da-theme').click()" data-color-mode-switch class="theme-toggle-button theme-is-light"><SunLight/></button>
<button onclick="document.querySelector('#toggle-da-theme').click()" data-color-mode-switch class="theme-toggle-button theme-is-dark"><HalfMoon/></button>
<button style="color: white;" onclick="ToggleMobileMenu()">
<MenuScale/>
</button>
</div>
</mobilebar>
<header>
@ -34,18 +39,16 @@ SunLight
<div class="header-row-top">
<div>
<a href="/"><SudoVanilla WithLogo /></a>
<button id="toggle-da-theme" data-color-mode-switch style="display: none;"></button>
<button onclick="document.querySelector('#toggle-da-theme').click()" data-color-mode-switch class="theme-toggle-button theme-is-light"><SunLight/></button>
<button onclick="document.querySelector('#toggle-da-theme').click()" data-color-mode-switch class="theme-toggle-button theme-is-dark"><HalfMoon/></button>
</div>
<div>
<a class="header-link-item" href="/blog/">Blog</a>
<a class="header-link-item" href="https://ark.sudovanilla.org/">Ark</a>
<a class="header-link-item" href="/instances/">Instances</a>
<a class="header-link-item" href="/docs/">Docs</a>
<!-- <a class="header-link-item" href="/init/">Init Privacy</a> -->
<a class="header-link-item" href="/donate/">Donate</a>
<a class="header-link-item" href="https://status.sudovanilla.org/">Status</a>
<a class="header-link-item special" href="/donate/">Donate</a>
<button id="toggle-da-theme" data-color-mode-switch style="display: none;"></button>
<button onclick="document.querySelector('#toggle-da-theme').click()" data-color-mode-switch class="theme-toggle-button theme-is-light"><SunLight/></button>
<button onclick="document.querySelector('#toggle-da-theme').click()" data-color-mode-switch class="theme-toggle-button theme-is-dark"><HalfMoon/></button>
</div>
</div>
{
@ -243,6 +246,7 @@ mobilebar {
div:nth-child(1) {
display: flex;
gap: 12px;
align-items: center;
}
div:nth-child(2) {
display: flex;

View file

@ -1,33 +0,0 @@
---
title: FAQ
---
Q: Is this official software?
A: No, Penpot Desktop is an Electron-based application developed by SudoVanilla. If the project was official, it would be sitting on Penpots GitHub, not SudoVanilla Code.
Q: Does Penpot Desktop support offline use? If so, how do I use it offline?
A: Penpot Desktop does support offline usage, you can do this by hosting Penpot on your own machine or in a local server within your home. To learn how to host Penpot yourself, please view their [official guide](https://penpot.app/self-host). Try installing with Docker or your preferrable method.
To switch Penpot Desktop to your self-hosted Penpot, click on the “Gear” icon in the upper right corner, then your Instance options, please put in where your self-hosted Penpot is. You should be able to use a local IP address, as long as you on are on the same network, an example looks like “[http://192.168.1.2:9001/](http://192.168.1.2:9001/)“. If you used your own machine, where youll also be using Penpot Desktop, then using “[http://localhost:9001](http://localhost:9001)” should work, even without internet enabled.
Q: Theres an issue with the app, where do I get help?
A: Please view the [support section](https://sudovanilla.com/code/Korbs/Penpot-Desktop/src/branch/main#support) of the README file. Email support is recommended for a faster response.
Q: What operating system does this support?
A: View [System Requirements](https://sudovanilla.com/docs/penpot-desktop/faq/docs/penpot-desktop/install/requirements/).\
Q: If an update is available, how do I get it?
A: This is done automatically on Windows and Linux, with auto update builtin from Electron Builder. We recommend that you wait at the least 1 - 2 minutes for the update to download, or depending on your internet. This usually take about 10 - 30 seconds for decent internet(200mbps).
On macOS, however, each update must be installed manually by the user themself. No, you are not required to do this on a regular basis; nevertheless, updating Penpot Desktop is recommended if you want the most up-to-date version in general. Its difficult to support macOS for auto updating at the time being. **(In newer version from v0.2.3 and newer, auto update will be supported.)**

View file

@ -1,6 +0,0 @@
---
title: Instance
---
A server running Penpot, is called an “Instance”. Their can be many and you dont really need to choose one, commonly you only need to choose the offiical one that is ran by Penpot or to self-host your own.
As an example, “[https://design.penpot.app/](https://design.penpot.app/)” is an instance.

View file

@ -1,32 +0,0 @@
---
title: What is Penpot?
---
Penpot is the first open-source design & prototyping tool for product teams, that allows full collaboration between designers and developers thanks to features such as Flex Layout and Code Inspect.
**Professional UI for the whole team**
Design systems, components, interactive prototypes, feedback loop and pixel perfect designs come together in an extremely intuitive and powerful web user interface that opens up the design process to all stakeholders.
**Designer & Developer collaboration for real**
Penpot brings both code-ready design capabilities and the familiarity of developer tools to a new workspace flow.
**Open Standards that deliver future-proof ownership of your designs**
Penpot supports unconditionally open standards for all your design work. Our SVG and web standards approach means zero vendor lock-in and extreme interoperability. Penpot delivers Freedom to Product teams.
**Penpot is free**
Both Cloud and self-host services are free. Penpot projects can be moved around easily across all Penpot deployment flavors so youre free to change your mind at any time!
> SudoVanilla or this website is not associated with Penpot or Kaleidos.
## What is Penpot Desktop?
Penpot Desktop delivers a desktop-like experience for Penpot users with the additional of integrating tabs to conveniently traverse back and forth between projects. Offline support is available through the select your own instance option in settings, as well as the theme settings that may be applied to either the entire desktop app or simply the Penpot dashboard.
**Offline Use**
One of the major features of Penpot Desktop, is that it can be used [offline](https://sudovanilla.com/help/penpot-desktop/features/offline-use/) if you selfhost Penpot on your own machine. You could also connect Penpot Desktop to our own Penpot instance running on your own server. This is thanks to Penpot allowing you to use technology such as Docker to selfhost your own instance.
**Open Source** Proudly built with open source technology and libraries. Thanks to Electron, its cross-platform allowing it to work on operating systems such as Windows, macOS, and Linux. Anyone willing to help with Penpot Desktop are welcomed to contribute to its source code on SudoVanilla Code.

View file

@ -1,96 +0,0 @@
---
title: Offline Use
---
> This article can be too techincal for some users. If it is for you, ask a friend who is familiar with techincal stuff. SudoVanilla is also willing to help you live in a call via Matrix or Jitsi Meet, [email to schedule a call](mailto:support@sudovanilla.com?subject=Schedule%20a%20Call\&body=I'll%20like%20to%20schedule%20a%20call%20at%20INSERT_TIME_AND_DATE_HERE.).
Penpot allows users, developers, and companies to selfhost Penpot on-premise or in the cloud on their servers. Thanks to this, it is possible selfhost Penpot directly on your daily driver and make Penpot Desktop work offline.
## Install Docker
> Skip this section if you already have docker installed, up and running.
Currently, Docker comes into two different flavours:
### Docker Desktop
This is the only option to have Docker in a Windows or MacOS. Recently its also available for Linux, in the most popular distributions (Debian, Ubuntu and Fedora).
You can install it following the official guide.
Docker Desktop has a graphical control panel (GUI) to manage the service and view the containers, images and volumes. But need the command line (Terminal in Linux and Mac, or PowerShell in Windows) to build and run the containers, and execute other operations.
It already includes docker compose utility, needed by Penpot.
### Docker Engine
This is the classic and default Docker setup for Linux machines, and the only option for a Linux VPS without graphical interface.
You can install it following the official guide.
And you also need the docker compose (V2) plugin. You can use the old docker-compose tool, but all the documentation supposes you are using the V2.
You can easily check which version of docker compose you have. If you can execute docker compose command, then you have V2. If you need to write docker-compose (with a -) for it to work, you have the old version.
## Start Penpot
After making sure that Docker is running on your machine, lets go ahead and start Penpot with it.
First step is to obtain the `docker-compose.yml` file, you can download this from the Penpot repo using the following command in your terminal:
Terminal window
```
curl -o docker-compose.yaml https://raw.githubusercontent.com/penpot/penpot/main/docker/images/docker-compose.yaml
```
Afterwards, you can simply launch Penpot by using the composer command:
Terminal window
```
docker compose -p penpot -f docker-compose.yaml up -d
```
Wait a moment, then the server should be up and running on [http://localhost:9001](http://localhost:9001).
### Set Penpot Desktop to your Local Instance
Once youve confirmed that Penpot is now running on [http://localhost:9001](http://localhost:9001), go ahead and set this link inside of Penpot Desktop so that the app uses your local instance.
Click on the gear icon found in the upper-right corner of Penpot Desktop, then for instance please set “[http://localhost:9001](http://localhost:9001)”, and click the save button.
Now, reload or restart Penpot Desktop to start using Penpot Desktop offline.
### Creating an Account
Youll need to setup an account in your own instance, since its hosted on your machine, you have full control.
Create an account by clicking “Create Account” link on the login page and it should be straight-forward from there.
If you have having issues with that, you can try doing it through the command line instead:
Terminal window
```
docker exec -ti penpot-penpot-backend-1 python3 ./manage.py create-profile
```
## Updating Penpot
Whenever an update is release, you can update your local Penpot instance by running:
Terminal window
```
docker compose -f docker-compose.yaml pull
```
## Backup Penpot
Penpot uses Docker volumes to store all persistent data. This allows you to delete and recreate containers whenever you want without losing information.
This also means you need to do regular backups of the contents of the volumes. You cannot directly copy the contents of the volume data folder. Docker provides you a volume backup procedure, that uses a temporary container to mount one or more volumes, and copy their data to an archive file stored outside of the container.
If you use Docker Desktop, [there is an extension](https://www.docker.com/blog/back-up-and-share-docker-volumes-with-this-extension/) that may ease the backup process.
If you use the default docker compose file, there are two volumes used: one for the Postgres database and another one for the assets uploaded by your users (images and svg clips). There may be more volumes if you enable other features, as explained in the file itself.

View file

@ -1,4 +0,0 @@
---
title: progress
---
This part of the documentation is still being worked on, come back later.&#x20;

View file

@ -1,18 +0,0 @@
---
title: Introduction
---
**Zorn is currently in beta stages. Not everything listed below, as in its feature set, is not not done or hasnt been worked on yet.**
## Introduction
Zorn is a customizable HTML5 video player. The player is originally built for a SudoVanilla project called MinPluto, a privacy frontend for YouTube.
### What is a HTML5 Video Player?
HTML5 introduced the video player element in the late 2010s, which is embeded as `<video>`. It was intended by the creators of it to be the new standard to show video content on the web, instead of Adobe Flash which reached end-of-life in 2020. So, as of 2020, the HTML5 video is the only widely supported video playerback technology for modern browsers, with the Flash plugin being phased out.
You can see this in your browser as the built-in video player by [viewing this video](https://sudovanilla.com/content/videos/webm/Ennie-and-Yoyki.webm) or viewing in its own tab.
### Why not use the built-in player?
While you can build website or a video platform and having your visitors rely on their web browsers built-in video player, it can be quite limited if you want or your visitors want certain features. Features such as quality selector, subtitles, seek, and more. The built-in player does not, usually, include those. Another reason is why a company or a project may want to use a custom player such as Zorn is to have a curated player for their website that fits the style and needs.

View file

@ -1,7 +0,0 @@
---
title: GitHubbub! GitHub Does Not Value Software Freedom.
author: Mike Gerwitz
date: 0001-01-01
url: https://mikegerwitz.com/about/githubbub/
image: https://md.sudovanilla.org/images/githubno.png
---

View file

@ -1,8 +0,0 @@
---
title: 'ISPs are selling your private browsing history. Heres how to prevent it. '
author: Proton Team
date: 2017-03-24
url: https://proton.me/blog/private-browsing-history
image: >-
https://image.proxy.sudovanilla.org/https://res.cloudinary.com/dbulfrlrz/images/w_1434,h_717,c_scale/f_auto,q_auto/f_auto,q_auto/v1707577896/wp-pme/browsing_history_privacy/browsing_history_privacy
---

View file

@ -1,7 +0,0 @@
---
title: Is TikTok Safe?
author: Douglas Crawfold
date: 2024-04-03
url: https://protonvpn.com/blog/is-tiktok-safe/
image: https://md.sudovanilla.org/images/is-tiktok-safe-blog.png
---

View file

@ -1,7 +0,0 @@
---
title: Google ads are getting worse, at your expense
author: Ben Wolford
date: 0001-01-01
url: https://proton.me/blog/google-shows-more-ads
image: https://md.sudovanilla.org/images/new-ads-in-gmail-inbox_3542274c2d.webp
---

View file

@ -1,7 +0,0 @@
---
title: Stop using Brave Browser
author: Corbin Davenport
date: 2023-08-07
url: https://www.spacebar.news/stop-using-brave-browser/
image: https://md.sudovanilla.org/images/braveno.jpg
---

View file

@ -1,7 +0,0 @@
---
title: Stop using Opera Browser and Opera GX
author: Corbin Davenport
date: 2023-01-24
url: https://www.spacebar.news/stop-using-opera-browser/
image: https://md.sudovanilla.org/images/operano.jpg
---

View file

@ -1,8 +0,0 @@
---
title: 'Vivaldi presents: “Browser choices. A tale of two Gatekeepers.”'
author: Jon Von Tetzchner
date: 2024-02-14
url: >-
https://vivaldi.com/blog/technology/vivaldi-browser-choices-a-tale-of-two-gatekeepers/
image: https://md.sudovanilla.org/images/browser-choices.png
---

View file

@ -1,7 +0,0 @@
---
title: What is Free Software?
author: GNU
date: 0001-01-01
url: https://www.gnu.org/philosophy/free-sw.en.html
image: https://md.sudovanilla.org/images/Screenshot_20240426_135536.png
---

View file

@ -1,7 +0,0 @@
---
title: Why Privacy Matters
author: Jonah Aragon and Daniel Nathan Gray
date: 2023-05-01
url: https://www.privacyguides.org/en/basics/why-privacy-matters
image: https://md.sudovanilla.org/images/why-privacy-matters.png
---

View file

@ -1,64 +0,0 @@
---
// Layout Properties
const {
ProjectCollection
} = Astro.props
// Layout
import Default from "@layouts/Default.astro";
// Icons
import {
WarningTriangleSolid
} from "@iconoir/vue"
---
<Default MobileTitle="SudoVanilla Documentation">
<Fragment slot="sub-header">
<div>
<p class="header-sub-service"><span id="show-w-scroll">SudoVanilla</span> Documentations</p>
</div>
<div>
<a href="https://minpluto.docs.sudovanilla.org">MinPluto</a>
<a href="/docs/zorn/introduction/">Zorn Player</a>
<a href="/docs/penpot-desktop/introduction/">Penpot Desktop</a>
</div>
</Fragment>
<Fragment slot="body">
<div class="page-banner">
<p><WarningTriangleSolid/> Documentation part of sudovanilla.org is being moved. Each project is being moved to it's own subdomain.</p>
<p>Already moved: MinPluto</p>
</div>
<div class="document-layout">
<div class="doc-content">
<slot slot="content"/>
</div>
</div>
</Fragment>
</Default>
<style is:global>
.document-layout {
display: flex;
gap: 24px;
a {
text-decoration: underline;
}
}
.page-banner {
background: #ffff9e;
color: black;
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 24px;
border-radius: 6px;
* {
margin: 0px;
display: flex;
align-items: center;
}
svg {
margin-right: 12px;
}
}
</style>

View file

@ -4,20 +4,14 @@ import Default from "@layouts/Default.astro";
// Components
import Posts from "@components/blog/posts.astro";
// List Posts
const GhostFetch = 'https://blog.ghost.sudovanilla.org/ghost/api/content/posts/?key=bef2ed15d9e38f7703be9412b3'
const GhostResponse = await fetch(GhostFetch);
const Ghost = await GhostResponse.json();
// Icons
import { BookmarkBook, ReportColumns } from "@iconoir/vue";
import Heading from "@components/Heading.astro";
---
<Default MobileTitle="SudoVanilla" NoSubHeader>
<Fragment slot="body">
<Posts server:defer><div slot="fallback">Loading posts...</div></Posts>
</Fragment>
<Default MobileTitle="Recommended Reading" NoSubHeader>
<Fragment slot="body">
<Heading Title="Posts"/>
<Posts server:defer><div slot="fallback">Loading posts...</div></Posts>
</Fragment>
</Default>
<style lang="scss">

View file

@ -1,33 +0,0 @@
---
// Layout
import Default from "@layouts/Default.astro";
// Components
import Posts from "@components/blog/posts.astro";
import Heading from "@components/Heading.astro";
// Markdown
import Sources from "@components/blog/sources.md"
// List Posts
import { getCollection } from "astro:content";
const posts = await getCollection("recommend-reading");
---
<Default MobileTitle="Recommended Reading">
<Fragment slot="sub-header">
<p class="header-sub-service"><span id="show-w-scroll">SudoVanilla</span> Blog</p>
<div>
<a href="/blog/">Posts</a>
<a href="/blog/recommended-reading/">Recommended Reading</a>
</div>
</Fragment>
<Fragment slot="body">
<Heading Title="Posts"/>
<Posts GetPosts={posts} PrefixSlug=""/>
<p style="opacity: 0.5; font-size: 14px;">All links above goes to external sources, outside of SudoVanilla.</p>
<p style="opacity: 0.5; font-size: 14px;">Some links may be set incorrectly. Check the URL and make sure it doesn't end in "/" or double "//".</p>
<Heading Title="Looking for Alternatives?"/>
<Sources/>
</Fragment>
</Default>

View file

@ -1,91 +0,0 @@
---
// Icons
import {ServerConnection,PeaceHand, SlashSquare, ClipboardCheck} from "@iconoir/vue";
import {ServerConnection,PeaceHand, QuestionMark, WifiOff, DownloadCircle, ShieldAlert, ChatBubble} from "@iconoir/vue";
// Get Colletion and Slug
import { getCollection, getEntry } from "astro:content";
import Document from "@layouts/Document.astro"
const { slug } = Astro.params;
if (!slug) throw new Error("Slug not found");
const post = await getEntry("docs", slug);
if (!post) throw new Error("No post found for this slug");
const { Content } = await post.render();
/// Generate static pages
export async function getStaticPaths() {
const posts = await getCollection("docs");
return posts.map((post) => ({ params: { slug: post.slug } }));
}
export const prerender = true;
// Components
import Sidebar from "@components/docs/sidebar.astro";
---
<Document>
<div class="document-layout">
<Sidebar>
<h2>Zorn</h2>
<a href="/docs/zorn/introduction/">
<PeaceHand/>
<p>Introduction </p>
</a>
<h2>MinPluto</h2>
<a href="/docs/minpluto/introduction/">
<PeaceHand/>
<p>Introduction </p>
</a>
<a href="/docs/minpluto/compatibility/">
<ClipboardCheck />
<p>Compatibility</p>
</a>
<a href="/docs/minpluto/requirements/">
<ClipboardCheck />
<p>Requirements</p>
</a>
<a href="/docs/minpluto/self-hosting/">
<ServerConnection />
<p>Self-Hosting</p>
</a>
<a href="/docs/minpluto/api/">
<SlashSquare />
<p>API</p>
</a>
<h2>Penpot Desktop</h2>
<a href="/docs/penpot-desktop/introduction/">
<PeaceHand/>
<p>Introduction </p>
</a>
<a href="/docs/penpot-desktop/faq/">
<QuestionMark />
<p>FAQ</p>
</a>
<a href="/docs/penpot-desktop/offline-use/">
<WifiOff />
<p>Offline Use</p>
</a>
<a href="/docs/penpot-desktop/instance/">
<ServerConnection />
<p>Instance</p>
</a>
<a href="/docs/penpot-desktop/progress/">
<DownloadCircle />
<p>Installation</p>
</a>
<a href="/docs/penpot-desktop/progress/">
<ShieldAlert />
<p>Security Policy</p>
</a>
<a href="/docs/penpot-desktop/progress/">
<ChatBubble />
<p>Support</p>
</a>
</Sidebar>
<div class="doc-content">
<Content/>
</div>
</div>
</Document>

View file

@ -4,12 +4,7 @@ import Default from "@layouts/Default.astro";
// Components
import Hero from "@components/Hero.astro";
import Heading from "@components/Heading.astro";
import Posts from "@components/blog/posts.astro";
import LargeCard from "@components/Feature.astro";
// Icons
import { BookmarkBook, ReportColumns } from "@iconoir/vue";
import { CallToAction } from "@sudovanilla/pandora";
---
<Default MobileTitle="SudoVanilla" NoSubHeader>
@ -21,56 +16,61 @@ import { BookmarkBook, ReportColumns } from "@iconoir/vue";
Image="https://md.sudovanilla.org/images/pexels-asphotograpy-94842.jpg"
Credit="Green Pine Trees. Shot by AS Photography on Pexels."
/>
<Heading Title="Blog" Description="Tips, Tricks, and Updates">
<slot slot="icon">
<BookmarkBook width={32} height={32} />
</slot>
</Heading>
<Posts server:defer><div slot="fallback">Loading posts...</div></Posts>
<Heading Title="Projects" Description="What I've Made">
<slot slot="icon">
<ReportColumns width={32} height={32} />
</slot>
</Heading>
<LargeCard
<CallToAction
Title="Instances"
Description="Clients, services, and frontends hosted by SudoVanilla"
ImageSource="https://md.sudovanilla.org/images/8108969777692270658741264896182357708404070882901004771113430719.png"
ImageAlt="Image"
PrimaryActionText="View Instances"
PrimaryAction="/instances"
/>
<CallToAction
Title="MinPluto"
Description="SudoVanilla Studio"
Image="https://md.sudovanilla.org/images/mp-ba-1.png"
CTA_Primary="View Website"
CTA_Primary_Link="https://studio.sudovanilla.org/"
ImageSource="https://md.sudovanilla.org/images/mp-ba-1.png"
ImageAlt="Image"
PrimaryActionText="View Website"
PrimaryAction="https://studio.sudovanilla.org/"
/>
<LargeCard
<CallToAction
Title="Zorn Player"
Description="Video Player for Astro"
Image="https://md.sudovanilla.org/images/Screenshot%20from%202024-08-27%2001-41-34.png"
CTA_Primary="Documentation"
CTA_Primary_Link="/docs/zorn/introduction/"
ImageSource="https://md.sudovanilla.org/images/Screenshot From 2024-12-03 22-07-36.png"
ImageAlt="Image"
PrimaryActionText="Documentation"
PrimaryAction="/docs/zorn/introduction/"
/>
<LargeCard
<CallToAction
Title="ButterflyVu"
Description="Documention Site"
Image="https://md.sudovanilla.org/images/pexels-pixabay-326055.jpg"
CTA_Primary="Source Code"
CTA_Primary_Link="https://ark.sudovanilla.org/Korbs/butterflyvu"
CreditImage="Close-up Photo of Glowing Blue Butterflies by Pixabay on Pixels."
ImageSource="https://md.sudovanilla.org/images/pexels-pixabay-326055.jpg"
ImageAlt="Image"
PrimaryActionText="Source Code"
PrimaryAction="https://ark.sudovanilla.org/Korbs/butterflyvu"
/>
<LargeCard
<CallToAction
Title="Init Privacy"
Description="Taking Back Control"
Image="https://md.sudovanilla.org/images/smartmockups_lvh9a29d.jpg"
ImageSource="https://md.sudovanilla.org/images/6560385685.png"
ImageAlt="Image"
PrimaryActionText="Source Code"
PrimaryAction="https://ark.sudovanilla.org/Korbs/butterflyvu"
Label="Development Paused"
LabelVarient="Warning"
CTA_Primary="View"
CTA_Primary_Link="/init/"
/>
<LargeCard
<CallToAction
Title="Penpot Desktop"
Description="A Desktop-Like Experience"
Image="https://md.sudovanilla.org/images/Z1.webp"
ImageSource="https://md.sudovanilla.org/images/Z1.webp"
ImageAlt="Image"
PrimaryActionText="Source Code"
PrimaryAction="https://ark.sudovanilla.org/Korbs/butterflyvu"
Label="Discontinued"
LabelVarient="Warning"
CTA_Primary="Documentation"
CTA_Primary_Link="/docs/penpot-desktop/introduction/"
/>
</Fragment>
</Default>

View file

@ -3,12 +3,24 @@ layout: '../layouts/Markdown.astro'
Title: 'Privacy Policy'
---
<p style="opacity: 0.5; font-size: 14px">Last Updated: November 19th, 2024</p>
<p style="opacity: 0.5; font-size: 14px">Last Updated: December 3rd, 2024</p>
**Support**
## Contact for data protection issues
If you have any questions regarding data protection, please contact SudoVanilla at privacy (at) sudovanilla.org.
## Where is the personal data stored?
SudoVanilla runs it's main server locally, as everything is selfhosted. SudoVanilla is located in the Unites States.
## Support
**Email**
When you send an email to any sudovanilla.org emails, your email address and the information you sent is collected. All emails are archived.
## Donations and Other Payments
**Payments**
Payment information are processed for when you donate to SudoVanilla or any other purchases. Stripe is used as the preferred payment processor for all of SudoVanilla and it's donations.
@ -31,6 +43,24 @@ All payments should done via sudovanilla.org with a Stripe user dashboard. If no
SudoVanilla prints phyical copies of all receipts, as of November 15th 2024.
## Analytics
SudoVanilla uses Umami analytics software on it's main website and it's studio webite.
The following is recorded:
- Page visited
- Referrers
- User Agent
- OS
- Device Type
- Country
All analytics are public to view:
- [sudovanilla.org](https://stats.sudovanilla.org/share/KfVISbb3ize2FhSJ/sudovanilla.org)
- [studio.sudovanilla.org](https://stats.sudovanilla.org/share/EeQwCMbGzkygdN04/studio.sudovanilla.org)
## Services:
**SudoVanilla Ark**
When you sign up for SudoVanilla Ark, the following information is recorded:

View file

@ -48,6 +48,9 @@
:root {
--border-color: rgba(255, 255, 255, 0.25);
--border-color-hover: rgba(255, 255, 255, 0.50);
--pandora-text: white;
--pandora-shadows: rgba(19, 21, 26, 0.5);
--pandora-borders: white;
}
body {
@ -109,11 +112,13 @@ a {
:is(body) {
@include color-mode(light) {
:root {
--pandora-text: black !important;
--pandora-shadows: black !important;
--pandora-borders: black !important;
}
color: black !important;
background-color: white !important;
:root {
--box-shadow-color: white;
}
.theme-is-light {display: inherit}
.theme-is-dark {display: none}
.service-links a {
@ -127,7 +132,7 @@ a {
filter: invert(1);
}
}
.large-card {
.pd-cta-end {
a {
background: rgb(234, 234, 234) !important;
color: black !important;
@ -140,11 +145,13 @@ a {
}
}
@include color-mode(dark) {
:root {
--pandora-text: white;
--pandora-shadows: white;
--pandora-borders: white;
}
color: white !important;
background-color: black !important;
:root {
--box-shadow-color: black;
}
.theme-is-light {display: none}
.theme-is-dark {display: inherit}
.service-links a {
@ -161,7 +168,7 @@ a {
filter: invert(0);
}
}
.large-card {
.pd-cta-end {
a {
background: transparent !important;
color: white !important;