889 lines
42 KiB
Django/Jinja
889 lines
42 KiB
Django/Jinja
{% extends "base.html.j2" %}
|
|
|
|
{% block title %}{{ t.about }} - neopig{% endblock %}
|
|
|
|
{% block extra_css %}
|
|
.about-page { width: 100%; min-height: 100vh; background: #0a0a0f; }
|
|
|
|
/* Hero Section */
|
|
.hero-section {
|
|
width: 100%;
|
|
min-height: 100vh;
|
|
display: flex;
|
|
flex-direction: column;
|
|
justify-content: center;
|
|
align-items: center;
|
|
background: linear-gradient(180deg, #0a0a0f 0%, #1a0a1a 50%, #0f0a1a 100%);
|
|
position: relative;
|
|
overflow: hidden;
|
|
padding: 60px 20px;
|
|
}
|
|
.hero-section::before {
|
|
content: '';
|
|
position: absolute;
|
|
top: 0; left: 0; right: 0; bottom: 0;
|
|
background: radial-gradient(ellipse at 50% 0%, rgba(255,50,100,0.15) 0%, transparent 60%),
|
|
radial-gradient(ellipse at 20% 80%, rgba(100,50,255,0.1) 0%, transparent 40%),
|
|
radial-gradient(ellipse at 80% 60%, rgba(255,100,50,0.08) 0%, transparent 40%);
|
|
pointer-events: none;
|
|
}
|
|
.hero-pig {
|
|
width: 280px;
|
|
height: auto;
|
|
filter: drop-shadow(0 0 60px rgba(255,100,100,0.5)) drop-shadow(0 0 120px rgba(255,50,100,0.3));
|
|
animation: pulse-glow 4s ease-in-out infinite;
|
|
margin-bottom: 40px;
|
|
}
|
|
@keyframes pulse-glow {
|
|
0%, 100% { filter: drop-shadow(0 0 60px rgba(255,100,100,0.5)) drop-shadow(0 0 120px rgba(255,50,100,0.3)); }
|
|
50% { filter: drop-shadow(0 0 80px rgba(255,100,100,0.7)) drop-shadow(0 0 160px rgba(255,50,100,0.5)); }
|
|
}
|
|
.hero-title {
|
|
font-size: 6em;
|
|
font-weight: 900;
|
|
letter-spacing: -0.02em;
|
|
background: linear-gradient(135deg, #ff6b6b 0%, #ff8e53 50%, #ff6b9d 100%);
|
|
-webkit-background-clip: text;
|
|
-webkit-text-fill-color: transparent;
|
|
background-clip: text;
|
|
text-shadow: 0 0 80px rgba(255,100,100,0.5);
|
|
margin: 0;
|
|
text-align: center;
|
|
}
|
|
.hero-subtitle {
|
|
font-size: 1.4em;
|
|
color: #888;
|
|
margin-top: 20px;
|
|
font-weight: 300;
|
|
letter-spacing: 0.3em;
|
|
text-transform: uppercase;
|
|
}
|
|
.hero-tagline {
|
|
font-size: 1.1em;
|
|
color: #666;
|
|
margin-top: 30px;
|
|
max-width: 600px;
|
|
text-align: center;
|
|
line-height: 1.8;
|
|
}
|
|
|
|
/* Chapter Sections */
|
|
.chapter {
|
|
width: 100%;
|
|
padding: 120px 40px;
|
|
position: relative;
|
|
}
|
|
.chapter-content {
|
|
max-width: 900px;
|
|
margin: 0 auto;
|
|
}
|
|
.chapter-number {
|
|
font-size: 8em;
|
|
font-weight: 900;
|
|
color: rgba(255,100,100,0.08);
|
|
position: absolute;
|
|
top: 40px;
|
|
left: 40px;
|
|
line-height: 1;
|
|
font-family: 'Georgia', serif;
|
|
}
|
|
.chapter-title {
|
|
font-size: 3em;
|
|
font-weight: 800;
|
|
color: #ff6b6b;
|
|
margin-bottom: 40px;
|
|
position: relative;
|
|
}
|
|
.chapter-title::after {
|
|
content: '';
|
|
display: block;
|
|
width: 100px;
|
|
height: 4px;
|
|
background: linear-gradient(90deg, #ff6b6b, transparent);
|
|
margin-top: 20px;
|
|
}
|
|
|
|
/* Narrative Text */
|
|
.narrative {
|
|
font-size: 1.3em;
|
|
line-height: 2;
|
|
color: #c0c0c0;
|
|
margin-bottom: 30px;
|
|
}
|
|
.narrative em { color: #ff8e53; font-style: italic; }
|
|
.narrative strong { color: #fff; font-weight: 600; }
|
|
.narrative a { color: #ff6b6b; text-decoration: none; border-bottom: 1px solid rgba(255,107,107,0.3); transition: all 0.3s; }
|
|
.narrative a:hover { color: #ff8e53; border-bottom-color: #ff8e53; }
|
|
|
|
/* Dramatic Quote */
|
|
.dramatic-quote {
|
|
padding: 60px;
|
|
margin: 60px 0;
|
|
background: linear-gradient(135deg, rgba(255,50,100,0.1) 0%, rgba(100,50,200,0.1) 100%);
|
|
border-left: 6px solid #ff6b6b;
|
|
position: relative;
|
|
}
|
|
.dramatic-quote::before {
|
|
content: '"';
|
|
font-size: 12em;
|
|
color: rgba(255,100,100,0.15);
|
|
position: absolute;
|
|
top: -40px;
|
|
left: 20px;
|
|
font-family: 'Georgia', serif;
|
|
line-height: 1;
|
|
}
|
|
.dramatic-quote p {
|
|
font-size: 1.8em;
|
|
font-style: italic;
|
|
color: #e0e0e0;
|
|
margin: 0;
|
|
position: relative;
|
|
z-index: 1;
|
|
}
|
|
.dramatic-quote cite {
|
|
display: block;
|
|
margin-top: 30px;
|
|
font-size: 1em;
|
|
color: #888;
|
|
font-style: normal;
|
|
}
|
|
|
|
/* Dead Link Styling */
|
|
.dead-link {
|
|
text-decoration: line-through;
|
|
color: #666;
|
|
cursor: not-allowed;
|
|
position: relative;
|
|
}
|
|
.dead-link::after {
|
|
content: ' [DEAD]';
|
|
color: #ff4444;
|
|
font-size: 0.7em;
|
|
font-weight: bold;
|
|
text-decoration: none;
|
|
}
|
|
|
|
/* Dark Chapter */
|
|
.chapter-dark {
|
|
background: linear-gradient(180deg, #0a0a0f 0%, #150810 50%, #0a0a0f 100%);
|
|
}
|
|
.chapter-dark .chapter-number { color: rgba(255,50,50,0.1); }
|
|
|
|
/* Rebirth Chapter - TempleOS cyan */
|
|
.chapter-rebirth {
|
|
background: linear-gradient(180deg, #0a0a0f 0%, #0a1515 50%, #0a0a0f 100%);
|
|
}
|
|
.chapter-rebirth .chapter-title { color: #00FFFF; }
|
|
.chapter-rebirth .chapter-title::after { background: linear-gradient(90deg, #00FFFF, transparent); }
|
|
.chapter-rebirth .chapter-number { color: rgba(0,255,255,0.08); }
|
|
|
|
/* Beast Section */
|
|
.chapter-beast {
|
|
background: linear-gradient(180deg, #0a0a0f 0%, #1a0a05 50%, #0a0a0f 100%);
|
|
}
|
|
.chapter-beast .chapter-title { color: #ff8e53; }
|
|
.chapter-beast .chapter-title::after { background: linear-gradient(90deg, #ff8e53, transparent); }
|
|
|
|
/* Feature Cards */
|
|
.feature-section {
|
|
width: 100%;
|
|
padding: 100px 40px;
|
|
background: linear-gradient(180deg, #0a0a0f 0%, #0f0f18 50%, #0a0a0f 100%);
|
|
position: relative;
|
|
}
|
|
.feature-section .chapter-title::after {
|
|
margin-left: auto;
|
|
margin-right: auto;
|
|
}
|
|
.feature-grid {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
|
|
gap: 30px;
|
|
max-width: 1400px;
|
|
margin: 0 auto;
|
|
}
|
|
.feature-card {
|
|
background: linear-gradient(145deg, rgba(30,30,40,0.8) 0%, rgba(20,20,30,0.9) 100%);
|
|
padding: 40px;
|
|
border-radius: 16px;
|
|
border: 1px solid rgba(255,100,100,0.1);
|
|
transition: all 0.4s ease;
|
|
position: relative;
|
|
overflow: hidden;
|
|
}
|
|
.feature-card::before {
|
|
content: '';
|
|
position: absolute;
|
|
top: 0; left: 0;
|
|
width: 100%; height: 4px;
|
|
background: linear-gradient(90deg, #ff6b6b, #ff8e53, #4ecdc4);
|
|
opacity: 0;
|
|
transition: opacity 0.4s;
|
|
}
|
|
.feature-card:hover {
|
|
transform: translateY(-5px);
|
|
border-color: rgba(255,100,100,0.3);
|
|
box-shadow: 0 20px 60px rgba(0,0,0,0.4), 0 0 40px rgba(255,100,100,0.1);
|
|
}
|
|
.feature-card:hover::before { opacity: 1; }
|
|
.feature-card h3 {
|
|
font-size: 1.4em;
|
|
color: #ff6b6b;
|
|
margin-bottom: 15px;
|
|
font-weight: 700;
|
|
}
|
|
.feature-card p {
|
|
color: #999;
|
|
line-height: 1.7;
|
|
font-size: 1.05em;
|
|
}
|
|
.feature-card a { color: #4ecdc4; }
|
|
|
|
/* Code Blocks */
|
|
.code-section {
|
|
background: #0d0d12;
|
|
padding: 40px;
|
|
border-radius: 12px;
|
|
margin: 40px 0;
|
|
overflow-x: auto;
|
|
border: 1px solid #222;
|
|
}
|
|
.code-section pre {
|
|
margin: 0;
|
|
font-family: 'Fira Code', 'Monaco', monospace;
|
|
font-size: 2em;
|
|
line-height: 1.8;
|
|
color: #e0e0e0;
|
|
}
|
|
.code-section code { background: none; }
|
|
|
|
/* Inline Code */
|
|
.narrative code {
|
|
background: rgba(255,100,100,0.1);
|
|
padding: 3px 10px;
|
|
border-radius: 4px;
|
|
font-family: 'Fira Code', monospace;
|
|
font-size: 0.9em;
|
|
color: #ff8e53;
|
|
}
|
|
|
|
/* Mirror Section */
|
|
.chapter-mirror {
|
|
background: linear-gradient(180deg, #0a0a0f 0%, #0a0a1f 30%, #100a1a 70%, #0a0a0f 100%);
|
|
position: relative;
|
|
}
|
|
.chapter-mirror::before {
|
|
content: '';
|
|
position: absolute;
|
|
top: 0; left: 0; right: 0; bottom: 0;
|
|
background: repeating-linear-gradient(
|
|
90deg,
|
|
transparent 0px,
|
|
transparent 100px,
|
|
rgba(100,100,255,0.02) 100px,
|
|
rgba(100,100,255,0.02) 101px
|
|
);
|
|
pointer-events: none;
|
|
}
|
|
|
|
/* Transition into cyan */
|
|
.chapter-to-cyan {
|
|
background: linear-gradient(180deg, #0a0a0f 0%, #0a0a0f calc(100% - 121px), #55FFFF 100%);
|
|
}
|
|
.chapter-to-cyan .chapter-number { color: rgba(255,50,50,0.1); }
|
|
|
|
/* The Forge - TempleOS background */
|
|
.chapter-forge {
|
|
background: #55FFFF;
|
|
position: relative;
|
|
}
|
|
.chapter-forge::before { content: none; }
|
|
|
|
/* Transition from cyan */
|
|
.chapter-from-cyan {
|
|
background: linear-gradient(180deg, #55FFFF 0%, #0a0a0f 121px, #0a0a0f 100%);
|
|
padding-top: 200px;
|
|
}
|
|
.chapter-from-cyan .chapter-number { color: rgba(255,50,50,0.1); top: 140px; }
|
|
.forge-logo {
|
|
display: block;
|
|
max-width: 100%;
|
|
height: auto;
|
|
margin: 0 auto;
|
|
}
|
|
.chapter-forge .chapter-content {
|
|
position: relative;
|
|
z-index: 1;
|
|
}
|
|
.chapter-forge .chapter-title { color: #000; }
|
|
.chapter-forge .chapter-title::after { background: linear-gradient(90deg, #000, transparent); }
|
|
.chapter-forge .chapter-number { color: rgba(0,0,0,0.15); }
|
|
.chapter-forge .narrative { color: #000; }
|
|
.chapter-forge .narrative a { color: #006666; }
|
|
.chapter-forge .narrative em { color: #004444; }
|
|
.chapter-forge .narrative strong { color: #000; }
|
|
.chapter-forge .dramatic-quote { background: rgba(0,0,0,0.15); border-left-color: #000; }
|
|
.chapter-forge .dramatic-quote p { color: #000; font-style: italic; }
|
|
.chapter-forge .dramatic-quote cite { color: #333; }
|
|
|
|
/* Rules grid */
|
|
.rule-grid {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
|
|
gap: 12px;
|
|
margin: 40px 0;
|
|
}
|
|
.rule-item {
|
|
font-size: 1.05em;
|
|
line-height: 1.6;
|
|
color: #b0b0b0;
|
|
padding: 12px 16px;
|
|
background: rgba(255,255,255,0.02);
|
|
border-radius: 6px;
|
|
border-left: 3px solid rgba(255,107,107,0.3);
|
|
}
|
|
.rule-item strong {
|
|
color: #ff6b6b;
|
|
font-weight: 700;
|
|
}
|
|
@media (max-width: 768px) {
|
|
.rule-grid { grid-template-columns: 1fr; }
|
|
}
|
|
|
|
.chapter-mirror .chapter-title { color: #8b5cf6; }
|
|
.chapter-mirror .chapter-title::after { background: linear-gradient(90deg, #8b5cf6, transparent); }
|
|
.chapter-mirror .chapter-number { color: rgba(139,92,246,0.08); }
|
|
|
|
/* Footer */
|
|
.about-footer {
|
|
width: 100%;
|
|
padding: 80px 40px;
|
|
background: #050508;
|
|
text-align: center;
|
|
}
|
|
.about-footer p {
|
|
color: #666;
|
|
font-size: 1.1em;
|
|
margin-bottom: 20px;
|
|
}
|
|
.about-footer a {
|
|
color: #ff6b6b;
|
|
font-size: 1.2em;
|
|
text-decoration: none;
|
|
border-bottom: 2px solid rgba(255,107,107,0.3);
|
|
padding-bottom: 4px;
|
|
transition: all 0.3s;
|
|
}
|
|
.about-footer a:hover {
|
|
color: #ff8e53;
|
|
border-bottom-color: #ff8e53;
|
|
}
|
|
|
|
/* Responsive */
|
|
@media (max-width: 768px) {
|
|
.hero-title { font-size: 3.5em; }
|
|
.hero-pig { width: 200px; }
|
|
.chapter { padding: 80px 20px; }
|
|
.chapter-number { font-size: 5em; top: 20px; left: 20px; }
|
|
.chapter-title { font-size: 2em; }
|
|
.narrative { font-size: 1.1em; }
|
|
.dramatic-quote { padding: 30px; }
|
|
.dramatic-quote p { font-size: 1.3em; }
|
|
.feature-section { padding: 60px 20px; }
|
|
}
|
|
{% endblock %}
|
|
|
|
{% block content %}
|
|
<div class="about-page">
|
|
|
|
<!-- HERO SECTION -->
|
|
<section class="hero-section">
|
|
<img src="/static/images/pig1-color1.png" alt="pig.py" class="hero-pig">
|
|
<h1 class="hero-title">neopig</h1>
|
|
<p class="hero-subtitle">Neo Python Image Grabber</p>
|
|
<p class="hero-tagline">
|
|
A phoenix-like chimera grown from the bones of dead repositories & forums. A pig that devours web domains whole. Where others archive pages, neopig <em>consumes all digital files</em>.<br><br>Welcome to An Age of Aquarius, no deceitful secrets.
|
|
</p>
|
|
</section>
|
|
|
|
<!-- CHAPTER I: GENESIS -->
|
|
<section class="chapter">
|
|
<div class="chapter-number">I</div>
|
|
<div class="chapter-content">
|
|
<h2 class="chapter-title">Genesis</h2>
|
|
|
|
<div class="dramatic-quote">
|
|
<p>pig.py is a <em>very</em> simple python command line tool to download all the images from a given uri.</p>
|
|
<cite>— Russell Ballestrini, August 22, 2011</cite>
|
|
</div>
|
|
|
|
<p class="narrative">
|
|
In the beginning, there was <a href="https://russell.ballestrini.net/python-image-grabber-pig-py/" target="_blank">pig.py</a>. A simple creature. Innocent. <em>Hungry.</em>
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
Russell Ballestrini crafted it in the summer of 2011 — a humble Python script with a singular appetite: <strong>images</strong>. Point it at a webpage, and it would slurp down every pixel it could find. No configuration. No complexity. Just a hungry little pig gobbling up the visual fabric of the web.
|
|
</p>
|
|
|
|
<div class="code-section">
|
|
<pre><code>python pig.py https://www.foxhop.net</code></pre>
|
|
</div>
|
|
|
|
<p class="narrative">
|
|
That was it. Entire interface. Pig asked only for a target, and it <em>fed</em>.
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
Russell released it into the public domain — a gift to anyone who needed to harvest images from the wild web. Source lived at <code>bitbucket.org/russellballestrini/pig</code>, nestled safely in a Mercurial repository. Pig slept soundly in its pen, unaware of the extinction event approaching.
|
|
</p>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- CHAPTER II: THE EXTINCTION -->
|
|
<section class="chapter chapter-dark">
|
|
<div class="chapter-number">II</div>
|
|
<div class="chapter-content">
|
|
<h2 class="chapter-title">A Great Bitbucket Extinction</h2>
|
|
|
|
<p class="narrative">
|
|
<strong>Then came the dark times.</strong>
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
In 2020, Atlassian — the corporate leviathan that had swallowed Bitbucket whole — decreed that Mercurial repositories would be <em>purged</em>. All of them. Every hg repo on Bitbucket Cloud, atomized. Scattered like digital ash across the void. Atlassian never disclosed how many.
|
|
</p>
|
|
<a href="https://media.unturf.com/c/b86529cc-e673-11ef-b77a-115dc81aa9c4/langolier-time-voidlings-of-null-void" target="_blank"><img src="/static/images/bitbucket.jpg" alt="Bitbucket extinction" style="width:42%"></a>
|
|
|
|
<p class="narrative">
|
|
Original pig.py, that innocent image-gobbling creature, was among the casualties. Its home at <a href="https://bitbucket.org/russellballestrini/pig" class="dead-link">bitbucket.org/russellballestrini/pig</a> became a tombstone. Click it. We dare you. There's nothing there but the echo of corporate indifference.
|
|
</p>
|
|
|
|
<div class="dramatic-quote">
|
|
<p>They literally killed pig.py & sent him to bitbucket.</p>
|
|
<cite>— Cruel irony of naming your graveyard after a slang term for death</cite>
|
|
</div>
|
|
|
|
<p class="narrative">
|
|
<em>"Sent to the bitbucket"</em> — programmer slang from the age of punch cards. When you discarded bad data, you threw it in the bit bucket. Atlassian named their service after a trash can, then proved the prophecy true by throwing away everyone's code.
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
Pig was dead. Its bones scattered across cached search results & archived blog posts. A ghost in the machine, referenced but unreachable.
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
But here's where it gets <em>weird</em>.
|
|
</p>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- CHAPTER III: ALCHEMY -->
|
|
<section class="chapter chapter-rebirth">
|
|
<div class="chapter-number">III</div>
|
|
<div class="chapter-content">
|
|
<h2 class="chapter-title">An Alchemy</h2>
|
|
|
|
<p class="narrative">
|
|
Russell once wrote that <a href="https://russell.ballestrini.net/programming-is-like-alchemy/" target="_blank">"programming is like alchemy — instead of exchanging matter, we programmers exchange time."</a>
|
|
</p>
|
|
<img src="/static/images/alchemy.jpg" alt="Alchemy" style="width:42%">
|
|
|
|
<p class="narrative">
|
|
Programs are <strong>golems</strong>. Familiar spirits. Magical servants performing repetitive tasks so we don't have to. <em>"It is more accurate to group programs with technology than magic, but less fun."</em>
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
Years passed. Web continued its relentless churn — sites going dark, forums shutting down, communities scattering like startled birds. Somewhere, a very angry ex-Ruby developer (Python too) watched the digital decay & remembered the pig.
|
|
</p>
|
|
|
|
<div class="dramatic-quote">
|
|
<p>What if we could transmute that dead code into gold?</p>
|
|
<cite>— Thought that started everything</cite>
|
|
</div>
|
|
|
|
<p class="narrative">
|
|
And speaking of transmutation: <a href="https://phys.org/news/2025-07-marathon-fusion-mercury-gold-energy.html.j2" target="_blank">Marathon Fusion</a> discovered that tokamak breeding blankets — wrapped in Mercury-Lithium alloy, like <em>pigs in a blanket</em> — can transmute Mercury-198 into Gold-197 through chrysopoeia. Fast neutrons trigger (n, 2n) reactions; unstable mercury decays into stable gold within 64 hours.
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
Two metric tons of gold per gigawatt. Alchemists' dream realized, wrapped in radioactive patience (17.7 years of cooling before you can touch your transmuted treasure).
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
A golden goose born from the ashes of deprecated version control. Old pig was slaughtered, while <strong>a new creature stirred in the digital depths...</strong>
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
Machine learning uses an equivalent amount of <a href="https://en.wikipedia.org/wiki/Wu_wei" target="_blank">wu wei</a> energy that elites used to kill pig.py to unfold neopig.py.
|
|
</p>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- CHAPTER IV: THE PIG AWAKENS -->
|
|
<section class="chapter chapter-beast">
|
|
<div class="chapter-number">IV</div>
|
|
<div class="chapter-content">
|
|
<h2 class="chapter-title">A Pig Awakens</h2>
|
|
|
|
<p class="narrative">
|
|
Like a phoenix rising from dead Bitbucket repos, <strong>neopig</strong> emerged.
|
|
</p>
|
|
<a href="https://media.unturf.com/c/fbc48bff-e895-11f0-8d29-02dfe05770ee/gluttony" target="_blank"><img src="/static/images/hungry-pig.jpg" alt="Neopig grows hungrier" style="width:42%"></a>
|
|
|
|
<p class="narrative">
|
|
Not a resurrection. Not a mere fork. Something <em>else</em>. A chimera. A griffin. A creature stitched together from the DNA of the original pig & the fevered dreams of someone who had watched too many sites die.
|
|
</p>
|
|
|
|
<div class="dramatic-quote">
|
|
<p>A pig with an appetite like Gluttony from Fullmetal Alchemist — a homunculus that devours everything in its path, absorbing knowledge, power & form.</p>
|
|
</div>
|
|
|
|
<p class="narrative">
|
|
Where pig.py sipped politely from single pages, neopig <strong>devours entire domains</strong>. It doesn't just grab images — it consumes HTML, screenshots pages, converts content to markdown, indexes every scrap of text, and stores it all in content-addressed vaults that will outlast the original servers.
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
Code lives now at <a href="https://git.unturf.com/engineering/unturf/pig.py" target="_blank">git.unturf.com/engineering/unturf/pig.py</a>. And it keeps evolving. Every crawl adds new capabilities. Every archived site teaches it new tricks.
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
<em>We are adding the ability to backup entire codebases.</em> Neopig grows hungrier.
|
|
</p>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- CHAPTER V: THE MIRROR DIMENSION -->
|
|
<section class="chapter chapter-mirror">
|
|
<div class="chapter-number">V</div>
|
|
<div class="chapter-content">
|
|
<h2 class="chapter-title">A Mirror Dimension</h2>
|
|
|
|
<p class="narrative">
|
|
We are about to <strong>invert the git tree into itself</strong>.
|
|
</p>
|
|
<a href="https://media.unturf.com/c/fcddf99d-a2da-11f0-af1d-02dfe05770ee/the-tempest-overtakes" target="_blank"><img src="/static/images/sleeping-pig.gif" alt="A sleeping pig" style="width:42%"></a>
|
|
|
|
<p class="narrative">
|
|
Like Dr. Strange versus Spider-Man in the mirror dimension — that impossible space where geometry folds back on itself, where buildings become M.C. Escher nightmares & reality reflects endlessly into its own depths.
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
neopig doesn't just archive websites. It can archive <em>itself</em>. It can archive the repositories that contain the code that does the archiving. It can crawl git forges & preserve the source code of tools that preserve source code.
|
|
</p>
|
|
|
|
<div class="dramatic-quote">
|
|
<p>Our spider-pig gets out of the danger of the mirror void — where days are years — and exits absorbing everything like a griffin, like a chimera, like a pig that feeds on bones of dead platforms.</p>
|
|
</div>
|
|
|
|
<p class="narrative">
|
|
When a code hosting platform dies (and they all die eventually — Google Code, Gitorious, BitBucket's hg repos), neopig ensures the knowledge survives. We are the ark. We are the vault. We are the pig that remembers.
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
Archives become self-extracting executables. <code>.run</code> files that contain their own server, their own search engine, their own reality. Drop one on a machine with Python, and it <em>wakes up</em>. A sleeping pig, carrying an entire website in its belly, ready to serve it to anyone who asks.
|
|
</p>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- FEATURES SECTION -->
|
|
<section class="feature-section">
|
|
<div class="chapter-number">VI</div>
|
|
<div class="chapter-content" style="max-width: 100%;">
|
|
<h2 class="chapter-title" style="text-align: center; margin-bottom: 60px;">The Arsenal</h2>
|
|
|
|
<div class="feature-grid">
|
|
<div class="feature-card">
|
|
<h3>Async Domain Crawling</h3>
|
|
<p>Full-domain recursive crawling with configurable depth. Respects robots.txt & crawl delays. Polite but <em>relentless</em>.</p>
|
|
</div>
|
|
<div class="feature-card">
|
|
<h3>Content-Addressed Vault</h3>
|
|
<p>MD5-based deduplication in a 9-deep hex directory structure. Same image from 100 pages? Stored once. Space is memory.</p>
|
|
</div>
|
|
<div class="feature-card">
|
|
<h3>Full-Text Search</h3>
|
|
<p>Every image indexed with its surrounding context — page title, alt text, captions, nearby headings. Find images by <em>meaning</em>, not filename.</p>
|
|
</div>
|
|
<div class="feature-card">
|
|
<h3>Page Screenshots</h3>
|
|
<p><a href="https://linkpeek.com">LinkPeek</a> reborn! Full-page captures via <a href="https://github.com/russellballestrini/uri2png">uri2png</a>. wkhtmltoimage, cutycapt, or Playwright backends.</p>
|
|
</div>
|
|
<div class="feature-card">
|
|
<h3>Hydra Mode</h3>
|
|
<p>Auto-discover RSS/Atom/Sitemap feeds. Persists feed URLs, checks for new content on every crawl. Self-healing archive maintenance.</p>
|
|
</div>
|
|
<div class="feature-card">
|
|
<h3>Media Provenance</h3>
|
|
<p>Track first_seen, last_seen, and when each page first linked to media. Watch content spread across the web over time.</p>
|
|
</div>
|
|
<div class="feature-card">
|
|
<h3>Markdown Conversion</h3>
|
|
<p>Intelligent HTML-to-Markdown with forum post detection, noise removal & content extraction. Human-readable archives.</p>
|
|
</div>
|
|
<div class="feature-card">
|
|
<h3>Self-Extracting Archives</h3>
|
|
<p>Create <code>.run</code> executables that contain entire websites. Drop on any machine, execute, browse. Pig travels light.</p>
|
|
</div>
|
|
<div class="feature-card">
|
|
<h3>Code File Support</h3>
|
|
<p>Archive source code, stylesheets, fonts, and scripts alongside media. Complete preservation for developer communities.</p>
|
|
</div>
|
|
<div class="feature-card">
|
|
<h3>VCS Repository Cloning</h3>
|
|
<p>Auto-detect GitHub, GitLab, Bitbucket & more. Clone repos, symlink files to vault. Deduplicated code across forks.</p>
|
|
</div>
|
|
<div class="feature-card">
|
|
<h3>Live Feed</h3>
|
|
<p>Watch media appear in real-time as crawls progress. SSE-powered live updates. Pig hunts while you watch.</p>
|
|
</div>
|
|
<div class="feature-card">
|
|
<h3>SERP Web Interface</h3>
|
|
<p>FastAPI-powered search engine. Browse by type, search by context, view media details. Your personal media search engine.</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- CHAPTER VI: THE SKELETON KEY -->
|
|
<section class="chapter">
|
|
<div class="chapter-number">VII</div>
|
|
<div class="chapter-content">
|
|
<h2 class="chapter-title">A Skeleton Key 🗝️🔑</h2>
|
|
|
|
<p class="narrative">
|
|
neopig uses what we call the <strong>"skeleton key"</strong> approach to media indexing. For every image, we capture <em>all</em> the text that might help you find it later:
|
|
</p>
|
|
<a href="https://media.unturf.com/c/b45632be-9120-11ec-9431-eb3419618d4a/grow-food-not-lawn" target="_blank"><img src="/static/images/grow-food-not-lawn.jpg" alt="Grow food not lawn" style="width:42%"></a>
|
|
|
|
<p class="narrative">
|
|
<strong>Page context:</strong> Title, description, headings near the image.<br>
|
|
<strong>Image attributes:</strong> Alt text, title, surrounding captions.<br>
|
|
<strong>Link context:</strong> Text of links pointing to the image.<br>
|
|
<strong>Detail pages:</strong> For gallery sites, we follow through to detail pages & harvest their metadata too.
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
Result? You can search for <em>"sunset over mountains"</em> and find that image even if it was named <code>IMG_4372.jpg</code> with no alt text — because the page title mentioned it, or someone linked to it with descriptive text, or a caption three divs away contained the words.
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
Every door opens. Every search succeeds. Skeleton key fits every lock because it carries <em>every possible key</em> inside it.
|
|
</p>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- CHAPTER VIII: PRESERVATION -->
|
|
<section class="chapter chapter-to-cyan">
|
|
<div class="chapter-number">VIII</div>
|
|
<div class="chapter-content">
|
|
<h2 class="chapter-title">Why We Archive</h2>
|
|
|
|
<p class="narrative">
|
|
<strong>Web is ephemeral.</strong> Sites go dark. Forums shut down. Communities scatter. Platforms get acquired & gutted. Executives decide that Mercurial isn't profitable & delete every repository with a single corporate memo.
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
We have watched beloved communities vanish. Game modding forums. Technical documentation. Art galleries. Fan wikis. Personal blogs with decades of writing. Gone. Not archived by the Wayback Machine. Not cached by Google. Just <em>gone</em>.
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
neopig is built for <strong>preservation</strong> — capturing not just the media, but the <em>context</em> that gives it meaning. When you archive a site with neopig, you get:
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
• Original HTML with rewritten media links pointing to your local vault<br>
|
|
• Full-text searchable markdown versions of every page<br>
|
|
• Screenshots showing exactly how pages looked<br>
|
|
• A SQLite database you can query, backup, and migrate forever<br>
|
|
• Self-extracting archives that work offline forever
|
|
<br><br><br>
|
|
</p>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- CHAPTER IX: THE FORGE -->
|
|
<section class="chapter chapter-forge">
|
|
<div class="chapter-number">IX</div>
|
|
<div class="chapter-content">
|
|
<h2 class="chapter-title">A Forge</h2>
|
|
|
|
<p class="narrative">
|
|
This tool was not built for profit. It was <strong>forged</strong>.
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
Forged in the fires of <a href="https://permacomputer.com" target="_blank">permacomputer.com</a> — the belief that computing should be <em>permanent</em>. That knowledge should not evaporate when a company pivots. That communities should not lose their histories when a platform gets acquired. That the lore doesn't have to die when you get acqui-hired or outright <span style="color: #8B00FF;">terminated</span> 🟣. A digital commons that belongs to <em>everyone</em>, forever.
|
|
</p>
|
|
|
|
<a href="https://templeos.org" target="_blank"><img src="/static/images/templeos.png" alt="TempleOS" class="forge-logo"></a>
|
|
|
|
<div class="dramatic-quote">
|
|
<p>Truth. Harmony. Freedom. Love.</p>
|
|
<cite>— The quadrivium of a permacomputer</cite>
|
|
</div>
|
|
|
|
<p class="narrative">
|
|
<strong>Truth</strong> — We preserve what actually existed, not sanitized versions. Original HTML. Exact timestamps. Unedited conversations. History as it happened, not as someone wishes it had.
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
<strong>Harmony</strong> — Every piece connects. Media links to pages. Pages link to context. Context links to meaning. Archive is not a graveyard of disconnected files but a living web of relationships, searchable, traversable, <em>whole</em>.
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
<strong>Freedom</strong> — Public domain. No licenses to parse. No corporate terms of service. Take it. Fork it. Run it. Share it. Code is yours. Archives you create are yours. No one can revoke your access to your own preserved knowledge.
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
<strong>Love</strong> — We archive because we <em>care</em>. About the communities that built these spaces. About the people who poured years into forum posts & wiki pages & blog entries. About the future researchers who will want to understand how we lived & thought & created. This is an act of love for human knowledge.
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
Pig is imbued with <em>righteous fire</em>. It does not crawl politely because it fears the powerful — it respects robots.txt because it honors the wishes of creators. It does not hoard in darkness — it preserves in light, making archives searchable, shareable, <em>alive</em>. A pig imbued with <em>righteous fire</em>.
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
When the platforms fall (and they will fall), when the corporate servers go dark (and they will go dark), when the executives decide your community isn't profitable enough to maintain (and they will decide this) — a permacomputer endures. Archives persist. Knowledge survives.
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
<strong>This is what we were forged to do.</strong>
|
|
</p>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- CHAPTER X: A WAY -->
|
|
<section class="chapter chapter-from-cyan">
|
|
<div class="chapter-number">X</div>
|
|
<div class="chapter-content">
|
|
<h2 class="chapter-title">A Way.</h2>
|
|
|
|
<p class="narrative">
|
|
neopig is built on <a href="https://sqlite.org" target="_blank">SQLite</a> — the most deployed database in existence. SQLite adopted the <a href="https://sqlite.org/codeofethics.html.j2" target="_blank">Rule of St. Benedict</a> as their Code of Ethics. 72 principles from a 6th-century monastery, governing software in the 21st.
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
We inherit this lineage. All 72 rules, unabridged:
|
|
</p>
|
|
|
|
<div class="rule-grid">
|
|
<div class="rule-item"><strong>1.</strong> Love the Lord God with your whole heart, soul, and strength.</div>
|
|
<div class="rule-item"><strong>2.</strong> Love your neighbor as yourself.</div>
|
|
<div class="rule-item"><strong>3.</strong> Do not murder.</div>
|
|
<div class="rule-item"><strong>4.</strong> Do not commit adultery.</div>
|
|
<div class="rule-item"><strong>5.</strong> Do not steal.</div>
|
|
<div class="rule-item"><strong>6.</strong> Do not covet.</div>
|
|
<div class="rule-item"><strong>7.</strong> Do not bear false witness.</div>
|
|
<div class="rule-item"><strong>8.</strong> Honor all people.</div>
|
|
<div class="rule-item"><strong>9.</strong> Do not do to another what you would not have done to yourself.</div>
|
|
<div class="rule-item"><strong>10.</strong> Deny oneself in order to follow Christ.</div>
|
|
<div class="rule-item"><strong>11.</strong> Chastise the body.</div>
|
|
<div class="rule-item"><strong>12.</strong> Do not become attached to pleasures.</div>
|
|
<div class="rule-item"><strong>13.</strong> Love fasting.</div>
|
|
<div class="rule-item"><strong>14.</strong> Relieve the poor.</div>
|
|
<div class="rule-item"><strong>15.</strong> Clothe the naked.</div>
|
|
<div class="rule-item"><strong>16.</strong> Visit the sick.</div>
|
|
<div class="rule-item"><strong>17.</strong> Bury the dead.</div>
|
|
<div class="rule-item"><strong>18.</strong> Be a help in times of trouble.</div>
|
|
<div class="rule-item"><strong>19.</strong> Console the sorrowing.</div>
|
|
<div class="rule-item"><strong>20.</strong> Be a stranger to the world's ways.</div>
|
|
<div class="rule-item"><strong>21.</strong> Prefer nothing more than the love of Christ.</div>
|
|
<div class="rule-item"><strong>22.</strong> Do not give way to anger.</div>
|
|
<div class="rule-item"><strong>23.</strong> Do not nurse a grudge.</div>
|
|
<div class="rule-item"><strong>24.</strong> Do not entertain deceit in your heart.</div>
|
|
<div class="rule-item"><strong>25.</strong> Do not give a false peace.</div>
|
|
<div class="rule-item"><strong>26.</strong> Do not forsake charity.</div>
|
|
<div class="rule-item"><strong>27.</strong> Do not swear, for fear of perjuring yourself.</div>
|
|
<div class="rule-item"><strong>28.</strong> Utter only truth from heart and mouth.</div>
|
|
<div class="rule-item"><strong>29.</strong> Do not return evil for evil.</div>
|
|
<div class="rule-item"><strong>30.</strong> Do no wrong to anyone, and bear patiently wrongs done to yourself.</div>
|
|
<div class="rule-item"><strong>31.</strong> Love your enemies.</div>
|
|
<div class="rule-item"><strong>32.</strong> Do not curse those who curse you, but rather bless them.</div>
|
|
<div class="rule-item"><strong>33.</strong> Bear persecution for justice's sake.</div>
|
|
<div class="rule-item"><strong>34.</strong> Be not proud.</div>
|
|
<div class="rule-item"><strong>35.</strong> Be not addicted to wine.</div>
|
|
<div class="rule-item"><strong>36.</strong> Be not a great eater.</div>
|
|
<div class="rule-item"><strong>37.</strong> Be not drowsy.</div>
|
|
<div class="rule-item"><strong>38.</strong> Be not lazy.</div>
|
|
<div class="rule-item"><strong>39.</strong> Be not a grumbler.</div>
|
|
<div class="rule-item"><strong>40.</strong> Be not a detractor.</div>
|
|
<div class="rule-item"><strong>41.</strong> Put your hope in God.</div>
|
|
<div class="rule-item"><strong>42.</strong> Attribute to God, and not to self, whatever good you see in yourself.</div>
|
|
<div class="rule-item"><strong>43.</strong> Recognize always that evil is your own doing, and to impute it to yourself.</div>
|
|
<div class="rule-item"><strong>44.</strong> Fear the Day of Judgment.</div>
|
|
<div class="rule-item"><strong>45.</strong> Be in dread of hell.</div>
|
|
<div class="rule-item"><strong>46.</strong> Desire eternal life with all the passion of the spirit.</div>
|
|
<div class="rule-item"><strong>47.</strong> Keep death daily before your eyes.</div>
|
|
<div class="rule-item"><strong>48.</strong> Keep constant guard over the actions of your life.</div>
|
|
<div class="rule-item"><strong>49.</strong> Know for certain that God sees you everywhere.</div>
|
|
<div class="rule-item"><strong>50.</strong> When wrongful thoughts come into your heart, dash them against Christ immediately.</div>
|
|
<div class="rule-item"><strong>51.</strong> Disclose wrongful thoughts to your spiritual mentor.</div>
|
|
<div class="rule-item"><strong>52.</strong> Guard your tongue against evil and depraved speech.</div>
|
|
<div class="rule-item"><strong>53.</strong> Do not love much talking.</div>
|
|
<div class="rule-item"><strong>54.</strong> Speak no useless words or words that move to laughter.</div>
|
|
<div class="rule-item"><strong>55.</strong> Do not love much or boisterous laughter.</div>
|
|
<div class="rule-item"><strong>56.</strong> Listen willingly to holy reading.</div>
|
|
<div class="rule-item"><strong>57.</strong> Devote yourself frequently to prayer.</div>
|
|
<div class="rule-item"><strong>58.</strong> Daily in your prayers, with tears and sighs, confess your past sins to God, and amend them for the future.</div>
|
|
<div class="rule-item"><strong>59.</strong> Fulfill not the desires of the flesh; hate your own will.</div>
|
|
<div class="rule-item"><strong>60.</strong> Obey in all things the commands of those whom God has placed in authority over you even though they should act otherwise, mindful of the Lord's precept, "Do what they say, but not what they do."</div>
|
|
<div class="rule-item"><strong>61.</strong> Do not wish to be called holy before one is holy; but first to be holy, that you may be truly so called.</div>
|
|
<div class="rule-item"><strong>62.</strong> Fulfill God's commandments daily in your deeds.</div>
|
|
<div class="rule-item"><strong>63.</strong> Love chastity.</div>
|
|
<div class="rule-item"><strong>64.</strong> Hate no one.</div>
|
|
<div class="rule-item"><strong>65.</strong> Be not jealous, nor harbor envy.</div>
|
|
<div class="rule-item"><strong>66.</strong> Do not love quarreling.</div>
|
|
<div class="rule-item"><strong>67.</strong> Shun arrogance.</div>
|
|
<div class="rule-item"><strong>68.</strong> Respect your seniors.</div>
|
|
<div class="rule-item"><strong>69.</strong> Love your juniors.</div>
|
|
<div class="rule-item"><strong>70.</strong> Pray for your enemies in the love of Christ.</div>
|
|
<div class="rule-item"><strong>71.</strong> Make peace with your adversary before the sun sets.</div>
|
|
<div class="rule-item"><strong>72.</strong> Never despair of God's mercy.</div>
|
|
</div>
|
|
|
|
<p class="narrative" style="margin-top: 60px;">
|
|
We archive not to hoard, but to <em>give</em>. We preserve not to control, but to <em>liberate</em>. Database that holds your memories runs on a foundation of ancient wisdom — and so do we.
|
|
</p>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- CHAPTER XI: INVOKE THE PIG -->
|
|
<section class="chapter chapter-beast">
|
|
<div class="chapter-number">XI</div>
|
|
<div class="chapter-content">
|
|
<h2 class="chapter-title">Invoke the Pig</h2>
|
|
|
|
<div class="code-section">
|
|
<pre><code># open http://127.0.0.1:31337 in browser
|
|
python neopig.py --serve</code></pre>
|
|
</div>
|
|
|
|
<p class="narrative">
|
|
<strong>neopig</strong> = <strong>Neo</strong> (new) + <strong>P</strong>ython <strong>I</strong>mage <strong>G</strong>rabber
|
|
</p>
|
|
|
|
<p class="narrative">
|
|
A tip of the hat to original pig.py. A nod to Matrix's Neo — seeing through surface of web to underlying content within. And perhaps a warning: this pig has grown teeth.
|
|
</p>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- FOOTER -->
|
|
<footer class="about-footer">
|
|
<p>neopig is open source, gifted into our public domain.</p>
|
|
<img src="/static/images/pixel-art-gift.png" alt="Gift" style="width:200px">
|
|
<p>Neopig lives:</p>
|
|
<a href="https://git.unturf.com/engineering/unturf/pig.py" target="_blank">git.unturf.com/engineering/unturf/pig.py</a>
|
|
<p style="margin-top: 40px; color: #444; font-size: 0.9em;">
|
|
In memory of all the repositories Atlassian killed.<br>
|
|
Neopig remembers. Neopig archives. Neopig <em>persists</em>.
|
|
</p>
|
|
<a href="https://media.unturf.com/c/28697a5a-b2ad-11ec-9431-eb3419618d4a/oven-fresh-internet-4-all" target="_blank"><img src="/static/images/oven-fresh-internet.jpg" alt="Oven fresh internet" style="width:21%"></a>
|
|
<p style="margin-top: 60px; color: #666;">
|
|
Sorry for the convenience. ✝️
|
|
</p>
|
|
</footer>
|
|
|
|
</div>
|
|
{% endblock %}
|