main
km0 2 years ago
commit 61ad59c1ab

@ -0,0 +1,46 @@
{
"entries": [
{
"title": "exex",
"description": "collaborative writing for branching documentation",
"tags": "tool, writing, collaborative",
"gradient": "tool practice tool practice tool tool"
},
{
"title": "pair documenting",
"description": "like pair programming, but for documentation",
"tags": "practice, writing, collaborative",
"gradient": "practice practice practice"
},
{
"title": "1dl",
"description": "1dimension ~ flat markup language ",
"tags": "tool, markup, writing",
"gradient": "tool practice tool tool practice"
},
{
"title": "textoscope",
"description": "adjust text intensity",
"tags": "tool, reading, writing",
"gradient": "tool tool platform practice practice"
},
{
"title": "read out loud",
"description": "voicing code documentation",
"tags": "reading, audio",
"gradient": "practice tool practice"
},
{
"title": "openings",
"description": "inflating deflating first sentences",
"tags": "reading, language",
"gradient": "practice practice practice tool"
},
{
"title": "tree",
"description": "code documentation wanderer",
"tags": "tool, markup, practice",
"gradient": "tool practice tool practice tool practice"
}
]
}

@ -0,0 +1,132 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Exex</title>
<link rel="stylesheet" href="/style.css">
<style>
#container {
display: flex;
}
.child {
display: flex;
flex-direction: column;
padding: 4px;
margin: 4px;
border: 1px solid currentColor;
white-space: pre-wrap;
flex: 1;
flex-basis: 40ch;
max-height: calc(1.6 * 2em + 16px);
overflow: hidden;
transition: max-height 0.3s ease-out;
}
.child:hover{
transition: max-height 0.6s ease-in;
max-height: 1000px;
}
</style>
</head>
<body>
<h1>EXEX</h1>
<div class="subtitle">collaborative writing for branching documentation</div>
<div class="meta">
<div class="tags">
<span class="tag">collaborative</span>
<span class="tag">writing</span>
<span class="tag">tool</span>
</div>
<ul class="links">
<li><a href="https://git.xpub.nl/kamo/exex">git</a></li>
<li><a href="https://constantvzw.org/wefts/cc4r.en.html">CC4r license</a></li>
<li><a href="https://hub.xpub.nl/soupboat/exex/">try it</a></li>
</ul>
</div>
<!-- <section> -->
<!-- Every entry comes with: -->
<!-- some context -->
<!-- some reflections -->
<!-- some examples -->
<!-- </section> -->
<section class="context">
<h2>Context</h2>
<p>
A branching version of the <a href="https://en.wikipedia.org/wiki/Exquisite_corpse">exquisite corpse game</a>, forked from the <a href="https://git.xpub.nl/kamo/exquisite-branch">exquisite branch</a> drawing app developed for <a href="https://issue.xpub.nl/17/">SI17</a>.
</p>
<p>
Write something, upload it and send the link to someone else: they will continue from your excerpt. With a catch: if you send to just one person the chain will continue linearly, but send it to more people and things will start branching in different directions.
</p>
<p>
Could be a writing machine to work on the collective pubblication for the graduation, inspired by what <a href="https://pad.xpub.nl/p/gradcollectivexpub">Kim wrote here</a>
</p>
</section>
<section>
<h2>reflections</h2>
</section>
<section>
<h2>examples</h2>
</section>
<section id='container'></section>
<script>
const display = (container, tree) => {
if(tree.branches){
let content = document.createElement('div')
content.classList.add('child')
if (tree.content) {
content.innerHTML = tree.content
}
container.appendChild(content)
for (const b of tree.branches) {
display(content, b)
}
}
}
const constainer = document.querySelector('#container')
fetch('https://hub.xpub.nl/soupboat/exex/api/v1/tree/about/')
.then(res=>res.json())
.then(res=>{
display(container, res)
})
</script>
</body>
</html>

@ -0,0 +1,28 @@
{
"entries": [
{
"title": "exex",
"description": "collaborative writing for branching documentation",
"tags": "tool, writing, collaborative",
"gradient": "tool practice tool practice tool tool"
},
{
"title": "pair documenting",
"description": "like pair programming, but for documentation",
"tags": "practice, writing, collaborative",
"gradient": "practice practice practice"
},
{
"title": "1dl",
"description": "1dimension ~ flat markup language ",
"tags": "tool, markup, writing",
"gradient": "tool practice tool tool practice"
},
{
"title": "textoscope",
"description": "adjust text intensity",
"tags": "tool, reading, writing",
"gradient": "tool tool platform practice practice"
}
]
}

