Three sites, one directory each
flux.vision, tobias.raayoni-last.com and randogoth.com. They were one site until October 2026, serving four audiences from a single dated list, which is the only format that can hold unrelated things at once. flux.vision is recovered from the Wayback Machine, where it had sat since being deleted in 2021: 90 articles, closed and maintained rather than updated. tobias.raayoni-last.com is the professional record, 97 articles back to 1999. randogoth.com is the technical work, 41 articles across six areas, served as an ANSI bulletin board. History starts here deliberately. The development history, the 266-row inventory that records why each article went where it did, the Wayback pipelines, the pruned articles, the source archives and the full-size images are kept beside the repo rather than in it, so a clone is the web presence and not the argument that produced it. REFACTOR.md is gitignored for the same reason. See README.md for where that material lives, and keep it: the sort is not reproducible from these three directories alone. Each site documents itself in its own README, including the traps that cost time and look like nothing when you get them wrong.
This commit is contained in:
commit
8505b7e9e0
1003 changed files with 13289 additions and 0 deletions
28
flux.vision/flux/templates/_macros.html
Normal file
28
flux.vision/flux/templates/_macros.html
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
{% macro names(raw) %}
|
||||
{%- for part in raw.split(';') %}{% set p = part.strip() %}
|
||||
{%- if '<' in p %}<a href="{{ p.split('<')[1]|replace('>','')|trim }}" rel="noopener">{{ p.split('<')[0]|trim }}</a>
|
||||
{%- else %}{{ p }}{% endif %}{% if not loop.last %}, {% endif %}
|
||||
{%- endfor %}
|
||||
{%- endmacro %}
|
||||
|
||||
{# The 2014 site ran the credits inline under the title: "with X for Y". #}
|
||||
{% macro credits(a) %}
|
||||
{%- for key, label in [('with','with'), ('for','for'), ('hiredby','hired by'), ('photosby','photos by')] %}
|
||||
{%- if a.metadata.get(key) %}<span class="rel">{{ label }}</span> {{ names(a.metadata.get(key)) }} {% endif %}
|
||||
{%- endfor %}
|
||||
{%- endmacro %}
|
||||
|
||||
{% macro tile(a, SITEURL) %}
|
||||
{% set th = a.metadata.get('thumb') if not a.metadata.get('thumb_missing') else none %}
|
||||
<a class="art {{ a.metadata.get('tilesize', 'sm') }}" href="{{ SITEURL }}/{{ a.url }}">
|
||||
{# the original showed animated static (void.gif) until jquery.lazyload
|
||||
swapped in data-original. Same effect, IntersectionObserver instead. #}
|
||||
{# --seed desynchronises the static: derived from the slug so it is stable
|
||||
across builds rather than reshuffling every time. #}
|
||||
{% set seed = (a.slug|length * 7 + a.title|length * 13 + a.date.month * 3) % 12 %}
|
||||
{% if th %}<span class="art-preview lazy" style="--seed:{{ seed }}" data-src="{{ SITEURL }}{{ th }}"></span>
|
||||
{% else %}<span class="art-preview empty" style="--seed:{{ seed }}"></span>{% endif %}
|
||||
<div class="art-title">{{ a.title }}</div>
|
||||
<div class="art-date">{{ a.date.strftime('%b %Y') }}</div>
|
||||
</a>
|
||||
{% endmacro %}
|
||||
17
flux.vision/flux/templates/article.html
Normal file
17
flux.vision/flux/templates/article.html
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
{% extends "base.html" %}
|
||||
{% import "_macros.html" as m %}
|
||||
{% block title %}{{ article.title|striptags }} · {{ SITENAME }}{% endblock %}
|
||||
{% set bgi = article.metadata.get('background') if not article.metadata.get('background_missing')
|
||||
else (article.metadata.get('thumb') if not article.metadata.get('thumb_missing') else none) %}
|
||||
{% block bg %}{% if bgi %} style="background-image:url('{{ SITEURL }}{{ bgi }}')"{% endif %}{% endblock %}
|
||||
{% block slate %}{{ article.category }}{% endblock %}
|
||||
{% block content %}
|
||||
<div class="hero-title"><h1>{{ article.title }}</h1></div>
|
||||
<div id="article-meta">
|
||||
<time datetime="{{ article.date.isoformat() }}">{{ article.date.strftime('%d %b %Y' if article.category.name == 'blog' else '%b %Y') }}</time>
|
||||
{%- if article.metadata.get('for') or article.metadata.get('with')
|
||||
or article.metadata.get('hiredby') or article.metadata.get('photosby') %}
|
||||
<span class="sep">/</span> {{ m.credits(article) }}{% endif %}
|
||||
</div>
|
||||
<div id="article">{{ article.content }}</div>
|
||||
{% endblock %}
|
||||
34
flux.vision/flux/templates/base.html
Normal file
34
flux.vision/flux/templates/base.html
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="{{ DEFAULT_LANG }}">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>{% block title %}{{ SITENAME }}{% endblock %}</title>
|
||||
<link rel="stylesheet" href="{{ SITEURL }}/theme/css/style.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="bg"{% block bg %}{% endblock %}></div>
|
||||
<nav class="navbar">
|
||||
<a class="brand" href="{{ SITEURL }}/">flux<sup>φ</sup></a>
|
||||
<a href="{{ SITEURL }}/">timeline</a>
|
||||
<a href="{{ SITEURL }}/section/blog.html">blog</a>
|
||||
<a href="{{ SITEURL }}/sections.html">sections</a>
|
||||
<a href="{{ SITEURL }}/tags.html">tags</a>
|
||||
{# a slate, the way a broadcast ident sits in the corner #}
|
||||
<span class="slate">{% block slate %}{{ SITENAME }}{% endblock %}</span>
|
||||
</nav>
|
||||
<div id="content">
|
||||
<div class="container">
|
||||
{% block content %}{% endblock %}
|
||||
{# No info pages survive, so this is the only place the archive names its
|
||||
author and points at the other two sites. #}
|
||||
<footer class="colophon">
|
||||
<p>Kiritan Flux is Tobias Raayoni Last.</p>
|
||||
<p>Client work and CV at <a href="https://tobias.raayoni-last.com">tobias.raayoni-last.com</a>.
|
||||
Code and writing at <a href="https://randogoth.com">randogoth.com</a>.</p>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
<script src="{{ SITEURL }}/theme/js/site.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
8
flux.vision/flux/templates/categories.html
Normal file
8
flux.vision/flux/templates/categories.html
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{% extends "base.html" %}
|
||||
{% block title %}Sections · {{ SITENAME }}{% endblock %}
|
||||
{% block slate %}sections{% endblock %}
|
||||
{% block content %}
|
||||
<h1 class="pagetitle">Sections</h1>
|
||||
<div class="cloud">{% for cat, arts in categories %}{% if cat.name not in WORK_EXCLUDE %}
|
||||
<a href="{{ SITEURL }}/{{ cat.url }}">{{ cat }} <span>{{ arts|length }}</span></a>{% endif %}{% endfor %}</div>
|
||||
{% endblock %}
|
||||
16
flux.vision/flux/templates/category.html
Normal file
16
flux.vision/flux/templates/category.html
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
{% extends "base.html" %}
|
||||
{% import "_macros.html" as m %}
|
||||
{% block title %}{{ category }} · {{ SITENAME }}{% endblock %}
|
||||
{% block slate %}{{ category }}{% endblock %}
|
||||
{% block content %}
|
||||
<h1 class="pagetitle">{{ category }}</h1>
|
||||
{% if category.name in WORK_EXCLUDE %}
|
||||
<ul class="rows">{% for a in articles %}
|
||||
<li><a href="{{ SITEURL }}/{{ a.url }}" style="display:flex;gap:1.2rem;width:100%">
|
||||
<span class="yr">{{ a.date.strftime('%b %Y') }}</span><span class="ti">{{ a.title }}</span></a></li>
|
||||
{% endfor %}</ul>
|
||||
{% else %}
|
||||
<div class="grid">{% for a in articles %}{{ m.tile(a, SITEURL) }}{% endfor %}</div>
|
||||
<div style="padding-bottom:6rem"></div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
45
flux.vision/flux/templates/index.html
Normal file
45
flux.vision/flux/templates/index.html
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
{% extends "base.html" %}
|
||||
{% import "_macros.html" as m %}
|
||||
{# the timeline: year bands, newest first. `texts` is writing, not work. #}
|
||||
{% set works = articles | rejectattr('category.name', 'in', WORK_EXCLUDE) | list %}
|
||||
{% block bg %} style="background-image:url('{{ SITEURL }}/theme/img/bg1.jpg')"{% endblock %}
|
||||
{% block slate %}timeline{% endblock %}
|
||||
{% block content %}
|
||||
{# the landing the original opened with: hero title, the flux definition, the bio #}
|
||||
<div class="landing">
|
||||
<h1 class="wordmark">Kiritan Flux</h1>
|
||||
</div>
|
||||
|
||||
<div class="deck">
|
||||
<p><strong>flux</strong> <em>[flûks]</em>, n. Lat. fluxus, fluo, fluxi.<br>
|
||||
1. The act of flowing; the motion or passing of a fluid.<br>
|
||||
2. The moving or passing of any thing in continued succession.</p>
|
||||
</div>
|
||||
<div class="bio">
|
||||
<p><strong>Tobias Raayoni Last</strong> (aka. Kiritan Flux), born 1980 in Heidelberg, DE,
|
||||
works as a live visual artist and expanded media producer in Berlin since 2000. His artistic work
|
||||
ranges from VJ shows at prominent techno events to more conceptual live-cinema performances
|
||||
tailored to their unique local context.</p>
|
||||
</div>
|
||||
{# The original index carried a reel below the bio. Same place, same video:
|
||||
the one on the Live Visuals entry that closes the career. #}
|
||||
<div class="reel">
|
||||
<div class="reel-frame">
|
||||
<iframe src="https://player.vimeo.com/video/157625424?h=6a9fde84a6&color=bbbbbb&title=0&byline=0&portrait=0"
|
||||
title="Kiritan Flux — live visuals reel"
|
||||
allow="autoplay; fullscreen; picture-in-picture" allowfullscreen loading="lazy"></iframe>
|
||||
</div>
|
||||
<div class="reel-cap">reel · 2003–2021 · <a href="{{ SITEURL }}/signing-off.html">live visuals</a></div>
|
||||
</div>
|
||||
|
||||
<div class="timeline">
|
||||
{% for year, group in works | groupby('date.year') | sort(attribute='grouper', reverse=true) %}
|
||||
<section class="yearband" id="{{ year }}">
|
||||
<h1>{{ year }}</h1>
|
||||
<div class="grid">
|
||||
{% for a in group | sort(attribute='date', reverse=true) %}{{ m.tile(a, SITEURL) }}{% endfor %}
|
||||
</div>
|
||||
</section>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
7
flux.vision/flux/templates/page.html
Normal file
7
flux.vision/flux/templates/page.html
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
{% extends "base.html" %}
|
||||
{% block title %}{{ page.title|striptags }} · {{ SITENAME }}{% endblock %}
|
||||
{% block slate %}{{ page.title|striptags|lower }}{% endblock %}
|
||||
{% block content %}
|
||||
<h1 class="pagetitle">{{ page.title }}</h1>
|
||||
<div id="article">{{ page.content }}</div>
|
||||
{% endblock %}
|
||||
9
flux.vision/flux/templates/tag.html
Normal file
9
flux.vision/flux/templates/tag.html
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
{% extends "base.html" %}
|
||||
{% import "_macros.html" as m %}
|
||||
{% block title %}{{ tag }} · {{ SITENAME }}{% endblock %}
|
||||
{% block slate %}tag · {{ tag }}{% endblock %}
|
||||
{% block content %}
|
||||
<h1 class="pagetitle">{{ tag }}</h1>
|
||||
<div class="grid">{% for a in articles %}{{ m.tile(a, SITEURL) }}{% endfor %}</div>
|
||||
<div style="padding-bottom:6rem"></div>
|
||||
{% endblock %}
|
||||
8
flux.vision/flux/templates/tags.html
Normal file
8
flux.vision/flux/templates/tags.html
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{% extends "base.html" %}
|
||||
{% block title %}Tags · {{ SITENAME }}{% endblock %}
|
||||
{% block slate %}tags{% endblock %}
|
||||
{% block content %}
|
||||
<h1 class="pagetitle">Tags</h1>
|
||||
<div class="cloud">{% for tag, arts in tags|sort %}
|
||||
<a href="{{ SITEURL }}/{{ tag.url }}">{{ tag }} <span>{{ arts|length }}</span></a>{% endfor %}</div>
|
||||
{% endblock %}
|
||||
Loading…
Add table
Add a link
Reference in a new issue