Compare commits

...

8 Commits

Author SHA1 Message Date
Case Duckworth 8c21084565 Merge branch 'zola' 2021-11-21 17:31:45 -06:00
Case Duckworth 90f04416e1 Add generated timestamp 2021-11-21 16:52:32 -06:00
Case Duckworth 5287ad1964 Delete public/
should be ignored now
2021-11-21 13:51:03 -06:00
Case Duckworth b27960f0de Other stuff 2021-11-21 13:50:31 -06:00
Case Duckworth 930736ccbb Update index to include the bits
bits are in templates/index/*.html
they can't go into content/ because ... *reasons*
2021-11-21 13:49:45 -06:00
Case Duckworth 5bd0ae4fd1 Add donate page 2021-11-21 13:17:45 -06:00
Case Duckworth e2f2c21a25 Many other changes
... I did the thing again.  Here's a summary:

- added docs/*
- changed templates
- added shortcodes
- see https://tildegit.org/breadpunk/scripts/src/branch/master/site/bin for
the script that updates these
- update config
- update .gitignore
- and more! ...
2021-11-21 12:33:15 -06:00
Case Duckworth 0b9aa0ac9f Initial zola commit
Deleted all unk-related business, ran `zola init`, and forgot to commit for a
while.  What I've done in since then is as follows:

- write templates with inheritance
  - base template is "base.html". {index,page}.html extend base. section.html
    extends index.
  - also wrote "river.html", which extends section and instead of listing
    posts, expands them all in the page itself.
  - none of these templates do pagination yet.
- port index, news, joining from old site
- add style (still CSS but with SCSS extension), favicon, and other images.

I think that's it.  There might be a few more things.
2021-11-20 17:53:31 -06:00
53 changed files with 867 additions and 432 deletions

3
.gitignore vendored
View File

@ -1 +1,2 @@
O
public
#.*

24
Dp
View File

@ -1,24 +0,0 @@
{
"name": "breadpunk.club",
"url": "https://breadpunk.club",
"signup_url": "https://breadpunk.club/join",
"user_count": "$(getent group|grep '^bakers:'|cut -d: -f4|tr , '\n'|wc -l)",
"want_users": true,
"admin_email": "breadpunk@acdw.net",
"description": "We are a shared Unix computer focused on bread: baking it, eating it, using it as fiat currency in the event of a cataclysm, that sort of thing.",
"users": [
$(lastuser="$(getent group|grep '^bakers:'|cut -d: -f4|tr , '\n'|tail -n1)"
for user in $(getent group|grep '^bakers:'|cut -d: -f4|tr , '\n'); do
cat <<-ENDUSER
{
"username": "$user",
"title": "$(awk '/<title>/{gsub("</?title>","");
sub(/^[ ]/,"");sub(/[ ]$/,"");
print;}' /home/$user/public_html/index.html)",
"mtime": "$(stat -c %Y /home/$user/public_html/index.html)"
}$( [ "$lastuser" = "$user" ] || printf ',' )
ENDUSER
done
)
]
}

View File

@ -1,19 +0,0 @@
title docs
$([ -d "$BREADDOCS" ] &&
for F in $(find "$BREADDOCS" -path "$BREADDOCS/.git" -prune -o -type f -print); do
case "$F" in
*manifesto.md) ;;
*man*) continue;;
esac
l "doc: $F"
dir="$UNKO/docs/$(NN)"
rm -rf "$dir"
mkdir -p "$dir"
X "$UNKL" > "$dir/index.html"
cat <<ENDOFITEM
- [$(M title)](/docs/$(NN))
ENDOFITEM
done
)

View File

@ -1,11 +0,0 @@
title donate
breadpunk.club is hosted on a Digital Ocean droplet that, as of this writing ($(date)), is
**6.00 USD a month.**
While I ([~breadw](/~breadw/)) can swing it for now, it'd be nice to have some help.
To that end,
I've set up a [Liberapay site](https://liberapay.com/acdw/) to accept donations.
**All donations received will fund breadpunk.club's hosting requirements.**
Thanks!

View File

@ -1,9 +0,0 @@
id joining
title join us!
we're still a pretty small server:
we only have $(ls /home|wc -l) bakers!
we're all pretty friendly and would love to have you along.
check out our [joining page](/join)
to apply for membership to breadpunk.club.

View File

@ -1,11 +0,0 @@
title news
id news
<ul>
$(for art in $(find "$BREADNEWS" -path "$BREADNEWS/.git" -prune -o -type f -print | sort -nr|head -n3); do
cat <<-ENDOFARTICLE
<li>$(M date "$art"|defstr $(NN "$art")|wrapstr span class="time")
<a href="/news#$(NN "$art")">$(M title "$art")</a></li>
ENDOFARTICLE
done)
</ul>

View File

@ -1,14 +0,0 @@
title bakers
subtitle in order of most recent bake
id bakers
<ul>
$(for u in $(
find /home/*/public_html -maxdepth 0 -printf '%T@\t%p\n'|
sort -nr |
cut -f2- |
sed 's,/home/\(.*\)/public_html,\1,')
do
p "<li><a href=\"/~$u\">~$u</a></li>"
done)
</ul>

View File