@ -0,0 +1,141 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>A toolkit,,, erg</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1>Hello worlding</h1>
<section>
There are words around code: they create entry points and help understand software. They offer ways to reason about programming, they highlight certain features and hide unexpected flaws. They describe the surroundings of an application: how does it interact with neighbouring systems and how does it address involved developers.
These words make worlds around code. Worlds with embedded values, active actors and politics of participation.
</section>
<section>
Here is a collection of writing machines to explore practices of code documentation. To reflect and operate on the words they use, on the assumption they make, on the ways they are produced.
A writing machine is a device that transforms writing. It can be a tool, such as a pen or a typewriter or a text editor, it can be a practical approach, like documenting in pairs or avoiding or insisting on specific terms.
This collection includes strategies developed during the past two years of within the context and infrastructure of the Soupboat, a small self-hosted server home to various piece of software and experiments.
</section>
<section>
Every entry comes with:
<ul>
<li>some context</li>
<li>some reflections</li>
<li>some examples</li>
</ul>
Every entry can be further activated with workshops, or by applying it to different projects. It can be something that slowly thrives and transforms.
Every entry it's a way to explore sociality around code at different intensities: some developers could be more at ease using instruments, some others more with developing habits and practical workflows.
</section>
<div class="controller">
<span>tools</span>
<input type="range" min="1" max="100" value="50" class="slider" id="myRange">
<span>pratices</span>
</div>
<table>
<thead>
<tr>
<td>Title</td>
<td>Description</td>
<td>Tags</td>
</tr>
</thead>
<tbody>
</tbody>
</table>
<script>
const populateTable = (entries) => {
const rows = []
for (const entry of entries) {
const row = document.createElement('tr')
const title = document.createElement('td')
title.classList.add('title')
const link = document.createElement('a')
link.classList.add('stretched-link')
link.href = `entries/${entry.title}`
link.innerHTML = entry.title
title.appendChild(link)
const description = document.createElement('td')
description.classList.add('description')
description.innerHTML = entry.description
const tags = document.createElement('td')
tags.classList.add('tags')
entry.tags.split(',').sort().forEach(tag=>{
const chips = document.createElement('span')
chips.classList.add('tag')
chips.innerHTML = tag.trim()
tags.appendChild(chips)
})
row.appendChild(title)
row.appendChild(description)
row.appendChild(tags)
rows.push(row)
}
return rows
}
const r = (scale=1) => Math.random() * scale - (scale * 0.5)
const wobble = () => {
const all = document.body.querySelectorAll('*:not(table):not(tr):not(thead):not(tbody):not(.controller)')
Array.from(all).forEach(e=>{
e.innerHTML = Array.from(e.textContent).map(c=>{
// replace space with &nbsp; character, otherwise empty span = width 0
c = c == ' ' ? '&nbsp;' : c
// wobble with centered random function
return `<span style="transform: scale(${r(0.3)+1})">${c}</span>`
// return `<span style="transform: translate(${r(1)}px, ${r(2)}px)">${c}</span>`
}).join('')
e.style.transform = `translate(${r(10)}px, ${r(10)}px)`
console.log(r())
})
}
fetch('entries.json').then(res=>res.json()).then(res=> {
const table = document.querySelector('table tbody')
table.append(...populateTable(res.entries))
})
wobble()
</script>
</body>
</html>

@ -0,0 +1,19 @@
import json
title = input('Title: ')
description = input('Description: ')
tags = input('Tags: ')
gradient = input('Gradient: ')
with open('entries.json', 'r') as f:
data = json.load(f)
data["entries"].append({
"title": title,
"description": description,
"tags": tags,
"gradient": gradient
})
with open('entries.json', 'w') as f:
json.dump(data, f, ensure_ascii=False, indent=4)

