Compare commits
23 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 63a221ce4e | |||
| f1e8617fa1 | |||
| 28a086faca | |||
| 972be5c196 | |||
| 6e0da27d4b | |||
| a32798503a | |||
| d3fe1001e3 | |||
| 7c4b1083ef | |||
| 1ac6ad02ea | |||
| f169793c0f | |||
| 68f0ae3ab2 | |||
| cb234b1a9c | |||
| df5baa6dca | |||
| afb5f79bc0 | |||
| f45bc19e8a | |||
| 059389db1c | |||
| e757727980 | |||
| 8b5108517e | |||
| 56ba8012ad | |||
| 4e57fbcbd4 | |||
| 2fc219b8eb | |||
| adf33abeeb | |||
| f00ab0b34e |
@@ -1,24 +1,10 @@
|
||||
---
|
||||
kind: pipeline
|
||||
name: default
|
||||
type: docker
|
||||
name: test
|
||||
|
||||
steps:
|
||||
- name: build and publish docker image
|
||||
image: plugins/docker
|
||||
settings:
|
||||
repo: git.coopcloud.tech/rtm/rtmwebsite
|
||||
tags:
|
||||
- main
|
||||
- latest
|
||||
- 0.0.8
|
||||
platform: linux/amd64
|
||||
username:
|
||||
from_secret: USERNAME
|
||||
password:
|
||||
from_secret: PASSWORD
|
||||
registry: git.coopcloud.tech
|
||||
trigger:
|
||||
branch:
|
||||
- main
|
||||
event:
|
||||
- push
|
||||
- name: greeting
|
||||
image: alpine
|
||||
commands:
|
||||
- echo hello
|
||||
- echo world
|
||||
@@ -24,7 +24,4 @@ pnpm-debug.log*
|
||||
.idea/
|
||||
|
||||
# Emacs
|
||||
*~
|
||||
|
||||
# Drone
|
||||
.drone.secrets
|
||||
*~
|
||||
@@ -1,5 +1,3 @@
|
||||
[](https://build.coopcloud.tech/RTM/rtm-website)
|
||||
|
||||
# hello friends !
|
||||
|
||||
|
||||
@@ -48,8 +46,6 @@ npx astro dev
|
||||
|
||||
## Build in the docker image (make sure you have Docker installed!)
|
||||
|
||||
Set the version to the next [semantic version](https://semver.org/) after the version posted at [our co-op cloud's packages site](https://git.coopcloud.tech/RTM/-/packages) under "rtmwebsite":
|
||||
|
||||
``` bash
|
||||
version=<specify-version>
|
||||
docker build --platform linux/amd64 -t git.coopcloud.tech/rtm/rtmwebsite:$version .
|
||||
@@ -64,63 +60,10 @@ Check out [this documentation](https://docs.gitea.com/next/usage/packages/contai
|
||||
docker push git.coopcloud.tech/rtm/rtmwebsite:$version
|
||||
```
|
||||
|
||||
At [our co-op cloud's packages site](https://git.coopcloud.tech/RTM/-/packages), click on "rtmwebsite" and check that the version mentioned is the version you specified!
|
||||
|
||||
## Update recipe
|
||||
|
||||
We use a [private recipe](https://git.coopcloud.tech/RTM/rtm-astro-recipe) to deploy this website. This step needs Wireguard to be activated (download Wireguard and ask Sootie's owner to create a config for you and give you Docker permissions). The following examples will assume your name in Sootie's config is "blueberry"!
|
||||
We use a [private recipe](https://git.coopcloud.tech/RTM/rtm-astro-recipe) to deploy this website, you will need to update the version in the compose.yml file and redoploy.
|
||||
|
||||
You will need to have wget (`brew install wget` on mac) and [abra](https://docs.coopcloud.tech/abra/) installed.
|
||||
|
||||
Create an SSH key to use with Sootie with the following command. Take note of the file where you save the key. The following examples will assume it is saved to `rtm` and that the `.ssh` directory is in your home directory (which you can find with the command `echo $HOME`).
|
||||
|
||||
```ssh-keygen -t ed25519```
|
||||
|
||||
|
||||
Run the following commands to install the SSH key to Sootie as an authorized key:
|
||||
|
||||
```
|
||||
ssh-copy-id -i $HOME/.ssh/rtm.pub blueberry@resisttechmonopolies.online
|
||||
ssh -i $HOME/.ssh/rtm 'blueberry@resisttechmonopolies.online'
|
||||
```
|
||||
|
||||
|
||||
In the `$HOME/.ssh/config` file (which you may have to create if it does not exist), paste the following:
|
||||
|
||||
```
|
||||
Host resisttechmonopolies.online
|
||||
Hostname resisttechmonopolies.online
|
||||
User blueberry
|
||||
UseKeychain yes
|
||||
IdentityFile ~/.ssh/rtm
|
||||
```
|
||||
|
||||
You should now be able to SSH into Sootie with just the command `ssh resisttechmonopolies.online`
|
||||
|
||||
|
||||
Run the following command (outside of the terminal in which you ran ssh in the previous step)
|
||||
|
||||
```abra server add resisttechmonopolies.online```
|
||||
|
||||
Clone the `sootie-config` repo into your `$HOME/.abra/servers/resisttechmonopolies.online` directory:
|
||||
|
||||
``` bash
|
||||
git clone https://git.coopcloud.tech/RTM/sootie-config.git .
|
||||
# DON'T FORGET THE . AT THE END OF THE COMMAND
|
||||
```
|
||||
|
||||
Clone the `rtm-astro-recipe` repo into your `$HOME/.abra/recipes` directory:
|
||||
|
||||
```git clone https://git.coopcloud.tech/RTM/rtm-astro-recipe.git```
|
||||
|
||||
|
||||
Update the version number to the latest in
|
||||
|
||||
``` bash
|
||||
.abra/servers/resisttechmonopolies.online/resisttechmonopolies.online.env
|
||||
```
|
||||
|
||||
Then
|
||||
``` bash
|
||||
abra app undeploy resisttechmonopolies.online
|
||||
# wait 10 seconds
|
||||
|
||||
@@ -40,4 +40,4 @@
|
||||
"prettier-plugin-organize-imports": "^4.1.0",
|
||||
"prettier-plugin-tailwindcss": "^0.6.9"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 174 KiB After Width: | Height: | Size: 553 KiB |
|
Before Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 694 KiB |
|
After Width: | Height: | Size: 257 KiB |
|
Before Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 948 KiB |
|
Before Width: | Height: | Size: 968 KiB |
|
Before Width: | Height: | Size: 935 KiB |
|
Before Width: | Height: | Size: 970 KiB |
|
Before Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1007 KiB |
|
Before Width: | Height: | Size: 961 KiB |
|
Before Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 283 KiB |
|
Before Width: | Height: | Size: 283 KiB |
|
Before Width: | Height: | Size: 411 KiB |
|
Before Width: | Height: | Size: 353 KiB |
|
Before Width: | Height: | Size: 366 KiB |
|
Before Width: | Height: | Size: 374 KiB |
|
Before Width: | Height: | Size: 373 KiB |
|
Before Width: | Height: | Size: 366 KiB |
|
Before Width: | Height: | Size: 326 KiB |
|
Before Width: | Height: | Size: 279 KiB |
|
Before Width: | Height: | Size: 279 KiB |
|
Before Width: | Height: | Size: 388 KiB |
|
Before Width: | Height: | Size: 319 KiB |
|
Before Width: | Height: | Size: 378 KiB |
|
Before Width: | Height: | Size: 355 KiB |
|
Before Width: | Height: | Size: 379 KiB |
|
Before Width: | Height: | Size: 362 KiB |
|
Before Width: | Height: | Size: 303 KiB |
|
Before Width: | Height: | Size: 214 KiB |
|
Before Width: | Height: | Size: 214 KiB |
|
Before Width: | Height: | Size: 452 KiB |
|
Before Width: | Height: | Size: 471 KiB |
|
Before Width: | Height: | Size: 418 KiB |
|
Before Width: | Height: | Size: 470 KiB |
|
Before Width: | Height: | Size: 452 KiB |
|
Before Width: | Height: | Size: 469 KiB |
|
Before Width: | Height: | Size: 422 KiB |
|
Before Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 108 KiB |
|
Before Width: | Height: | Size: 96 KiB |
|
Before Width: | Height: | Size: 105 KiB |
|
Before Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 90 KiB |
|
Before Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 49 KiB |
@@ -1,122 +0,0 @@
|
||||
---
|
||||
import Card from "./Card.astro";
|
||||
---
|
||||
|
||||
<div class="pl-4 pr-4">
|
||||
<h1 class="pb-4 pt-4 text-3xl font-semibold">Big Tech Alternatives</h1>
|
||||
<p class="mb-4">
|
||||
Explore open-source and privacy-focused alternatives to popular big tech
|
||||
software.
|
||||
</p>
|
||||
|
||||
<div class="grid grid-cols-1 gap-8 md:grid-cols-2 lg:grid-cols-3">
|
||||
<Card
|
||||
title="Browsers"
|
||||
bigTech="Chrome (Google)"
|
||||
alternatives={[
|
||||
{
|
||||
name: "Firefox",
|
||||
description: "Privacy-focused browser.",
|
||||
url: "https://www.mozilla.org/firefox",
|
||||
},
|
||||
]}
|
||||
bgClass="bg-blue-50"
|
||||
/>
|
||||
|
||||
<Card
|
||||
title="Cloud Storage"
|
||||
bigTech="Google Drive"
|
||||
alternatives={[
|
||||
{
|
||||
name: "Nextcloud",
|
||||
description: "Self-hosted file sync and share.",
|
||||
url: "https://nextcloud.com",
|
||||
},
|
||||
]}
|
||||
bgClass="bg-indigo-50"
|
||||
/>
|
||||
|
||||
<Card
|
||||
title="Email"
|
||||
bigTech="Gmail (Google)"
|
||||
alternatives={[
|
||||
{
|
||||
name: "ProtonMail",
|
||||
description: "Encrypted email.",
|
||||
url: "https://protonmail.com",
|
||||
},
|
||||
]}
|
||||
bgClass="bg-yellow-50"
|
||||
/>
|
||||
|
||||
<Card
|
||||
title="Maps"
|
||||
bigTech="Google Maps"
|
||||
alternatives={[
|
||||
{
|
||||
name: "OpenStreetMap",
|
||||
description: "Community-driven maps.",
|
||||
url: "https://www.openstreetmap.org",
|
||||
},
|
||||
]}
|
||||
bgClass="bg-teal-50"
|
||||
/>
|
||||
|
||||
<Card
|
||||
title="Messaging"
|
||||
bigTech="WhatsApp (Meta), Slack"
|
||||
alternatives={[
|
||||
{
|
||||
name: "Signal",
|
||||
description: "Encrypted messaging (alternative to WhatsApp).",
|
||||
url: "https://signal.org",
|
||||
},
|
||||
{
|
||||
name: "Element",
|
||||
description: "Matrix-based chat (alternative to Slack).",
|
||||
url: "https://element.io",
|
||||
},
|
||||
]}
|
||||
bgClass="bg-red-50"
|
||||
/>
|
||||
|
||||
<Card
|
||||
title="Search Engines"
|
||||
bigTech="Google Search"
|
||||
alternatives={[
|
||||
{
|
||||
name: "DuckDuckGo",
|
||||
description: "Privacy-protecting search.",
|
||||
url: "https://duckduckgo.com",
|
||||
},
|
||||
]}
|
||||
bgClass="bg-green-50"
|
||||
/>
|
||||
|
||||
<Card
|
||||
title="Social Media"
|
||||
bigTech="Twitter (X), Facebook (Meta)"
|
||||
alternatives={[
|
||||
{
|
||||
name: "Mastodon",
|
||||
description: "Decentralized social network (alternative to Twitter).",
|
||||
url: "https://joinmastodon.org",
|
||||
},
|
||||
]}
|
||||
bgClass="bg-purple-50"
|
||||
/>
|
||||
|
||||
<Card
|
||||
title="Video Platforms"
|
||||
bigTech="YouTube (Google)"
|
||||
alternatives={[
|
||||
{
|
||||
name: "PeerTube",
|
||||
description: "Decentralized video hosting.",
|
||||
url: "https://joinpeertube.org",
|
||||
},
|
||||
]}
|
||||
bgClass="bg-pink-50"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,24 +0,0 @@
|
||||
---
|
||||
export interface Props {
|
||||
title: string;
|
||||
bigTech: string;
|
||||
alternatives: Array<{ name: string; description: string; url: string }>;
|
||||
bgClass: string;
|
||||
}
|
||||
|
||||
const { title, bigTech, alternatives, bgClass } = Astro.props;
|
||||
---
|
||||
|
||||
<div class={`border rounded-lg p-6 shadow-md ${bgClass} text-gray-900`}>
|
||||
<h2 class="text-2xl font-semibold mb-4">{title}</h2>
|
||||
<p class="text-base mb-4"><span class="line-through">Big Tech Option: {bigTech}</span></p>
|
||||
<ul class="space-y-4">
|
||||
{alternatives.map(alt => (
|
||||
<li>
|
||||
<h3 class="text-lg font-bold underline">{alt.name}</h3>
|
||||
<p>{alt.description}</p>
|
||||
<a href={alt.url} class="text-blue-500 hover:text-blue-700">Website</a>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
@@ -4,20 +4,10 @@ export default function Footer() {
|
||||
return (
|
||||
<div
|
||||
className={cn(
|
||||
"flex h-12 gap-4 mt-8 w-screen place-items-center justify-center bg-[#dfd9ffff] text-black",
|
||||
"flex h-12 w-screen flex-col place-items-center justify-center bg-emerald-50",
|
||||
)}
|
||||
>
|
||||
|
||||
<h2>Resist Tech Monopolies - Copyleft {new Date().getFullYear()}</h2>
|
||||
|
||||
<a href="https://social.coop/@rtm" rel="noopener noreferrer" target="_blank"
|
||||
>
|
||||
<img
|
||||
src={"/assets/mastodon.png"}
|
||||
alt={"the logo for Mastodon (a purple text bubble with the letter M)"}
|
||||
width="30"
|
||||
height="30"
|
||||
/></a>
|
||||
<h2>Copyleft 2025</h2>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,91 +1,59 @@
|
||||
import { cn } from "@/lib/utils";
|
||||
import { useState } from "react";
|
||||
|
||||
interface NavbarProps {
|
||||
activePage?: string;
|
||||
}
|
||||
|
||||
const NAV_ITEMS = [
|
||||
{ href: "/#aboutus", label: "About Us", activeKey: "AboutUs", text: "text-red-400", darkText: "dark:text-red-400" },
|
||||
{ href: "/#whatwereupto", label: "What We're Up To", activeKey: "WhatWereUpTo", text: "text-orange-400", darkText: "dark:text-orange-400" },
|
||||
{ href: "/#services", label: "Services", activeKey: "Services", text: "text-green-400", darkText: "dark:text-green-400" },
|
||||
{ href: "/#bigtechalternatives", label: "Big Tech Alternatives", activeKey: "BigTechAlternatives", text: "text-purple-400", darkText: "dark:text-purple-400" },
|
||||
// TODO once we have this section done!
|
||||
// { href: "", label: "Calendar", activeKey: "Calendar", text: "text-blue-400", darkText: "dark:text-blue-400" },
|
||||
];
|
||||
|
||||
export default function Navbar(navbarProps: NavbarProps) {
|
||||
const [activePage, setActivePage] = useState(navbarProps.activePage);
|
||||
const [isShowingHamburgerFullMenu, setIsShowingHamburgerFullMenu] = useState(false);
|
||||
|
||||
export default function Navbar({ activePage = "" }: NavbarProps) {
|
||||
return (
|
||||
<div className={cn("bg-white dark:bg-black px-4")}>
|
||||
<div className={cn("flex flex-row items-center justify-between pb-4 pt-4")}>
|
||||
<a href="/" onClick={() => { setActivePage("Home") }}>
|
||||
<div className={cn("flex items-center gap-3")}>
|
||||
{/*
|
||||
TODO: uncomment once we have a logo!
|
||||
<img
|
||||
src={"/assets/logo.png"}
|
||||
alt={"the logo for RTM (a cat in graffiti style with the RTM written in red and Resist Tech Monopolies written in black)"}
|
||||
width="50"
|
||||
height="50"
|
||||
/> */}
|
||||
|
||||
<h1 className={cn(
|
||||
"text-2xl md:text-3xl font-bold",
|
||||
activePage === "Home" && "underline",
|
||||
)}>Resist Tech Monopolies</h1>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<div className={cn("items-center gap-4 hidden md:flex")}>
|
||||
{NAV_ITEMS.map(({ href, label, activeKey, text, darkText }) => (
|
||||
<a
|
||||
key={href}
|
||||
href={href}
|
||||
onClick={() => {
|
||||
setActivePage(activeKey)
|
||||
}}
|
||||
className={cn(
|
||||
"transition-colors md:text-2xl font-bold",
|
||||
text,
|
||||
darkText,
|
||||
activePage == activeKey && "underline",
|
||||
)}
|
||||
>
|
||||
{label}
|
||||
</a>
|
||||
))}
|
||||
<>
|
||||
<div className={cn("flex flex-row justify-between pb-8 pl-4 pr-4 pt-8")}>
|
||||
<div>
|
||||
<strong className={cn("sm:text-2xl md:text-4xl")}>
|
||||
<a
|
||||
className={cn(
|
||||
activePage === "Home" && "border-b-2 border-black-500",
|
||||
)}
|
||||
href="/">Resist Tech Monopolies</a>
|
||||
</strong>
|
||||
</div>
|
||||
|
||||
<div className={cn("hamburger block md:hidden")} onClick={() => { setIsShowingHamburgerFullMenu(!isShowingHamburgerFullMenu) }}>
|
||||
<span className={cn("bg-black dark:bg-white line")}></span>
|
||||
<span className={cn("bg-black dark:bg-white line")}></span>
|
||||
<span className={cn("bg-black dark:bg-white line")}></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{isShowingHamburgerFullMenu && <div className={cn("flex md:hidden flex-col gap-4 bg-white p-2 mb-2")}>
|
||||
{NAV_ITEMS.map(({ href, label, activeKey, text, darkText }) => (
|
||||
<strong className={cn("sm:text-1xl flex gap-10 md:text-4xl")}>
|
||||
|
||||
<a
|
||||
key={href}
|
||||
href={href}
|
||||
onClick={() => {
|
||||
setActivePage(activeKey)
|
||||
setIsShowingHamburgerFullMenu(false)
|
||||
}}
|
||||
href="/PointsOfUnity/"
|
||||
className={cn(
|
||||
"transition-colors text-xl md:text-2xl font-bold",
|
||||
text,
|
||||
darkText,
|
||||
activePage == activeKey && "underline",
|
||||
"text-green-500",
|
||||
activePage === "PointsOfUnity" && "border-b-2 border-green-500",
|
||||
)}
|
||||
>
|
||||
{label}
|
||||
Points of Unity
|
||||
</a>
|
||||
))}
|
||||
</div>}
|
||||
</div>
|
||||
<a
|
||||
href="/WhatWereWorkingOn/"
|
||||
className={cn(
|
||||
"text-red-500",
|
||||
activePage === "WhatWereWorkingOn" && "border-b-2 border-red-500",
|
||||
)}
|
||||
>
|
||||
What We're Working On
|
||||
</a>
|
||||
</strong>
|
||||
</div>
|
||||
|
||||
<div className={cn("flex flex-row justify-between pb-8")}>
|
||||
<div className="w-full grid grid-flow-col auto-cols-[76px] gap-8">
|
||||
{Array.from({ length: 20 }).map((_, index) => (
|
||||
<div key={index} className="flex justify-center">
|
||||
<img
|
||||
src={index % 2 === 0 ? "/assets/computer.png" : "/assets/people.png"}
|
||||
alt={index % 2 === 0 ? "computer icon" : "people icon"}
|
||||
width="30"
|
||||
height="30"
|
||||
/>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,64 +0,0 @@
|
||||
<h1 class="text-3xl font-semibold">Points of Unity</h1>
|
||||
|
||||
<p class="mb-4">
|
||||
Our community agreements and decision-making process describe <em>how</em> we work together. The points of unity are the broader philosophies that we're working towards as a group. Perhaps people aren't 100% aligned individually, but this is what the group as a whole believes in when showing up to the work.
|
||||
</p>
|
||||
|
||||
<h2 class="text-2xl font-semibold mt-10 mb-2">Grounding</h2>
|
||||
|
||||
<p class="mb-4">
|
||||
We situate ourselves in our context - as Seattle residents and as users and creators of the technologies we aim to resist. We are seeing a long-spanning rise of fascism within national governments here and abroad. In parallel is the increasing power of tech companies over our lives through surveillance and the provisioning of everyday needs, from employment to how we get our internet utilities in the first place. There are rising income disparities across the nation, but also more specifically across everyone who can be considered a "tech worker": from a CEO, to a software engineer to a tech campus cafeteria worker to a child enslaved to mine cobalt in the Congo.
|
||||
</p>
|
||||
|
||||
<p class="mb-4">
|
||||
We know that technology intersects with and amplifies systems of oppression, from anti-Black racism to classism, ableism, cisheteropatriarchy, etc. Big tech permeates all aspects of life in Seattle, but to name a few ways:
|
||||
</p>
|
||||
|
||||
<ul class="list-disc pl-8 mb-4 space-y-2">
|
||||
<li>The rise of a <a href="https://stopsurveillancecity.wordpress.com/" class="font-bold underline hover:text-gray-600">Surveillance City</a> in Seattle facilitates the tracking of out-of-state people seeking abortions, the kidnapping of migrants, and the increased surveillance and criminalization of sex workers, the visibly unhoused, and poor and racialized communities.</li>
|
||||
<li>The <strong>environmental racism</strong> and community impacts of <strong>data centers</strong>, both from the AI bubble and the demand for more data processing that comes with surveillance capitalism.</li>
|
||||
<li><strong>The AI genocide</strong> in Palestine abetted by Google, Amazon, Boeing and Microsoft, all local Seattle employers.</li>
|
||||
<li>Rising <strong>gentrification</strong> and <strong>income inequality</strong> that comes from financialization of real estate and the gentrifying waves of tech workers moving into the city.</li>
|
||||
</ul>
|
||||
|
||||
<p class="mb-4">
|
||||
Some of us are employed by Big Tech companies, and we are all living on stolen Coast Salish land covered by the broken Treaty of Point Elliot of 1855; we understand that we are contributing - directly or indirectly - to these oppressions, and seek to use our skills towards more liberatory ends.
|
||||
</p>
|
||||
|
||||
<h2 class="text-2xl font-semibold mt-10 mb-2">Theory of Change</h2>
|
||||
|
||||
<p class="mb-4">
|
||||
We are committed to fostering our collective understanding of resisting tech monopolies and building a constellation of alternative technologies that exist outside of exploitative, oppressive systems. We seek out radical possibilities by building connections across our communities with others struggling to resist tech monopolies and reject work that expands the reach of these monopolies.
|
||||
</p>
|
||||
|
||||
<p class="mb-4">
|
||||
We don't need to passively wait around for somebody to come implement these solutions. Making improvements to our lives and our communities paves the way for collective liberation. Dismantling smaller elements of a system is practice for uprooting the whole and replacing it with a constellation of liberatory alternatives.
|
||||
</p>
|
||||
|
||||
<h2 class="text-2xl font-semibold mt-10 mb-2">Role of Technology</h2>
|
||||
|
||||
<p class="mb-4">
|
||||
"We believe our communities and organizing efforts can and should harness the possibilities of new technology." (<a href="https://mijente.net/our-dna/" class="underline hover:text-gray-600">Mijente</a>) However, we don't innovate for the sake of innovation, but aim to create with intention, listen to the perspectives of those we hope to serve (including ourselves), and hold each other accountable in this work.
|
||||
</p>
|
||||
|
||||
<h2 class="text-2xl font-semibold mt-10 mb-2">Our Position in the Movement</h2>
|
||||
|
||||
<p class="mb-4">
|
||||
We don't see ourselves as a vanguard organization - that is, we make no claims to being the sole authority on resisting tech monopolies and we will never tell a front-line community or group of tech users what they actually need. Everyone benefits from the work of resisting tech monopolies, and for that reason we do the work for ourselves as much as we do it for anybody we are in solidarity with.
|
||||
</p>
|
||||
|
||||
<p class="mb-4">
|
||||
However we also recognize our own privilege in being highly-skilled tech workers: because of this we center the voices of the people most vulnerable to various tech monopolies, and aim to share our expertise so that others can also become agents in co-creating technologies of liberation and resistance.
|
||||
</p>
|
||||
|
||||
<h2 class="text-2xl font-semibold mt-10 mb-2">Friendly Vibes</h2>
|
||||
|
||||
<p class="mb-4">
|
||||
Holding all of the above, we're also a group of friends here for the scrappy, hacky vibes. We don't take our work too seriously and we're here to work joyfully. This is first and foremost a community.
|
||||
</p>
|
||||
|
||||
<h2 class="text-2xl font-semibold mt-10 mb-2">Acknowledgments</h2>
|
||||
|
||||
<p class="mb-4">
|
||||
These points of unity were inspired by the Prison Library Solidarity Network, the Coalition of Anti-Racist Whites, Ruha Benjamin's work on Abolitionist Tech, and Mijente.
|
||||
</p>
|
||||
@@ -1,47 +0,0 @@
|
||||
<h1 class="text-3xl font-semibold">Services</h1>
|
||||
|
||||
<section class="flex flex-col">
|
||||
<h2 class="text-2xl font-semibold mt-4">Our Mission</h2>
|
||||
We promote free and open source options with a non-judgmental attitude. We understand
|
||||
that almost everyone ends up using Big Tech software sometimes. We want to help
|
||||
you meet your own goals, whether it be reducing what you pay big corporations or
|
||||
increasing your privacy.
|
||||
|
||||
<h2 class="text-2xl font-semibold mt-4">Managed Service Hosting</h2>
|
||||
We offer individuals and organizations access to a suite of open-source, privacy-friendly
|
||||
tools, including: • NextCloud (alternative to Google Workspace, Microsoft 365,
|
||||
etc.) • Loomio (democratic, asynchronous decision-making platform) • Zulip (alternative
|
||||
to Slack, Teams, Discord) • Keycloak (Single Sign-On/SSO) • Vaultwarden (password
|
||||
manager) • Headscale (VPN) • Matrix (decentralized, federated alternative to Discord)
|
||||
• Immich (alternative to Google Photos) Our team has decades of collective expertise
|
||||
in cloud computing and open-source software. We're patient, responsive to users'
|
||||
needs, and skilled at translating from tech jargon to plain language.
|
||||
|
||||
<h2 class="text-2xl font-semibold mt-4">Data Migration</h2>
|
||||
We know a lot of people want to move away from the Big Tech ecosystem but feel
|
||||
overwhelmed and don't know where to start. We've been doing this for years, and
|
||||
we know how to help you move your data away from Big Tech and select appropriate,
|
||||
privacy-friendly, open-source alternatives that still meet your needs. We offer
|
||||
individual, organization, and family pricing.
|
||||
|
||||
<h2 class="text-2xl font-semibold mt-4">Training</h2>
|
||||
We offer in-person events to help individuals and organizations understand the
|
||||
risks of Big Tech, improve their digital security, and learn about privacy-friendly,
|
||||
open-source alternatives. Here are a few of the events we've held: • DiscoTechs
|
||||
(science-fair style event where you can learn about a variety of alternatives to
|
||||
Big Tech) • Digital Security workshops (hands-on sessions to improve your security
|
||||
posture and understand what threats are actually relevant for you and your organization)s
|
||||
• Office Hours (drop-in IT help)
|
||||
|
||||
<h2 class="text-2xl font-semibold mt-4">Tech Consulting</h2>
|
||||
Does your organization need help choosing IT tools? Need a website built or hosted?
|
||||
Maybe you want to self-host your own server infrastructure, but need a little support.
|
||||
Whatever your tech needs, just drop us a line, and we'll see if we can help.
|
||||
|
||||
<a
|
||||
href="https://nextcloud.resisttechmonopolies.online/apps/forms/4LrRffxHzHqwCrgs/submit"
|
||||
class="max-w-[120px] rounded-sm bg-[#4ade80] my-4 px-6 py-3 text-center font-semibold text-white transition-colors"
|
||||
>
|
||||
Hire us!
|
||||
</a>
|
||||
</section>
|
||||
@@ -1,56 +0,0 @@
|
||||
<h1 class="pb-4 text-3xl font-semibold">What We're Up To</h1>
|
||||
<div class="grid grid-cols-1 gap-8 xl:grid-cols-3">
|
||||
<div class="grid justify-items-center gap-8">
|
||||
<a href="/projects/bookclub/" class="underline decoration-solid">
|
||||
<img
|
||||
src="/assets/book-club.png"
|
||||
alt="4 books we've read: Common Cicruits, Race After Technology, Teaching Community Technology, and Internet for the People"
|
||||
loading="lazy"
|
||||
class="h-[250px] border"
|
||||
/>
|
||||
</a>
|
||||
|
||||
<a
|
||||
href="/projects/bookclub/"
|
||||
class="max-w-[240px] rounded-sm bg-[#fb923c] px-6 py-3 text-center font-semibold text-white transition-colors"
|
||||
>
|
||||
What We're Reading
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="grid justify-items-center gap-8">
|
||||
<a href="/projects/PetCalendar/" class="underline decoration-solid">
|
||||
<img
|
||||
src="/assets/pet-calendar-2026-cover.jpg"
|
||||
alt="The cover of our pet calendar; a collage of dogs and cats with computer stuff"
|
||||
loading="lazy"
|
||||
class="h-[250px] border"
|
||||
/>
|
||||
</a>
|
||||
|
||||
<a
|
||||
href="/projects/petcalendar/"
|
||||
class="max-w-[240px] rounded-sm bg-[#fb923c] px-6 py-3 text-center font-semibold text-white transition-colors"
|
||||
>
|
||||
Pet Calendar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="grid justify-items-center gap-8">
|
||||
<a href="/projects/zines/" class="underline decoration-solid">
|
||||
<img
|
||||
src="/assets/zines-thumbnail.png"
|
||||
alt="4 zines we made: Creating an Internet for the People, De-Monopoly DiscoTech 101, How to Get Started with Signal, and Brief Notes from a De-Monopoly DiscoTech"
|
||||
loading="lazy"
|
||||
class="h-[250px] border"
|
||||
/>
|
||||
</a>
|
||||
|
||||
<a
|
||||
href="/projects/zines/"
|
||||
class="max-w-[240px] rounded-sm bg-[#fb923c] px-6 py-3 text-center font-semibold text-white transition-colors"
|
||||
>
|
||||
Zines
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,40 +0,0 @@
|
||||
import { useEffect, useState } from "react";
|
||||
import { Check, Share2 } from "lucide-react";
|
||||
import { Button } from "../ui/button";
|
||||
|
||||
interface ShareZineButtonProps {
|
||||
zineId: string;
|
||||
}
|
||||
|
||||
export function ShareZineButton({ zineId }: ShareZineButtonProps) {
|
||||
const [copied, setCopied] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
if (!copied) return;
|
||||
const timer = setTimeout(() => setCopied(false), 1500);
|
||||
return () => clearTimeout(timer);
|
||||
}, [copied]);
|
||||
|
||||
const handleClick = async (e: React.MouseEvent) => {
|
||||
e.stopPropagation();
|
||||
const url = `${window.location.origin}/projects/zines/${zineId}`;
|
||||
await navigator.clipboard.writeText(url);
|
||||
setCopied(true);
|
||||
};
|
||||
|
||||
return (
|
||||
<Button variant="outline" size="sm" onClick={handleClick}>
|
||||
{copied ? (
|
||||
<>
|
||||
<Check />
|
||||
Copied!
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<Share2 />
|
||||
Share
|
||||
</>
|
||||
)}
|
||||
</Button>
|
||||
);
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
import { Download } from "lucide-react";
|
||||
import type { Zine } from "../../data/zines";
|
||||
import { Button } from "../ui/button";
|
||||
import { ShareZineButton } from "./ShareZineButton";
|
||||
|
||||
interface ZineCardProps {
|
||||
zine: Zine;
|
||||
}
|
||||
|
||||
export function ZineCard({ zine }: ZineCardProps) {
|
||||
const href = `/projects/zines/${zine.id}`;
|
||||
|
||||
return (
|
||||
<div className="flex flex-col items-center gap-2 rounded-lg border p-4">
|
||||
<a
|
||||
href={href}
|
||||
className="group flex flex-col items-center gap-2 transition-all focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2"
|
||||
>
|
||||
<div className="aspect-[3/4] w-48 overflow-hidden rounded bg-muted">
|
||||
<img
|
||||
src={zine.coverImage}
|
||||
alt={`Cover of ${zine.title}`}
|
||||
className="h-full w-full object-cover transition-transform group-hover:scale-105"
|
||||
/>
|
||||
</div>
|
||||
<h3 className="text-lg font-medium">{zine.title}</h3>
|
||||
{zine.description && (
|
||||
<p className="text-sm text-muted-foreground">{zine.description}</p>
|
||||
)}
|
||||
</a>
|
||||
|
||||
<div className="flex gap-2 mt-2">
|
||||
<Button variant="outline" size="sm" asChild>
|
||||
<a href={href}>Read Online</a>
|
||||
</Button>
|
||||
<Button variant="outline" size="sm" asChild>
|
||||
<a href={zine.printablePdf} download>
|
||||
<Download />
|
||||
Printable
|
||||
</a>
|
||||
</Button>
|
||||
<ShareZineButton zineId={zine.id} />
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
import { zines } from "../../data/zines";
|
||||
import { ZineCard } from "./ZineCard";
|
||||
|
||||
export function ZineGrid() {
|
||||
return (
|
||||
<div className="grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3">
|
||||
{zines.map((zine) => (
|
||||
<ZineCard key={zine.id} zine={zine} />
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1,113 +0,0 @@
|
||||
export interface Zine {
|
||||
id: string;
|
||||
title: string;
|
||||
description: string;
|
||||
coverImage: string;
|
||||
pages: string[];
|
||||
printablePdf: string;
|
||||
}
|
||||
|
||||
export const zines: Zine[] = [
|
||||
{
|
||||
id: "internet-for-the-people",
|
||||
title: "Internet For the People",
|
||||
description: "",
|
||||
coverImage: "/assets/zines/internet-for-the-people/cover.jpg",
|
||||
pages: [
|
||||
"/assets/zines/internet-for-the-people/page-1.jpg",
|
||||
"/assets/zines/internet-for-the-people/page-2.jpg",
|
||||
"/assets/zines/internet-for-the-people/page-3.jpg",
|
||||
"/assets/zines/internet-for-the-people/page-4.jpg",
|
||||
"/assets/zines/internet-for-the-people/page-5.jpg",
|
||||
"/assets/zines/internet-for-the-people/page-6.jpg",
|
||||
"/assets/zines/internet-for-the-people/page-7.jpg",
|
||||
"/assets/zines/internet-for-the-people/page-8.jpg",
|
||||
],
|
||||
printablePdf: "/assets/zines/internet-for-the-people/printable.pdf",
|
||||
},
|
||||
{
|
||||
id: "de-monopoly-discotech-101",
|
||||
title: "De-Monopoly DiscoTech 101",
|
||||
description: "",
|
||||
coverImage: "/assets/zines/de-monopoly-discotech-101/cover.jpg",
|
||||
pages: [
|
||||
"/assets/zines/de-monopoly-discotech-101/page-1.jpg",
|
||||
"/assets/zines/de-monopoly-discotech-101/page-2.jpg",
|
||||
"/assets/zines/de-monopoly-discotech-101/page-3.jpg",
|
||||
"/assets/zines/de-monopoly-discotech-101/page-4.jpg",
|
||||
"/assets/zines/de-monopoly-discotech-101/page-5.jpg",
|
||||
"/assets/zines/de-monopoly-discotech-101/page-6.jpg",
|
||||
"/assets/zines/de-monopoly-discotech-101/page-7.jpg",
|
||||
"/assets/zines/de-monopoly-discotech-101/page-8.jpg",
|
||||
],
|
||||
printablePdf: "/assets/zines/de-monopoly-discotech-101/printable.pdf",
|
||||
},
|
||||
{
|
||||
id: "de-monopoly-discotech-101-japanese",
|
||||
title: "De-Monopoly DiscoTech 101 (Japanese)",
|
||||
description: "",
|
||||
coverImage: "/assets/zines/de-monopoly-discotech-101-japanese/cover.jpg",
|
||||
pages: [
|
||||
"/assets/zines/de-monopoly-discotech-101-japanese/page-1.jpg",
|
||||
"/assets/zines/de-monopoly-discotech-101-japanese/page-2.jpg",
|
||||
"/assets/zines/de-monopoly-discotech-101-japanese/page-3.jpg",
|
||||
"/assets/zines/de-monopoly-discotech-101-japanese/page-4.jpg",
|
||||
"/assets/zines/de-monopoly-discotech-101-japanese/page-5.jpg",
|
||||
"/assets/zines/de-monopoly-discotech-101-japanese/page-6.jpg",
|
||||
"/assets/zines/de-monopoly-discotech-101-japanese/page-7.jpg",
|
||||
"/assets/zines/de-monopoly-discotech-101-japanese/page-8.jpg",
|
||||
],
|
||||
printablePdf: "/assets/zines/de-monopoly-discotech-101-japanese/printable.pdf",
|
||||
},
|
||||
{
|
||||
id: "brief-notes-from-a-de-monopoly-discotech",
|
||||
title: "Brief Notes from a De-Monopoly DiscoTech",
|
||||
description: "",
|
||||
coverImage: "/assets/zines/brief-notes-from-a-de-monopoly-discotech/cover.jpg",
|
||||
pages: [
|
||||
"/assets/zines/brief-notes-from-a-de-monopoly-discotech/cover.jpg",
|
||||
"/assets/zines/brief-notes-from-a-de-monopoly-discotech/page-1.jpg",
|
||||
"/assets/zines/brief-notes-from-a-de-monopoly-discotech/page-2.jpg",
|
||||
"/assets/zines/brief-notes-from-a-de-monopoly-discotech/page-3.jpg",
|
||||
"/assets/zines/brief-notes-from-a-de-monopoly-discotech/page-4.jpg",
|
||||
"/assets/zines/brief-notes-from-a-de-monopoly-discotech/page-5.jpg",
|
||||
"/assets/zines/brief-notes-from-a-de-monopoly-discotech/page-6.jpg",
|
||||
"/assets/zines/brief-notes-from-a-de-monopoly-discotech/page-7.jpg",
|
||||
],
|
||||
printablePdf: "/assets/zines/brief-notes-from-a-de-monopoly-discotech/printable.pdf",
|
||||
},
|
||||
{
|
||||
id: "signal-101",
|
||||
title: "Signal 101",
|
||||
description: "",
|
||||
coverImage: "/assets/zines/signal-101/cover.jpg",
|
||||
pages: [
|
||||
"/assets/zines/signal-101/cover.jpg",
|
||||
"/assets/zines/signal-101/page-1.jpg",
|
||||
"/assets/zines/signal-101/page-2.jpg",
|
||||
"/assets/zines/signal-101/page-3.jpg",
|
||||
"/assets/zines/signal-101/page-4.jpg",
|
||||
"/assets/zines/signal-101/page-5.jpg",
|
||||
"/assets/zines/signal-101/page-6.jpg",
|
||||
"/assets/zines/signal-101/page-7.jpg",
|
||||
],
|
||||
printablePdf: "/assets/zines/signal-101/printable.pdf",
|
||||
},
|
||||
{
|
||||
id: "signal-201",
|
||||
title: "Signal 201",
|
||||
description: "Advanced usage of signal",
|
||||
coverImage: "/assets/zines/signal-201/cover.jpg",
|
||||
pages: [
|
||||
"/assets/zines/signal-201/cover.jpg",
|
||||
"/assets/zines/signal-201/page-1.jpg",
|
||||
"/assets/zines/signal-201/page-2.jpg",
|
||||
"/assets/zines/signal-201/page-3.jpg",
|
||||
"/assets/zines/signal-201/page-4.jpg",
|
||||
"/assets/zines/signal-201/page-5.jpg",
|
||||
"/assets/zines/signal-201/page-6.jpg",
|
||||
"/assets/zines/signal-201/page-7.jpg",
|
||||
],
|
||||
printablePdf: "/assets/zines/signal-201/printable.pdf",
|
||||
},
|
||||
];
|
||||
@@ -4,7 +4,7 @@ import { cn } from "@/lib/utils";
|
||||
const title =
|
||||
"Resist Tech Monopolies";
|
||||
const description =
|
||||
`Copyleft ${new Date().getFullYear()}`;
|
||||
"Copyleft 2025";
|
||||
const url = "https://placeholder.com";
|
||||
const image = "/public/preview.webp";
|
||||
---
|
||||
@@ -40,7 +40,7 @@ const image = "/public/preview.webp";
|
||||
"@type": "WebSite",
|
||||
"url": "https://placeholder.com",
|
||||
"name": "Resist Tech Monopolies",
|
||||
"description": `Copyleft ${new Date().getFullYear()}`
|
||||
"description": "Copyleft 2025"
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
@@ -1,19 +1,18 @@
|
||||
---
|
||||
import Navbar from "../components/Navbar";
|
||||
import Footer from "../components/Footer";
|
||||
import PointsOfUnity from "../components/PointsOfUnity.astro";
|
||||
import Layout from "../layouts/Layout.astro";
|
||||
import "../styles/globals.css";
|
||||
---
|
||||
|
||||
<Layout>
|
||||
<main class="px-4 flex min-h-screen flex-col justify-between">
|
||||
<main class="flex min-h-screen flex-col justify-between">
|
||||
<div>
|
||||
<section class="sticky top-0">
|
||||
<Navbar client:load activePage="AboutUs" />
|
||||
</section>
|
||||
<Navbar client:load activePage="GetInvolved" />
|
||||
<div class="pl-4 pr-4">
|
||||
<PointsOfUnity />
|
||||
<h1 class="text-3xl font-semibold">Get Involved</h1>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<Footer />
|
||||
@@ -0,0 +1,54 @@
|
||||
---
|
||||
import Navbar from "../components/Navbar";
|
||||
import Footer from "../components/Footer";
|
||||
import Layout from "../layouts/Layout.astro";
|
||||
import "../styles/globals.css";
|
||||
---
|
||||
|
||||
<Layout>
|
||||
<main class="flex min-h-screen flex-col justify-between">
|
||||
<div>
|
||||
<Navbar client:load activePage="PointsOfUnity" />
|
||||
<div class="pl-4 pr-4">
|
||||
<h1 class="text-3xl font-semibold">Points of Unity</h1>
|
||||
|
||||
<p class="mb-4">
|
||||
We situate ourselves in our context - as Seattle residents and as
|
||||
users and creators of the technologies we aim to resist. We are seeing
|
||||
a long-spanning rise of fascism within all levels of governance, from
|
||||
Seattle city council to national governments here and abroad.
|
||||
</p>
|
||||
|
||||
<p class="mb-4">
|
||||
In parallel is the increasing power of tech companies over our lives
|
||||
through surveillance and the provisioning of everyday needs, from
|
||||
employment to how we get our internet utilities in the first place.
|
||||
There are rising income disparities across the nation, but also more
|
||||
specifically across everyone who can be considered a "tech worker":
|
||||
from a CEO to a software engineer to a contractor to a child slave
|
||||
mining cobalt in the Congo.
|
||||
</p>
|
||||
|
||||
<p class="mb-4">
|
||||
Technology contributes to gentrification both through the tech-enabled
|
||||
financialization of real estate as well as the gentrifying waves of
|
||||
tech workers moving into cities. Increased technical sophisication of
|
||||
militaries and carceral systems have created the first "AI genocide"
|
||||
in Palestine; increased militarization of borders such as the
|
||||
US-Mexico and the surveillance of migrants; increased police brutality
|
||||
worldwide, all disparately impacting people of the global majority.
|
||||
</p>
|
||||
|
||||
<p class="mb-4">
|
||||
All of these crises are enabled and worsened by technology companies.
|
||||
As tech workers of various kinds living in the imperial core, on
|
||||
stolen Coast Salish land covered by the broken Treaty of Point Elliot
|
||||
of 1855, we understand how our labor is contributing - directly or
|
||||
indirectly - to these oppressions, and seek to use our skills towards
|
||||
more liberatory ends.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<Footer />
|
||||
</main>
|
||||
</Layout>
|
||||
@@ -0,0 +1,71 @@
|
||||
---
|
||||
import Navbar from "../components/Navbar";
|
||||
import Footer from "../components/Footer";
|
||||
import Layout from "../layouts/Layout.astro";
|
||||
import "../styles/globals.css";
|
||||
---
|
||||
|
||||
<Layout>
|
||||
<main class="flex min-h-screen flex-col justify-between">
|
||||
<div>
|
||||
<Navbar client:load activePage="WhatWereWorkingOn" />
|
||||
<div class="pl-4 pr-4">
|
||||
<h1 class="pb-4 pt-4 text-3xl font-semibold">What We're Working On</h1>
|
||||
<div class="flex flex-row gap-8">
|
||||
<!-- <div class="justify-items-center">
|
||||
<img
|
||||
src="/assets/calendar.png"
|
||||
alt="stack of books"
|
||||
width="250"
|
||||
class="border pb-4"
|
||||
/>
|
||||
|
||||
<a
|
||||
href="/WhatWereWorkingOnPages/Calendar/"
|
||||
class="underline decoration-solid">Calendar</a
|
||||
>
|
||||
</div> -->
|
||||
|
||||
<div class="justify-items-center">
|
||||
<img
|
||||
src="/assets/pihole.jpeg"
|
||||
alt="pihole parts"
|
||||
width="250"
|
||||
class="border pb-4"
|
||||
/>
|
||||
<a
|
||||
href="/WhatWereWorkingOnPages/Pihole/"
|
||||
class="underline decoration-solid">Pihole Workshop</a
|
||||
>
|
||||
</div>
|
||||
|
||||
<div class="justify-items-center">
|
||||
<img
|
||||
src="/assets/this-website.png"
|
||||
alt="screenshot of this website including screenshot of this website including screenshot of this website..."
|
||||
width="250"
|
||||
class="border pb-4"
|
||||
/>
|
||||
|
||||
<a href="/" class="underline decoration-solid">This website!</a>
|
||||
</div>
|
||||
|
||||
<div class="justify-items-center">
|
||||
<img
|
||||
src="/assets/book-club.png"
|
||||
alt="stack of books"
|
||||
width="250"
|
||||
class="border pb-4"
|
||||
/>
|
||||
|
||||
<a
|
||||
href="/WhatWereWorkingOnPages/BookClub/"
|
||||
class="underline decoration-solid">Book Club</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<Footer />
|
||||
</main>
|
||||
</Layout>
|
||||
@@ -0,0 +1,48 @@
|
||||
---
|
||||
import Navbar from "../../components/Navbar";
|
||||
import Footer from "../../components/Footer";
|
||||
import Layout from "../../layouts/Layout.astro";
|
||||
import "../../styles/globals.css";
|
||||
---
|
||||
|
||||
<Layout>
|
||||
<main class="flex min-h-screen flex-col justify-between">
|
||||
<div>
|
||||
<Navbar client:load activePage="WhatWereWorkingOn" />
|
||||
<div class="pl-4 pr-4">
|
||||
<h1 class="pb-4 pt-4 text-3xl font-semibold">Book Club</h1>
|
||||
<p>Join our book club where we read and discuss books about technology, power, and resistance.</p>
|
||||
|
||||
<div class="flex flex-col gap-8">
|
||||
<div class="border p-6 rounded-lg">
|
||||
<h2 class="text-lg font-semibold mb-4 underline">Current Book</h2>
|
||||
<div class="flex flex-col gap-4">
|
||||
<div class="flex items-center gap-4">
|
||||
<p class="italic font-semibold">Common Circuits</p>
|
||||
<p class="text-sm text-gray-500">by Luis Felipe R. Murillo</p>
|
||||
</div>
|
||||
<p class="text-purple-600">Next meeting: 6/27</p>
|
||||
<p class="text-sm">Reading for next meeting: Introduction + Chapter 1 + Chapter 2</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="border p-6 rounded-lg">
|
||||
<h2 class="text-2xl font-semibold mb-4">Past Books</h2>
|
||||
<div class="flex flex-col gap-4">
|
||||
<ul class="list-disc pl-6">
|
||||
<li>Internet for the People</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="border p-6 rounded-lg">
|
||||
<a href="/" class="text-blue-500 hover:text-blue-700">
|
||||
<h2 class="text-2xl font-semibold mb-4">Join Us</h2>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<Footer />
|
||||
</main>
|
||||
</Layout>
|
||||
@@ -0,0 +1,21 @@
|
||||
---
|
||||
import Navbar from "../../components/Navbar";
|
||||
import Footer from "../../components/Footer";
|
||||
import Layout from "../../layouts/Layout.astro";
|
||||
import "../../styles/globals.css";
|
||||
---
|
||||
|
||||
<Layout>
|
||||
<main class="flex min-h-screen flex-col justify-between">
|
||||
<div>
|
||||
<Navbar client:load activePage="Calendar" />
|
||||
<div class="pl-4 pr-4">
|
||||
<h1 class="pb-4 pt-4 text-3xl font-semibold">Calendar</h1>
|
||||
<div class="flex flex-col gap-4">
|
||||
<p class="mb-4">See what we're doing next!</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<Footer />
|
||||
</main>
|
||||
</Layout>
|
||||
@@ -0,0 +1,19 @@
|
||||
---
|
||||
import Navbar from "../../components/Navbar";
|
||||
import Footer from "../../components/Footer";
|
||||
import Layout from "../../layouts/Layout.astro";
|
||||
import "../../styles/globals.css";
|
||||
---
|
||||
|
||||
<Layout>
|
||||
<main class="flex min-h-screen flex-col justify-between">
|
||||
<div>
|
||||
<Navbar />
|
||||
<div class="pl-4 pr-4">
|
||||
<h1 class="text-3xl font-semibold">Pihole</h1>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<Footer />
|
||||
</main>
|
||||
</Layout>
|
||||
@@ -1,41 +1,16 @@
|
||||
---
|
||||
import Navbar from "@/components/Navbar";
|
||||
import Footer from "@/components/Footer";
|
||||
import BigTechAlternatives from "@/components/BigTechAlternatives.astro";
|
||||
import WhatWereUpTo from "@/components/WhatWereUpTo.astro";
|
||||
import Layout from "@/layouts/Layout.astro";
|
||||
import "@/styles/globals.css";
|
||||
import Services from "@/components/Services.astro";
|
||||
---
|
||||
|
||||
<Layout>
|
||||
<main>
|
||||
<section class="sticky top-0">
|
||||
<main class="flex min-h-screen flex-col justify-between">
|
||||
<div>
|
||||
<Navbar client:load activePage="Home" />
|
||||
</section>
|
||||
|
||||
<section id="aboutus" class="scroll-m-20 px-4">
|
||||
<section>
|
||||
<h1 class="pb-4 text-3xl font-semibold">About Us</h1>
|
||||
|
||||
<p>
|
||||
We situate ourselves in our context - as Seattle residents and as
|
||||
users and creators of the technologies we aim to resist.
|
||||
</p>
|
||||
|
||||
<div class="my-8">
|
||||
<a
|
||||
href="/aboutus/"
|
||||
class="rounded-sm bg-[#fe4f60FF] px-6 py-3 font-semibold text-white transition-colors"
|
||||
>
|
||||
Read More
|
||||
</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2 class="pb-4 text-3xl font-semibold">Get Involved</h2>
|
||||
|
||||
<div class="pl-4 pr-4 text-xl leading-[2]">
|
||||
<p>
|
||||
Do you believe technology can and should be used for good? Do you
|
||||
think a democratic internet could liberate us? Join us!
|
||||
@@ -44,34 +19,18 @@ import Services from "@/components/Services.astro";
|
||||
<p>We share this vision, and we want to work together to achieve it.</p>
|
||||
|
||||
<div class="my-8">
|
||||
<a
|
||||
href="https://shlink.resisttechmonopolies.online/HNrZG"
|
||||
class="rounded-sm bg-[#80aaff] px-6 py-3 font-semibold text-white transition-colors"
|
||||
<a
|
||||
href="https://shlink.resisttechmonopolies.online/HNrZG"
|
||||
class="px-6 py-3 bg-[#80aaff] text-white font-semibold rounded-md hover:bg-[#6090e0] transition-colors"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
Fill Out Our Interest Form!
|
||||
</a>
|
||||
</div>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section id="whatwereupto" class="scroll-m-20 px-4">
|
||||
<WhatWereUpTo />
|
||||
</section>
|
||||
|
||||
<section id="services" class="my-8 scroll-m-20 px-4">
|
||||
<Services />
|
||||
</section>
|
||||
|
||||
<!-- <section id="calendar" class="scroll-m-20 my-8">
|
||||
TODO calendar
|
||||
</section> -->
|
||||
|
||||
<section id="bigtechalternatives" class="my-8 scroll-m-20">
|
||||
<BigTechAlternatives />
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<Footer />
|
||||
</main>
|
||||
</Layout>
|
||||
</main></Layout
|
||||
>
|
||||
|
||||
@@ -1,291 +0,0 @@
|
||||
---
|
||||
import Navbar from "../../components/Navbar";
|
||||
import Footer from "../../components/Footer";
|
||||
import Layout from "../../layouts/Layout.astro";
|
||||
import "../../styles/globals.css";
|
||||
---
|
||||
|
||||
<Layout>
|
||||
<main class="px-4 flex min-h-screen flex-col justify-between">
|
||||
<div>
|
||||
<section class="sticky top-0">
|
||||
<Navbar client:load activePage="WhatWereUpTo" />
|
||||
</section>
|
||||
|
||||
<div class="pl-4 pr-4">
|
||||
<h1 class="pb-4 pt-4 text-3xl font-semibold">Pet Calendar</h1>
|
||||
<div>
|
||||
We created a pet calendar with 12 beautiful pictures of RTM's animal
|
||||
friends.
|
||||
<p class="pb-2">
|
||||
Each month, our pets will share with you with a different way you
|
||||
can Resist Big Tech Monopolies!
|
||||
</p>
|
||||
<p class="pb-2">
|
||||
If you'd like to request a calendar, email us at
|
||||
besties@resisttechmonopolies.online
|
||||
</p>
|
||||
<div class="justify-items-center">
|
||||
<img
|
||||
src="/assets/pet-calendar-2026-cover.jpg"
|
||||
alt="pihole parts"
|
||||
width="500"
|
||||
class="border"
|
||||
/>
|
||||
</div>
|
||||
<div></div>
|
||||
</div>
|
||||
<h1 class="pb-4 pt-4 text-2xl font-semibold">
|
||||
2026 Monthly RTM Tutorials
|
||||
</h1>
|
||||
|
||||
<div class="flex flex-col gap-8">
|
||||
<div class="rounded-lg border p-6">
|
||||
<h2 class="mb-4 text-2xl font-semibold" id="January">January</h2>
|
||||
<div>
|
||||
<p class="mb-2">
|
||||
Try out Mastadon for algorithmless social media that won't sell
|
||||
your data!
|
||||
</p>
|
||||
<a class="mb-2 underline" href="https://joinmastodon.org/"
|
||||
>Join Mastadon!
|
||||
</a>
|
||||
|
||||
<p class="mb-2">Difficulty rating: 🌶️/5</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col gap-8">
|
||||
<div class="rounded-lg border p-6">
|
||||
<h2 class="mb-4 text-2xl font-semibold" id="February">February</h2>
|
||||
<div>
|
||||
<p class="mb-2">
|
||||
Learn about hosting your own instances of tech services to
|
||||
protect your data!
|
||||
</p>
|
||||
<a
|
||||
class="mb-2 underline"
|
||||
href="https://www.xda-developers.com/tips-for-self-hosting-beginners/"
|
||||
>Beginner's Guide to Self-Hosting!
|
||||
</a>
|
||||
|
||||
<p class="mb-2">Difficulty rating: 🌶️🌶️🌶️🌶️/5</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col gap-8">
|
||||
<div class="rounded-lg border p-6">
|
||||
<h2 class="mb-4 text-2xl font-semibold" id="March">March</h2>
|
||||
<div>
|
||||
<p class="mb-2">Try out Calibre to read Amazon-free e-books!</p>
|
||||
<a
|
||||
class="mb-2 underline"
|
||||
href="https://tutorials.mediaket.net/software-tutorials/calibre-how-to-use-it.html"
|
||||
>Get Started with Calibre!
|
||||
</a>
|
||||
|
||||
<p class="mb-2">Difficulty rating: 🌶️🌶️/5</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col gap-8">
|
||||
<div class="rounded-lg border p-6">
|
||||
<h2 class="mb-4 text-2xl font-semibold" id="April">April</h2>
|
||||
<div>
|
||||
<p class="mb-2">
|
||||
Thinking of switching off Windows or MacOS? Try Linux for a
|
||||
super customizable, privacy-first operating system!
|
||||
</p>
|
||||
<a
|
||||
class="mb-2 underline"
|
||||
href="https://www.geeksforgeeks.org/linux-unix/30-days-of-linux/"
|
||||
>30 Days of Linux for Beginners!
|
||||
</a>
|
||||
|
||||
<p class="mb-2">Difficulty rating: 🌶️🌶️🌶️🌶️/5</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col gap-8">
|
||||
<div class="rounded-lg border p-6">
|
||||
<h2 class="mb-4 text-2xl font-semibold" id="May">May</h2>
|
||||
<div>
|
||||
<p class="mb-2">
|
||||
Try going outside and repping some protest fashion this Spring!
|
||||
</p>
|
||||
<a
|
||||
class="mb-2 underline"
|
||||
href="https://graziamagazine.com/me/articles/history-keffiyeh-palestine/"
|
||||
>Learn the history and meaning of the keffiyeh!
|
||||
</a>
|
||||
|
||||
<p class="mb-2">Difficulty rating: 🌶️/5</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col gap-8">
|
||||
<div class="rounded-lg border p-6">
|
||||
<h2 class="mb-4 text-2xl font-semibold" id="June">June</h2>
|
||||
<div>
|
||||
<p class="mb-2">
|
||||
Try out Ente for a privacy-friendly, open-source photos hosting
|
||||
platform!
|
||||
</p>
|
||||
<a
|
||||
class="mb-2 underline"
|
||||
href="https://web.archive.org/web/20260108185516/https://www.androidauthority.com/ente-photos-hands-on-3542198/"
|
||||
>In-depth overeview of Ente Photos migration!
|
||||
</a>
|
||||
|
||||
<p class="mb-2">Difficulty rating: 🌶️/5</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col gap-8">
|
||||
<div class="rounded-lg border p-6">
|
||||
<h2 class="mb-4 text-2xl font-semibold" id="July">July</h2>
|
||||
<div>
|
||||
<p class="mb-2">
|
||||
Try installing your own Pi Hole on your home wifi network to
|
||||
block ad and malware servers!
|
||||
</p>
|
||||
<a
|
||||
class="mb-2 underline"
|
||||
href="https://protasm.com/blogs/news/an-extensive-tutorial-on-how-to-setup-a-pi-hole"
|
||||
>Extensive PiHole Tutorial!
|
||||
</a>
|
||||
|
||||
<p class="mb-2">Difficulty rating: 🌶️🌶️🌶️🌶️🌶️/5</p>
|
||||
</div>
|
||||
<hr class="mb-4" />
|
||||
<p class="mb-2">Alternative: Install an adblocker!</p>
|
||||
<a class="mb-2 underline" href="https://adblockplus.org/"
|
||||
>Install Adblock Plus!
|
||||
</a>
|
||||
|
||||
<p class="mb-2">Difficulty rating: 🌶️/5</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col gap-8">
|
||||
<div class="rounded-lg border p-6">
|
||||
<h2 class="mb-4 text-2xl font-semibold" id="August">August</h2>
|
||||
<div>
|
||||
<p class="mb-2">
|
||||
Try out DuckDuckGo as a privacy-friendly alternative to Google
|
||||
search and Chrome!
|
||||
</p>
|
||||
<a class="mb-2 underline" href="https://duckduckgo.com/"
|
||||
>Download Duck Duck Go!
|
||||
</a>
|
||||
|
||||
<p class="mb-2">Difficulty rating: 🌶️/5</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col gap-8">
|
||||
<div class="rounded-lg border p-6">
|
||||
<h2 class="mb-4 text-2xl font-semibold" id="September">
|
||||
September
|
||||
</h2>
|
||||
<div>
|
||||
<p class="mb-2">
|
||||
Instead of relying on surveillance for safety, try making
|
||||
friends with your neighbors!
|
||||
</p>
|
||||
<a
|
||||
class="mb-2 underline"
|
||||
href="https://www.youtube.com/watch?v=1-Xl6dhDV3Q"
|
||||
>
|
||||
How to Build Radical Community!
|
||||
</a>
|
||||
|
||||
<p class="mb-2">Difficulty rating: 🌶️🌶️🌶️/5</p>
|
||||
(hey making friends in Seattle is hard, okay?)
|
||||
</div>
|
||||
<hr class="mb-4" />
|
||||
<p class="mb-2">
|
||||
Alternative: Neighbor Unions (buliding community power!)
|
||||
</p>
|
||||
<a
|
||||
class="mb-2 underline"
|
||||
href="https://social-ecology.org/wp/neighbor-union-cohort/"
|
||||
>Learn about Neighbor Unions!
|
||||
</a>
|
||||
|
||||
<p class="mb-2">Difficulty rating: 🌶️🌶️🌶️/5</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col gap-8">
|
||||
<div class="rounded-lg border p-6">
|
||||
<h2 class="mb-4 text-2xl font-semibold" id="October">October</h2>
|
||||
<div>
|
||||
<p class="mb-2">
|
||||
Try out JellyFin to host your own media server and share with
|
||||
friends. You can break up with Netflix, Hulu, Disney+, and more!
|
||||
</p>
|
||||
<a
|
||||
class="mb-2 underline"
|
||||
href="https://jellyfin.org/docs/general/quick-start/"
|
||||
>Quickstart for JellyFin!
|
||||
</a>
|
||||
|
||||
<p class="mb-2">Difficulty rating: 🌶️🌶️🌶️🌶️/5</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col gap-8">
|
||||
<div class="rounded-lg border p-6">
|
||||
<h2 class="mb-4 text-2xl font-semibold" id="November">November</h2>
|
||||
<div>
|
||||
<p class="mb-2">
|
||||
Try out Meet.coop as an open-source, privacy-friendly, and renewable
|
||||
energy-powered alternative to Zoom and Hangouts!
|
||||
</p>
|
||||
<a class="mb-2 underline" href="https://www.meet.coop/"
|
||||
>Make a Meet.coop account!
|
||||
</a>
|
||||
|
||||
<p class="mb-2">Difficulty rating: 🌶️🌶️/5</p>
|
||||
</div>
|
||||
<hr class="mb-4" />
|
||||
|
||||
<p class="mb-2">Free alternative: Jitsi</p>
|
||||
<a class="mb-2 underline" href="https://meet.jit.si/"
|
||||
>Start a Meeting with Jitsi!
|
||||
</a>
|
||||
|
||||
<p class="mb-2">Difficulty rating: 🌶️/5</p>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</Layout>
|
||||
<div class="flex flex-col gap-8">
|
||||
<div class="rounded-lg border p-6">
|
||||
<h2 class="mb-4 text-2xl font-semibold" id="December">December</h2>
|
||||
<div>
|
||||
<p class="mb-2">
|
||||
Try out Radicale as a privacy-friendly, open-source alternative to
|
||||
Google Calendar and Outlook!
|
||||
</p>
|
||||
<a
|
||||
class="mb-2 underline"
|
||||
href="https://radicale.org/master.html#simple-5-minute-setup"
|
||||
>Setting up Radicale Tutorial!
|
||||
</a>
|
||||
|
||||
<p class="mb-2">Difficulty rating: 🌶️🌶️🌶️🌶️🌶️/5</p>
|
||||
</div>
|
||||
|
||||
<hr class="mb-4" />
|
||||
<p class="mb-2">Alternative: Proton Calendar</p>
|
||||
<a class="mb-2 underline" href="https://calendar.proton.me/"
|
||||
>Switch to Proton Calendar!
|
||||
</a>
|
||||
|
||||
<p class="mb-2">Difficulty rating: 🌶️/5</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<Footer />
|
||||
@@ -1,51 +0,0 @@
|
||||
---
|
||||
import Navbar from "../../components/Navbar";
|
||||
import Footer from "../../components/Footer";
|
||||
import Layout from "../../layouts/Layout.astro";
|
||||
import "../../styles/globals.css";
|
||||
---
|
||||
|
||||
<Layout>
|
||||
<main class="flex min-h-screen flex-col justify-between px-4">
|
||||
<div>
|
||||
<section class="sticky top-0">
|
||||
<Navbar client:load activePage="WhatWereUpTo" />
|
||||
</section>
|
||||
|
||||
<div class="px-4">
|
||||
<h1 class="pb-4 pt-4 text-3xl font-semibold">Book Club</h1>
|
||||
<p class="mb-4">
|
||||
We read and discuss books about technology, power, and resistance. If
|
||||
you have book suggestions, fill out the interest form on our <a
|
||||
href="/"
|
||||
class="underline">website homepage</a
|
||||
> and let us know when we get in contact with you!
|
||||
</p>
|
||||
|
||||
<div class="flex flex-col gap-8">
|
||||
<div class="rounded-lg border p-6">
|
||||
<h2 class="mb-4 text-2xl font-semibold">Current Book</h2>
|
||||
<div>
|
||||
Teaching Community Technology Handbook - Detroit Community Technology
|
||||
Project (read for free <a
|
||||
class="underline"
|
||||
href="https://detroitcommunitytech.org/?q=teachcommtech"
|
||||
>here
|
||||
</a>)
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="rounded-lg border p-6">
|
||||
<h2 class="mb-4 text-2xl font-semibold">Past Books</h2>
|
||||
<ul class="list-disc pl-6">
|
||||
<li>Race After Technology - Ruha Benjamin</li>
|
||||
<li>Common Circuits - Luis Felipe R. Murillo</li>
|
||||
<li>Internet for the People - Ben Tarnoff</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<Footer />
|
||||
</main>
|
||||
</Layout>
|
||||
@@ -1,27 +0,0 @@
|
||||
---
|
||||
import Navbar from "../../components/Navbar";
|
||||
import Footer from "../../components/Footer";
|
||||
import Layout from "../../layouts/Layout.astro";
|
||||
import { ZineGrid } from "../../components/zines/ZineGrid";
|
||||
import "../../styles/globals.css";
|
||||
---
|
||||
|
||||
<Layout>
|
||||
<main class="px-4 flex min-h-screen flex-col justify-between">
|
||||
<div>
|
||||
<section class="sticky top-0">
|
||||
<Navbar client:load activePage="WhatWereUpTo" />
|
||||
</section>
|
||||
<div class="px-4">
|
||||
<h1 class="pb-4 pt-4 text-3xl font-semibold">Zines</h1>
|
||||
<p class="mb-6">
|
||||
We create and share zines about technology, power, and resistance. You
|
||||
are welcome to download the printable version to fold and distribute!
|
||||
</p>
|
||||
|
||||
<ZineGrid client:load />
|
||||
</div>
|
||||
</div>
|
||||
<Footer />
|
||||
</main>
|
||||
</Layout>
|
||||
@@ -1,79 +0,0 @@
|
||||
---
|
||||
import { Download } from "lucide-react";
|
||||
import Navbar from "../../../components/Navbar";
|
||||
import Footer from "../../../components/Footer";
|
||||
import Layout from "../../../layouts/Layout.astro";
|
||||
import { ShareZineButton } from "../../../components/zines/ShareZineButton";
|
||||
import { buttonVariants } from "../../../components/ui/button";
|
||||
import { zines, type Zine } from "../../../data/zines";
|
||||
import "../../../styles/globals.css";
|
||||
|
||||
export async function getStaticPaths() {
|
||||
return zines.map((zine) => ({
|
||||
params: { id: zine.id },
|
||||
props: { zine },
|
||||
}));
|
||||
}
|
||||
|
||||
interface Props {
|
||||
zine: Zine;
|
||||
}
|
||||
|
||||
const { zine } = Astro.props;
|
||||
---
|
||||
|
||||
<Layout>
|
||||
<main class="px-4 flex min-h-screen flex-col justify-between">
|
||||
<div>
|
||||
<section class="sticky top-0">
|
||||
<Navbar client:load activePage="OurProjects" />
|
||||
</section>
|
||||
|
||||
<div class="px-4">
|
||||
<a
|
||||
href="/projects/zines"
|
||||
class="inline-block pb-4 pt-4 text-sm underline"
|
||||
>
|
||||
← Back to all zines
|
||||
</a>
|
||||
|
||||
<div class="mx-auto max-w-3xl">
|
||||
<h1 class="text-2xl font-semibold">{zine.title}</h1>
|
||||
{
|
||||
zine.description && (
|
||||
<p class="mt-1 text-sm text-muted-foreground">
|
||||
{zine.description}
|
||||
</p>
|
||||
)
|
||||
}
|
||||
|
||||
<div class="mt-4 flex gap-2">
|
||||
<ShareZineButton client:load zineId={zine.id} />
|
||||
<a
|
||||
href={zine.printablePdf}
|
||||
download
|
||||
class={buttonVariants({ variant: "outline", size: "sm" })}
|
||||
>
|
||||
<Download />
|
||||
Printable
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col gap-4 py-6">
|
||||
{
|
||||
zine.pages.map((page, i) => (
|
||||
<img
|
||||
src={page}
|
||||
alt={`Page ${i + 1} of ${zine.title}`}
|
||||
loading={i === 0 ? "eager" : "lazy"}
|
||||
class="h-auto w-full rounded bg-white shadow-sm"
|
||||
/>
|
||||
))
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<Footer />
|
||||
</main>
|
||||
</Layout>
|
||||
@@ -1,7 +1,6 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
@layer base {
|
||||
:root {
|
||||
--background: 0 0% 100%;
|
||||
@@ -30,7 +29,6 @@
|
||||
--chart-5: 27 87% 67%;
|
||||
--radius: 0.5rem;
|
||||
}
|
||||
|
||||
.dark {
|
||||
--background: 0 0% 3.9%;
|
||||
--foreground: 0 0% 98%;
|
||||
@@ -58,12 +56,10 @@
|
||||
--chart-5: 340 75% 55%;
|
||||
}
|
||||
}
|
||||
|
||||
@layer base {
|
||||
* {
|
||||
@apply border-border;
|
||||
}
|
||||
|
||||
body {
|
||||
@apply bg-background text-foreground;
|
||||
}
|
||||
@@ -74,20 +70,8 @@
|
||||
src: url("/fonts/Geist[wght].ttf") format("truetype");
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "GeistMono";
|
||||
src: url("/fonts/GeistMono[wght].ttf") format("truetype");
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
.hamburger {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.hamburger .line {
|
||||
display: block;
|
||||
width: 36px;
|
||||
height: 2px;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||