@ -1,16 +0,0 @@
title joining
breadpunk.club is open to anyone. it's suggested that you look at our
[manifesto](/docs/manifesto) and make sure it's something you're interested in,
as well as our [code of conduct](/docs/code-of-conduct) to make sure you agree
with our terms.
to become a baker, just send an email to [breadw](/~breadw) with your SSH key (attached, please!),
desired username (must be bread-oriented), realname (can be your “normal”
username), and what shell youd like to use (we have
$(cat /etc/shells|
awk -F/ '/^#/{next}/tmux$/{next}/screen$/{next}
{if (!match(shs, $NF)) shs = (shs ? shs", " : shs) $NF}
END{sub(/[^,]+$/," and&",shs);print shs}')).
well see you around the bakery!

View File

@ -1,12 +0,0 @@
title news
$(for art in $(find "$BREADNEWS" -path "$BREADNEWS/.git" -prune -o -type f -print | sort -nr); do
l "news: $art"
cat <<-ENDOFARTICLE
<div class="article" id="$(NN "$art")">
<div class="header">$(M title "$art"|wrapstr h1)
$(M date "$art"|wrapstr span class="time")
$(C "$art"|X|$DISCOUNT)
</div>
ENDOFARTICLE
done)

View File

@ -1,10 +0,0 @@
title recipes
$(mkdir "$UNKO/recipes")
<ul>
$(for r in /bread/cookbook/html/*; do
l "recipe: $r"
echo "<li><a href=\"/recipe/$(NN "$r")\">$(NN "$r")</a></li>"
done)
</ul>

41
L
View File

@ -1,41 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<!-- updated $(date) -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="a collaborative bread-positive space">
<title>$(M title|addstr ' | ')BREADPUNK</title>
<link rel="stylesheet" media="screen" type="text/css"
href="https://fontlibrary.org/face/cmu-typewriter" >
<link rel="stylesheet" type="text/css" href="/S/breadpunk.css" >
<link rel="icon" type="image/png" href="/S/breadpunk.png">
</head>
<body>
<div id="header">
<div class="nav">
$(cat header.txt)
$([ "$(N)" = index ] || {
cat <<-ENDHEADER
(#) <a href="/">home</a>
ENDHEADER
})
</div>
<marquee id="users">
$(./update-footer.awk footer.txt | sed 's/#.*//')
</marquee>
</div>
<div id="main">
<div class="header">
$(M title | wrapstr h1)
$(M subtitle | wrapstr p class=subtitle)
$(M author | wrapstr p class=author)
</div>
$(C|X|$DISCOUNT)
</div>
<div id="footer">
</div>
</body>
</html>
<!-- vim: ft=unk
-->

View File

@ -1,48 +0,0 @@
# breadpunk.club
DEBUG ?= false
BREADNEWS ?= /bread/news
BREADDOCS ?= /bread/docs
RSYNC_EXCLUDES := \
.well-known \
old \
node_modules \
wip
RSYNC := rsync \
--verbose \
--archive \
--compress \
--checksum \
--delete \
$(foreach e,$(RSYNC_EXCLUDES),--exclude=$(e))
SERVE ?= php -S 127.0.0.1:2733 -t O/
WATCH := I/* I/*/* \
unk lib.sh L *.txt \
$(BREADNEWS)/* $(BREADDOCS)/*
watch:
@echo entr -d -r $(MAKE) _serve
@while :; do\
(ls -d $(WATCH)) | \
entr -d -r $(MAKE) _serve;\
done
_serve: build
@pkill php||:
$(SERVE)
publish: build
$(RSYNC) O/ /var/www/breadpunk.club/
# push: publish
# @test -z "$$(git status --porcelain)" && \
# { echo "Pushing changes..."; MAKE_PUSH=1 git push; } || \
# echo "Commit changes!"
build:
DEBUG=$(DEBUG) BREADNEWS=$(BREADNEWS) BREADDOCS=$(BREADDOCS) ./unk
PHONY: build _serve publish watch

18
config.toml Normal file
View File

@ -0,0 +1,18 @@
# The URL the site will be built for
base_url = "https://breadpunk.club"
# Whether to automatically compile all Sass files in the sass directory
compile_sass = true
# Whether to build a search index to be used later on by a JavaScript library
build_search_index = false
title = "BREADPUNK"
[markdown]
# Whether to do syntax highlighting
# Theme can be customised by setting the `highlight_theme` variable to a theme supported by Zola
highlight_code = false
[extra]
# Put all your custom variables here

View File

@ -1,5 +1,7 @@
title BREADPUNK
subtitle baking the net since 2020
+++
title = "BREADPUNK"
description = "baking the net since 2020"
+++
Hello, and welcome to **breadpunk.club**.
We are a shared Unix computer focused on bread:
@ -13,13 +15,3 @@ in our [manifesto](/docs/manifesto),
namely *anti-commoditization*,
*self-reliance*,
and *radical cooperation*.
$(for s in "$UNKI/index_sections"/*; do
cat <<-ENDSECTION
<div class="section" id="$(M id "$s")">
<div class="header">$(M title "$s" |wrapstr h1)$(M subtitle "$s" |wrapstr p class=subtitle)
</div>$(C "$s" | X | $DISCOUNT)
</div>
ENDSECTION
done
)

4
content/docs/_index.md Normal file
View File

@ -0,0 +1,4 @@
+++
title = "docs"
sort_by = "title"
+++

View File

@ -0,0 +1,20 @@
+++
title = "breadtimer"
author = "sauerteig"
+++
`breadtimer` is a simple timer that notifies you when your bread needs
to be taken out of the oven. Before it turns to ash.
## using breadtimer
`breadtimer [option] time`
The only option is -h for help. The baking time is given in minutes.
## see also
`man breadtimer`

View File

@ -0,0 +1,127 @@
+++
title = "code of conduct"
author = "breadw"
+++
> this code of conduct is based on
> [tilde.town's](http://tilde.town/wiki/conduct.html),
> which is in turn based on the
> [Citizen Code of Conduct](http://citizencodeofconduct.org/),
> released under the
> [CC-BY-SA](http://creativecommons.org/licenses/by-sa/3.0/<Paste>)
> license.
> as such, this code of conduct is released under the same terms.
# purpose
a primary goal of breadpunk.club is to be as inclusive to the largest number
of contributors, with the most varied and diverse backgrounds, as possible. as
such, we are committed to providing a friendly, safe and welcoming environment
for all, regardless of gender, sexual orientation, ability, ethnicity,
socioeconomic status, and religion (or lack thereof).
this code of conduct outlines our expectations for all those who participate
in our community, as well as the consequences for unacceptable behavior.
we invite all those who participate in breadpunk.club to help us create safe
and positive experiences for everyone.
# vision of breadpunk.club
**breadpunk.club exists to provide a safe, non-judgmental, and fun place to
explore creative projects and crafts of all kinds and to see an intentional
digital community.**
we are here to redefine the boundaries and meanings of community in a
post-google era of the internet. we are here to provide and to create for each
other a space free from the constant consumerist messaging the wider internet
inundates us with. in the same way the simple act of making our own bread
frees us from the market forces that cause needless suffering and
commoditization of human life, interacting on tilde servers such as
breadpunk.club frees us from the consumer-producer dichotomy inherent in the
wider culture.
for more information on breadpunk.club's vision, refer to the
[manifesto](/docs/manifesto).
to that end, breadpunk.club strives to be a radically inclusive community
where people of all backgrounds and all technological and gastronomical
experience levels can come together for peer education, to delight in one
another's creations, and to make good conversation.
# expected behavior
the following behaviors are expected and requested of all community members:
- participate in an authentic and active way. in doing so, you contribute to
the health and longevity of this community.
- exercise consideration and respect in your speech and actions.
- attempt collaboration before conflict.
- refrain from demeaning, discriminatory, or harassing behavior and speech.
- if anyone asks you to stop a particular kind of behavior, always err on the
side of respecting their wishes. if you believe their request is
unreasonable or unfair, ask an admin, but don't respond with hostility.
- be mindful of your surroundings and of your fellow participants. alert
community leaders if you notice a dangerous situation, someone in distress,
or violations of this code of conduct, even if they seem inconsequential.
# unacceptable behavior
unacceptable behaviors include: intimidating, harassing, abusive,
discriminatory, derogatory, or demeaning speech or actions by any
breadpunk.club user online, at any related events, or in one-on-one
communications carried out in the conduct of breadpunk.club related projects.
community event venues -- physical or digital -- may be shared with members of
the public, so please be respectful to everyone at those locations.
harassment includes the following: harmful or prejudicial verbal or written
comments related to gender, age, sexual orientation, race, religious choices,
or disability; inappropriate use of nudity and/or sexual images in public
places (like your `~/public_html` pages); deliberate intimidation, stalking or
following; harassing recording; sustained disruption of the work of others;
and unwelcome sexual attention.
# consequences of unacceptable behavior
unacceptable behavior from any community member, including those with decision
making authority or sudo access, will not be tolerated.
anyone asked to stop unacceptable behavior is expected to comply immediately.
if a community member engages in unacceptable behavior, the breadpunk.club
admins my take any action they deem appropriate, up to and including a
temporary ban or permanent expulsion from breadpunk.club (meaning your account
would be revoked and ~ deleted) without warning.
# if you witness or are subject to unacceptable behavior
if you are subject to or witness of unacceptable behavior, or have any other
concerns, please see the contact information below.
additionally, help engaging with law enforcement is always available.
# addressing grievances
if you feel you have been falsely or unfairly accused of violating this code
of conduct, use the contact information below to send a concise description of
your grievance.
# scope
we expect all breadpunk.club members to abide by this code of conduct while
- engaging with others locally on the server
- publishing content hosted on breadpunk.club
- engaging in community activities, whether in cyber- or bread-space
# contact information
breadpunk.club admin
- [~breadw](/~breadw) @ **breadpunk at acdw dot net**
volunteer and other admins
- [~lucitoast](/~lucitoast) @ [contact info](https://tilde.town/~lucidiot/contact.html)
admins can be reached privately
- on IRC using `/msg breadw hi`
- via local breadpunk.club email, e.g. `breadw@breadpunk.club`
- or via normal email at the addresses above

View File

@ -1,7 +1,10 @@
title history
+++
title = "history"
author = "breadw"
+++
breadpunk.club was envisioned by some folx over at
[tilde.town](https://tilde.town) as a new tilde server,
where we could talk about bread all day.
for more information, see our [manifesto](/manifesto/).
for more information, see our [manifesto](/docs/manifesto/).

102
content/docs/irc.md Normal file
View File

@ -0,0 +1,102 @@
+++
title = "IRC"
author = "breadw and lucitoast"
+++
## what is IRC
Internet Relay Chat has been around for like, a long time.
I won't bore you with all the details; that's what
[Wikipedia](https://en.wikipedia.org/wiki/Internet_Relay_Chat)
is for.
however, here at breadpunk.club we use IRC a lot.
we chat on it,
we're eventually going to have bots with it,
as well as inside jokes, and all sorts of fun stuff.
the breadpunk club uses the InspIRCd server,
which probably doesn't mean much,
unless you're an admin,
but there's the info.
## connecting to IRC
to join on IRC, just run `weechat` or `irssi` from
your [ssh](/docs/ssh)'d terminal.
you might also want to set up a [magic tunnel](/docs/magic-tunnel)
so you can use IRC from your own computer.
here's a list of channels we have on breadpunk.club:
- `#bread`
## registering your nick
to prevent others from using your nickname, and to allow registering
channels, setting your pronouns or other contact info, or receiving memos
from other users, you will need to register your nickname. it's easy:
```
/msg NickServ REGISTER [password] [username]@breadpunk.club
```
you should use your breadpunk username here as this is your local e-mail
address, which will be used to send you a confirmation code. The e-mail with
your confirmation code will tell you how to confirm your registration.
later, to log in, you can use `/msg NickServ IDENTIFY [password]`.
### your personal info
when you are registered, anyone can type in `/msg NickServ INFO [yourname]`
and get a little bit of info about who you are. we created a few custom commands
so that you can set some more useful metadata about you:
* `MSN`: your msn messenger contact info.
if you set this, you are probably using a custom server;
we encourage you to also put a link to your msn server so that others can join you.
* `FEDIVERSE`: your fediverse account(s).
* `URL`: whatever URL you want; usually a link to your personal website.
* `PRONOUNS`: the pronouns one should use to talk about you.
* `ICE`: **i**n **c**ase of **e**mergency - the kind of info we could use
if we wanted to make sure you are doing okay: how to get in touch with someone
that can find you irl or help you out in any way.
* `GREET`: a rather well known
all of this information is of course optional, though the use of `PRONOUNS` and `ICE`
is encouraged. you can set all of this using the following command:
```
/msg NickServ SET PRONOUNS she/her
```
same goes for all of the other items mentioned above. then, with `INFO`,
other users will see something along the lines of `PRONOUNS: she/her`.
use `/msg NickServ HELP` and `HELP SET` to learn more about all of this.
### auto-login on weechat
to automatically log-in to NickServ on weechat, you can set weechat to execute
`IDENTIFY` on connect with:
```
/set irc.server.[servername].command "/msg NickServ IDENTIFY [password]"
```
this however poses the issue of storing your password unencrypted in your
weechat configuration files. thankfully, weechat has a solution for this!
First, set a passphrase that you will be required to type on each weechat startup:
```
/secure passphrase [password]
```
you can then set any kind of encrypted data using `/secure set` and
use it anywhere using `sec.data` variables:
```
/secure set bread_password hunter2
/set irc.server.breadpunk.command "/msg NickServ IDENTIFY \${sec.data.bread_password}"
```

View File

@ -0,0 +1,34 @@
+++
title = "magic tunnel"
author = "breadw"
+++
if you want to use IRC to chat with your friends on breadpunk,
but don't want to ssh in to the server every time,
you can set up a magic tunnel.
all you have to do is run this command on your own computer:
```
ssh -N user@breadpunk.club -L localhost:6667:localhost:6667 &
```
replacing `user` with your breadpunk username
and the first `6667` with the port you want to listen on.
then, in your IRC client, create a new server
with that port and connect to it.
in weechat, you'd do this:
```
/server add breadpunk localhost/6667 -autoconnect
/connect breadpunk
```
## further reading
this information is a shorter version of the text found
on [~nick's page](https://tilde.town/~nick/sshtunnel.html).
breadw has also written a utility to make it easy
to open tunnels, called
[mrgrctrnl](https://git.sr.ht/~acdw/mrgrctrnl).

48
content/docs/manifesto.md Normal file
View File

@ -0,0 +1,48 @@
+++
title = "manifesto"
+++
>*Man cannot live on bread alone.*
>&mdash; Jesus of Nazareth
>*They say bread is life.*
>&mdash; Ronny Cammareri of Brooklyn
Bread was invented tens of thousands of years ago,
probably by someone drunk because they had the munchies.
It's been made continuously since then
by people of varying degrees of sobriety
and to varying degrees of success.
For nearly its entire history,
bread has been made using stale dough from earlier bread,
or from a fresh-made pool of fermented wheat and water.
It took time,
but it was good,
and we had time.
Of course,
the Market came along,
and with it hunger:
the hunger of the working-class,
who did not have time to
sit and wait for bread.
We invented instant yeast in a lab,
we invented styrofoam bread with no taste
but fast turnaround,
and we called it good.
But we knew not what we did &mdash;
or at least, many of us didn't.
The alphabet, they say, was invented only once.
Bread is invented every time, anew.
It's life itself.
And life is not for sale.
Breadpunk rejects the commoditization of life by market capitalism.
Breadpunk is an attitude that something our ancestors made largely for free
is not something we should be spending money on.
Breadpunk is the idea that we have time again,
that industrialism gives us time to bake bread.
Breadpunk is simple:
**MAKE YOUR OWN DAMN BREAD.**

53
content/docs/news.md Normal file
View File

@ -0,0 +1,53 @@
+++
title = "nntp"
author = "lucitoast"
+++
breadpunk has a local-only NNTP server available. NNTP (Network News Transfer
Protocol) is a protocol designed for the same use cases as forums and mailing
lists, except everything is federated. It is usually better known as Usenet or
simply as newsgroups.
Our NNTP server is however not connected to the rest of Usenet. Tildeverse.org
should provide a [news server](http://news.tildeverse.org/) for interested
tildes, but it is currently announced as down, so our server is completely
alone. It currently has the following groups:
* `local.test`: A default group from our server software which you can use for
various testing purposes.
* `bread.general`: For all general discussions, when something does not fit any
other group.
* `bread.recipes`: For sharing all your bread recipes!
* `bread.meta`: Discussions about breadpunk.club itself.
* `bread.nomic`: Discussions about the game of Nomic
Before joining the news server, it is strongly recommended to read some of the
typical [Usenet guidelines](http://lol-russ.umn.edu/webruss/WebRuss/russ1102/comphelp/netiquet.html).
## slrn setup
To reach our server using `slrn`, a rather simple news reader allowing you to
use your own editor of choice to post, you can use a similar process as the one
described on the Tildeverse server:
1. Get a sample `.slrnrc` file from the project on Sourceforge:
`wget -qO ~/.slrnrc http://slrn.sourceforge.net/docs/slrn.rc`
2. Edit `~/.slrnrc`
3. Uncomment (remove the leading `%`) the line defining `username` and set it
to your bakername
4. Uncomment `hostname` and set it to `breadpunk.club`
5. Uncomment `realname` and set it to whatever you want to have as your real
name: it will be displayed in all posts as
`From: realname <username@breadpunk.club>`
6. If your editor of choice is Vim, uncomment the `set editor_command` line and
set it to `vim '+set tw=72 cc=+1 +%d '%s'`. This will help you with the 72
character line limit of newsgroups and display a visual cue of this limit;
see `:help textwidth` and `:help colorcolumn` in Vim to learn more.
7. Set up slrn by running `slrn --create`.
8. Use the arrow keys to browse the list of groups and press `s` to subscribe or
`u` to unsubscribe. Unsubscribed groups have an uppercase `U` next to them.
9. Save your subscriptions and close by pressing `q` then `y`.
You can later run `slrn` to view your subscribed newsgroups and read, post or
reply to articles. If you prefer to use a [magic tunnel](/docs/magic-tunnel/) to
access the newsgroup from a local client, you will want to forward port **119**.

60
content/docs/ssh.md Normal file
View File

@ -0,0 +1,60 @@
+++
title = "ssh"
author = "breadw"
+++
> a lot of this has been pulled from
> [trash.town](https://trash.town/signup.html),
> at the permission of [~loaf](/~loaf).
Signing up for a breadpunk.club account requires you
to generate a **public key** and a **private key**
using a tool called SSH.
## requirements
- a unix-like environment, such as
- ubuntu/linux/\*bsd
- macOS
- windows subsystem for linux
- [scoop.sh](https://scoop.sh/)
- SSH
## generating your public and private keys
much like the keys to your house,
SSH keys prevent unknown and unwanted users from
accessing a system.
if you don't have your keys,
you can't get in!
since computers aren't houses, though,
they don't work exactly the same:
instead of a key and a lock,
you get two keys: a *private key*,
which is only for you and should be kept secret,
and a *public key*,
which can be shared (and in fact must be for you to log in).
**make sure to run these commands inside a unix-like environment**
1. run `ssh-keygen -t ed25519 -f ~/.ssh/breadpunk.club`
2. enter a password, or press enter if you don't need one
3. enter the password again, or press enter again
this process has generated two files:
- your **private** key `~/.ssh/breadpunk.club` -- *don't* share this with anyone!
- your **public** key `~/.ssh/breadpunk.club.pub`
## sending your public key to breadpunk.club
basically, follow the directions to [join](/join) the club,
and attach your public key `~/.ssh/bredpunk.club.pub` to the email.
## more information
if this is still confusing you,
peruse the information at
[tilde.town](https://tilde.town/wiki/getting-started/ssh.html)
or use [their key generator](https://cgi.tilde.town/users/keymachine).

View File

@ -0,0 +1,42 @@
+++
title = "the bread tool"
author = "breadw"
+++
`bread` is a great tool to interact with some of the aspects of the town.
here are the subcommands:
## news
`bread news` lets you read the latest news.
typed by itself, it'll show you the latest four news items.
you can change the number of shown items by running
`bread news -n NUM`.
if there's a specific word or phrase you're looking for,
you can search all the news with `bread news -s QUERY`.
if you're an admin, you can write an article
using `bread news -w`.
the article will show up on the web site in [news](/news).
later, it'd be nice if users could use `bread news`
to write their own news that could be linked from the main news feed.
eventually, we're going to generate gopher, gemini, and RSS pages
from the news as well.
## docs
`bread docs` lets you read breadpunk.club's [documentation](/docs).
it's kind of like a wiki,
except the pages aren't automatically linked.
typed by itself, it'll let you select a document to read
(type `q` or `CTRL-D` to quit).
you can search for a specific phrase by running `bread docs -s QUERY`.
you can write a new document using `bread docs -n`
(though if it has the same name as another document, it'll fail--
but you can still retrieve it from /tmp).
to edit a document, run `bread docs -e QUERY`,
and choose the one you'd like to edit.
docs are editable by every baker!
so be kind.

View File

@ -0,0 +1,40 @@
+++
title = "writing docs"
author = "breadw"
+++
## using `bread`
you can use the [`bread`](/docs/the-bread-tool) tool to write a new document.
just run `bread docs -n`.
if you want to edit an existing document,
run `bread docs -e QUERY`.
that'll search the docs for the text and let you choose which one to edit.
whichever you do,
you'll edit the doc in your \$EDITOR.
## authoring tips
these documents use markdown, specifically
[discount](http://www.pell.portland.or.us/~orc/Code/discount/),
specifically, this command:
`$(echo "$DISCOUNT")`.
you can read the documentation for discount
to see how those change your authoring process.
instead of YAML or Pandoc-style frontmatter,
breadpunk.club uses a custom style
where the first paragraph of the file is a metadata block
with tab-delimited keys and values.
for example, the top of this file looks like this:
```
title writing docs
these documents use markdown, specifically
```
other than that, it's pretty self-explanatory.
if you want to link to other docs,
use a markdown link: `[title](/docs/<doc-name>)`.

16
content/join.md Normal file
View File

@ -0,0 +1,16 @@
+++
title = "join"
+++
breadpunk.club is open to anyone. it's suggested that you look at our
[manifesto](/docs/manifesto) and make sure it's something you're interested in,
as well as our [code of conduct](/docs/code-of-conduct) to make sure you agree
with our terms.
to become a baker, just send an email to [~breadw](/~breadw) with your SSH key
(attached, please!), desired username (must be bread-oriented), realname (can
be your "normal" username), and what shell youd like to use.
well see you around the bakery!
{{ shells() }}

View File

@ -0,0 +1,17 @@
+++
title = "We're baking!"
author = "breadw"
date = 2020-04-11
+++
Breadpunk is officially live!
We don't have a ton of services yet,
but if you [join us](/join)
you can come say hi on [IRC](/docs/irc),
build your own [web page](/docs/web),
[gopher hole](/docs/gopher),
[gemini constellation](/docs/gemini),
or [email](/docs/email) other bakers.
We're going to be adding other stuff soon,
so come on by!

View File

@ -0,0 +1,26 @@
+++
title = "Join us in Nomic!"
author = "breadw"
date = 2020-04-29
+++
We've been baking up a storm here at breadpunk.club,
and one of the things we've been working on is a game of
[nomic](//en.wikipedia.org/wiki/Nomic).
It's a game where the rules can change any time,
and in fact that's the point!
Check out
[~lucitoast's page on nomic](/~lucitoast/nomic/)
for more information.
When you're ready to join (if you're a baker already, that is),
make a pull request on the
[tildegit repo](//tildegit.org/breadpunk/nomic)
adding your name in the `players` folder.
We also discuss the game on our NNTP server
(oh, right, did you know we have an
[NNTP server](/docs/news/)? It's pretty cool)
at bread.nomic.
According to the first round of rules, a game can't start
til there are 5 players, so come join us!

View File

@ -0,0 +1,32 @@
+++
title = "We have Gemini User Capsules"
author = "breadw"
date = 2020-05-04
+++
Thanks to a new [gemini server](https://tildegit.org/solderpunk/molly-brown),
we have set up user capsules for everyone on breadpunk.club.
So if you point your
[favorite](https://git.sr.ht/~julienxx/castor)
[gemini](https://rawtext.club/~sloum/bombadillo.html)
[client](https://gemini.circumlunar.space/clients.html)
at <gemini://breadpunk.club/~breadw>,
for instance,
you'll see individual user pages.
You can also see a listing at <gemini://breadpunk.club>.
**What is Gemini?**
Gemini is a new texty protocol that sits somewhere between gopher and http.
Check it out at <https://gemini.circumlunar.space/>,
or of course <gemini://gemini.circumlunar.space>.
**For bakers**
You should have a user directory under `/var/gemini/bakers/`.
Feel free to drop your `*.gmi` files directly under there, or
symlink your directory to your `$HOME`.
The server *does* have CGI capabbilities,
but the admins haven't set any of that up yet.
If you'd like to take a crack at some dynamic Gemini content,
please contact one of them (`man 7 admins`).

View File

@ -0,0 +1,10 @@
+++
title = "Ubuntu 20.04.1 upgrade"
author = "lucitoast"
date = 2020-11-14
+++
We successfully did the first upgrade of breadpunk.club, to Ubuntu 20.04.1,
with a little bit of downtime.
Please report any broken stuff to either me (~lucitoast) or ~breadw!

View File

@ -0,0 +1,13 @@
+++
title = "Celebrating 40 bakers strong!"
author = "breadw"
date = 2021-01-30
+++
breadpunk.club just welcomed its <strong>FORTIETH</strong> baker tonight!
We've had a bit of an uptick in new registrations,
and there's a bunch of great content they've put together.
I'm just happy that this dumb website, started out of a joke on IRC,
is such a fun place for so many people.
Anyway, happy baking everyone! See you around!

View File

@ -0,0 +1,10 @@
+++
title = "Now accepting donations"
author = "breadw"
date = 2021-02-06
+++
Since breadpunk.club has grown a lot since its founding last year, I've created
a new [/donate](/donate) page. Breadpunk is, and will always be, 100% free to
use, but we're a cooperative bunch here. 100% of donations will fund the
operations and hosting costs of breadpunk.club. Thanks!

5
content/news/_index.md Normal file
View File

@ -0,0 +1,5 @@
+++
title = "news"
sort_by = "date"
template = "river.html"
+++

View File

@ -1,5 +0,0 @@
4 # USERS_TOTAL
bakers
/
9 # USERS_CURRENT
baking now

View File

@ -1,6 +0,0 @@
<ul>
<li><a href="/news">news</a></li>
<li><a href="/join">join</a></li>
<li><a href="/docs">docs</a></li>
<li><a href="/donate">donate</a></li>
</ul>

125
lib.sh
View File

@ -1,125 +0,0 @@
# UNKLIB
# convenience functions
#shellcheck disable=2034
DISCOUNT="markdown -f links,image,pants,html,autolink,fencedcode"
alias p=echo
alias l='p >&2'
N(){ f="${1:-$F}";n="${f#$UNKI/}";p "${n%.*}";}
NN(){ f="${1:-$F}";n="${f##*/}";p "${n%%.*}";}
N_(){ f="${1:-$F}";n="$(N "$f")";p "${n#_}";}
M(){ sed '/^$/q' "${2:-$F}"|grep "^$1"|cut -f2-;}
C(){ sed '1,/^$/d' "${1:-$F}";}
X(){
Xd=$((Xd+1));
eval "$(p "set -e";p "cat<<$UNKZ$Xd";cat "${1:--}"|sed 's/`/\\`/g';p;p "$UNKZ$Xd")";
}
modmsg()
{ # message as to when a page was modified
date -d "$1" \
+'this page was updated on <time datetime="%F">'"${2:-%e %B %Y}"'</time>'
}
series()
{
in="$(cat)"
s="$*"
if [ -n "$in" ]; then
s="$s $in"
fi
if [ -z "$s" ]; then
return
fi
tx "part of the $s series"
}
wrapstr()
{ # wrap a non-empty string
sed -e "s_^._<$*>&_" -e "s_.\$_&</$1>_"
}
addstr()
{ # add a string after, but not after an empty string
sed "s/^.\+\$/&$*/"
}
defstr()
{ # replace an empty string with a default
sed "s/^\$/$*/"
}
slugify()
{ # turn a string into a slug
if [ "$#" -gt 0 ]; then
echo "$*"
else
cat
fi |
tr '[:upper:]' '[:lower:]' |
sed \
-e 's/[[:punct:]]//g' \
-e 's/[^[:alnum:]_]/-/g' \
-e 's/-+/-/g' \
-e 's/^-//' -e 's/-$//'
}
recent_files()
{ # list files
# WARNING: find -printf is NOT posix :(
dir="$1"
shift
find "$dir" -maxdepth 1 \
-not -name '.*' "$@" \
-printf '%T@\t%p\n' \
| sort -nr \
| cut -f2
}
maybe_expand()
{ # expand a file based on its metadata (or lack thereof)
F="${1:-$F}"
expand="$(M expand "$F")"
if [ -z "$expand" ] || "$expand"; then
C "$F" | ./lht | X
else
C "$F"
fi
}
#shellcheck disable=2120
build()
{ # X on a file
F="${1:-$F}"
[ -f "$F" ] || return 1
l "$F"
dir="$UNKO/$(N)"
rm -rf "$dir"
mkdir -p "$dir"
X "$UNKL" > "$dir/index.html"
}
build_dir()
{ # build a directory
for F in "$UNKI/$1"/*; do
build || l "$F: not a file"
done
}
listing()
{ # print a listing
p "<ul class='listing'>"
for F in $(recent_files "$UNKI/$1" -type f); do
build && {
p "<li><a href='/$(N)/'>$(M title)</a>"
if [ -n "$(M series)" ]; then
p "<span class='series desc'>$(series "$(M series)")</span>"
fi
p "</li>"
}
done
p "</ul>"
}

View File

@ -6,7 +6,7 @@ html {
padding: 0;
font: 18px/1.3 CMUTypewriterTextRegular, monospace;
background-color: wheat;
background: url("/S/bread.png") repeat;
background: url("/bread.png") repeat;
}
#main {
max-width: 40em;
@ -39,7 +39,7 @@ html {
.nav li:after {
content: " (#) ";
}
.subtitle {
.subtitle,blockquote,.description {
font-style: italic;
}
pre,

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 759 B

After

Width:  |  Height:  |  Size: 759 B

View File

Before

Width:  |  Height:  |  Size: 318 B

After

Width:  |  Height:  |  Size: 318 B

5
static/shells.toml Normal file
View File

@ -0,0 +1,5 @@
# THIS FILE IS AUTOGENERATED BY ../scripts/site/bin/update-data.sh
# DO NOT HAND-EDIT
data = [
"sh", "bash", "rbash", "dash",
]

8
static/users.toml Normal file
View File

@ -0,0 +1,8 @@
# THIS FILE IS AUTOGENERATED BY ../scripts/site/bin/update-data.sh
# DO NOT HAND-EDIT
all = [
"acdw",
]
login = [
"acdw",
]

74
templates/base.html Normal file
View File

@ -0,0 +1,74 @@
{% block doctype -%}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
{%- endblock doctype %}
<html lang="en">
<head>
{% block head -%}
{% block head_meta -%}
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description"
content="{%- block desc -%}
{{ config.description }}
{%- endblock desc -%}">
{%- endblock head_meta %}
<title>{% block title %}{{ config.title }}{% endblock title %}</title>
{% block head_links -%}
<link rel="stylesheet" media="screen" type="text/css"
href="https://fontlibrary.org/face/cmu-typewriter" >
<link rel="stylesheet" type="text/css" href="/breadpunk.css" >
<link rel="icon" type="image/png" href="/breadpunk.png">
{%- endblock head_links %}
{%- endblock head %}
</head>
<body>
{% block body -%}
<div id="header">
{% block header -%}
<div class="nav">
{% block sitenav -%}
<ul>
<li><a href="/">breadpunk</a></li>
<li><a href="/join">join</a></li>
<li><a href="/news">news</a></li>
<li><a href="/docs">docs</a></li>
<li><a href="/donate">donate</a></li>
</ul>
{%- endblock sitenav %}
</div>
{% block users -%}
<marquee id="users">
{% set user_data = load_data(path="static/users.toml") %}
{{ user_data.all | length }} bakers /
{{ user_data.login | length }} online now
</marquee>
{%- endblock users %}
{%- endblock header -%}
</div>
<div id="main">
{%- block main -%}
<div class="header">
{%- block main_header %}
<h1>
{%- if page.title -%}{{ page.title }}
{%- elif section.title -%}{{ section.title }}
{%- endif -%}
</h1>
{%- if page.description -%}
<p class="subtitle">{{ page.description }}</p>
{%- elif section.description -%}
<p class="subtitle">{{ section.description }}</p>
{%- endif -%}
{%- endblock main_header -%}
</div>
{%- block main_content %}{% endblock main_content -%}
{%- endblock main -%}
</div>
<div id="footer">
{%- block footer -%}
{%- endblock footer -%}
</div>
{%- endblock body %}
</body>
<!-- generated {{ now() | date(format="%FT%T") }} -->
</html>

9
templates/index.html Normal file
View File

@ -0,0 +1,9 @@
{% extends "base.html" %}
{% block main_content %}
{{ section.content | safe }}
{% include "index/news.html" %}
{% include "index/join.html" %}
{% include "index/bakers.html" %}
{% endblock main_content %}

View File

@ -0,0 +1,8 @@
<h2>bakers</h2>
<p class="description">in order of their most recent bake</p>
{% set user_data = load_data(path="static/users.toml") %}
<ul>
{% for u in user_data.all -%}
<li><a href="~{{ u }}/">~{{ u }}</a></li>
{%- endfor %}
</ul>

View File

@ -0,0 +1,6 @@
<h2>join us!</h2>
<p>
if you like to bake, want to learn more about baking,
or just love bread, come <a href="/join">join us</a>!
it's easy to apply for membership and we're looking forward to having you.
</p>

11
templates/index/news.html Normal file
View File

@ -0,0 +1,11 @@
<h2>news</h2>
<ul>
{% set s = get_section(path="news/_index.md") %}
{% for p in s.pages %}
{% if loop.index > 3 %}
<li><a href="/news#news-item-4">older news</a></li>
{% break %}
{% endif %}
<li><a href="{{ p.permalink }}">{{ p.title }}</a></li>
{% endfor %}
</ul>

12
templates/page.html Normal file
View File

@ -0,0 +1,12 @@
{% extends "base.html" %}
{% block title %}{{ page.title }} | {{ super() }}{% endblock title %}
{% block main_header %}
{{ super() }}
<p class="date">{{ page.date }}</p>
{% endblock main_header %}
{% block main_content %}
{{ page.content | safe }}
{% endblock main_content %}

18
templates/river.html Normal file
View File

@ -0,0 +1,18 @@
{% extends "section.html" %}
{% block section_listing %}
{% for page in section.pages %}
<div class="article">
<div class="header" id="news-item-{{ loop.index }}">
<h2>
<a href="{{ page.permalink }}">{{ page.title }}</a>
</h2>
<p class="date">
<span class="time">
{{ page.date }}
</span>
</p>
</div>
{{ page.content | safe }}
</div>
{% endfor %}
{% endblock section_listing %}

17
templates/section.html Normal file
View File

@ -0,0 +1,17 @@
{% extends "index.html" %}
{% block title %}{{ section.title }} | {{ super() }}{% endblock title %}
{% block main_content %}
<div class="section_header">
{%- block section_header -%}
{{ section.content }}
{%- endblock section_header -%}
</div>
{% block section_listing -%}
<ul id="section_listing">
{% for page in section.pages -%}
<li><a href="{{ page.permalink }}">{{ page.title }}</a></li>
{%- endfor %}
</ul>
{%- endblock section_listing %}
{% endblock main_content %}

View File

@ -0,0 +1,9 @@
{% set shell_data = load_data(path="static/shells.toml") %}
<h2>available shells</h2>
<p>As of {{ now() | date(format="%F") }}, the following shells are installed:
<ul id="shells">
{% for sh in shell_data.data %}
<li>{{ sh }}</li>
{% endfor %}
</ul>
</p>

54
unk
View File

@ -1,54 +0,0 @@
#!/bin/sh
"$DEBUG" && set -x
set -e
: "${UNKZ:=Z}"
: "${UNKI:=I}"
: "${UNKO:=O}"
: "${UNKL:=L}"
: "${UNKS:=$UNKI/S}"
. ./lib.sh
rm -rf "$UNKO"
mkdir "$UNKO"
cp -r "$UNKS" "$UNKO"||:
# shellcheck disable=2016
[ -f "$UNKL" ]||p '$(X "$F")'>"$UNKL"
for F in "$UNKI"/*
do [ -d "$F" ] && continue
l "$F"
fo="index"
case "$F" in
*.md)
fo="${fo}.html"
;;
*)
fo="${fo}.${F##*.}"
;;
esac
n="$(N)"
d="$UNKO"
case "$n" in
index)
;;
_*)
n="${n#_}"
d="$UNKO/$n"
;;
*)
d="$UNKO/$n"
;;
esac
mkdir -p "$d"
X "$UNKL" > "$d/$fo"
done
#X "$UNKF" > "$UNKO/atom.xml"
l "Building DP"
X Dp > "$UNKO/tilde.json"

View File

@ -1,10 +0,0 @@
#!/usr/bin/awk -f
/USERS_TOTAL/ {
"ls /home|wc -l" | getline $1;
}
/USERS_CURRENT/ {
"users|tr ' ' '\n'|sort -u|wc -l" | getline $1;
}
{ print; }