@ -0,0 +1,110 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<pre>
mh trying to sort out a gradient way to filter the writing machines
using yet another writing machine such as a gradient
that seems more expressive than a percentage system,
the very same amount
(
tool: 60%
practice: 40%
)
it can be written in a gradient form as
(
tool tool tool practice practice
)
but also
(
tool practice tool practice tool
)
in a way that adds more qualities to the quantity
in a similar way, just adding another feature
is as easy as adding it to the gradient
(
tool tool tool practice practice platform
)
while in a percentage system adding hooowwww where are yanother dimension
would mean to revisit all the previous property to sum up to 100
</pre>
<pre>
but maybe the point is not to filter things ?
could anyway be something interesting to develop:
1 find components
2 place them spatially
2pi / components.lenght = angle for each component
how to place components?
could it be a mix between
a. chronologic order
cycle through components
insert every new component in a new angle position
b. positional order
???
cycle again through components
get first and last distincts of list
grade them
aaa ok too difficult for now
actually maybe this is multi d vector math
and i dont have the minimal clue about it
ahah
</pre>
<div id="gradient"></div>
<script>
// MMMmm no ok no
const handleRadiant = (entries) => {
const gradient = document.querySelector('#gradient')
const width = 300
const height = 300
gradient.style.width = width + 'px'
gradient.style.height = height + 'px'
let properties = new Set()
for (const entry of entries) {
entry.gradient.split(' ').forEach(p => {
properties.add(p)
})
}
let radius = 100
Array.from(properties).forEach((property, index) => {
// Calculate polar coordinates
let t = 2 * Math.PI / properties.size * index
let x = radius * Math.cos(t)
let y = radius * Math.sin(t)
let component = document.createElement('span')
component.classList.add('component')
component.innerHTML = property
component.style.transform = `translate(${x+width/2}px, ${y+height/2}px) translate(-50%, -50%)`
gradient.appendChild(component)
})
}
</script>
</body>
</html>

@ -0,0 +1,17 @@
# Hello worlding
There are words around code: they create entry points and help understand software. They offer ways to reason about programming, they highlight certain features and hide unexpected flaws. They describe the surroundings of an application: how does it interact with neighbouring systems and how does it address involved developers. These words make worlds around code. Worlds with embedded values, active actors and politics of participation.
Here is a collection of writing machines to explore practices of code documentation. To reflect and operate on the words they use, on the assumption they make, on the ways they are produced. A writing machine is a device that transforms writing. It can be a tool, such as a pen or a typewriter or a text editor, it can be a practical approach, like documenting in pairs or avoiding or insisting on specific terms. This collection includes strategies developed during the past two years of within the context and infrastructure of the Soupboat, a small self-hosted server home to various piece of software and experiments.
Every entry comes with:
- some context
- some reflections
- some examples
Every entry can be further activated with workshops, or by applying it to different projects. It can be something that slowly thrives and transforms. Every entry it's a way to explore sociality around code at different intensities: some developers could be more at ease using instruments, some others more with developing habits and practical workflows.
## Note
Experimenting with inflatable identity

@ -0,0 +1,117 @@
body {
margin: 32px;
font-family: sans-serif;
line-height: 1.6;
color: dodgerblue;
}
pre,
section {
font-family: sans-serif;
font-size: 1rem;
line-height: 1.6;
padding: 1em;
border: 1px dashed currentColor;
max-width: 80ch;
margin-block: 1em;
transition: all 0.6s ease-out;
}
table {
border-collapse: collapse;
}
thead {
font-weight: bold;
}
tr {
border: 1px solid currentColor;
position: relative;
}
td {
border: 1px solid currentColor;
padding: 1em;
}
td.title {
font-style: italic;
}
td.tags {
display: flex;
justify-content: flex-start;
flex-wrap: wrap;
gap: 8px;
border: none;
}
.tag {
display: inline-block;
background-color: dodgerblue;
color: white;
border-radius: 1em;
padding: 2px 8px;
}
.controller {
margin-block: 32px;
}
span:not(.tag) {
transition: transform 5s ease-in 5s, margin 5s ease-in 5s;
transform: scale(1);
display: inline-block;
margin: 0;
}
span:hover:not(.tag) {
transform: scale(2)!important;
transition: transform 0.2s, margin 0.2s;
cursor: zoom-in;
margin: 4px;
}
h1 {
margin-bottom: 0;
font-size: 46px;
}
h2 {
margin-block: 0;
}
.meta {
display: flex;
align-items: center;
gap: 16px;
}
.links {
list-style: none;
padding: 0;
display: flex;
gap: 8px;
}
a {
color: currentColor;
font-weight: bold;
}
.stretched-link:after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 50;
}
Loading…
Cancel
Save