Commit graph

262 commits

Author SHA1 Message Date
ced92de67c
feat: optional arborist provenance sink (opt-in, default off)
Adds neopig/arborist_sink.py: when enabled, every crawled page neopig
stores is also committed to an arborist content-addressed store — a
Merkle document_root + append-only audit chain — alongside neopig's
existing md5/FileVault storage. Verifiable dedup + FTS5 + tamper-evident
provenance; replaces nothing.

Strictly opt-in: a hard no-op unless NEOPIG_ARBORIST_ENABLED is set AND
arborist is importable. neopig behaves byte-identically without it. This
keeps neopig public-domain by default — arborist is AGPL, pulled only
when an operator opts in. neopig never touches arborist's tables; all
writes go through arborist.embed (no-raw-SQL rule preserved). Sync
SQLite writes run off the event loop via to_thread, lock-serialized,
and failures are swallowed so the mirror can never break a crawl.

Wired into NeoPig.__init__ (self.arborist_sink) and the store_page hook
in the crawl path. Phase-0 scope: page text only; media-manifest edges
are a follow-on. Tests cover disabled-by-default, flag-without-arborist,
the page->Document mapping, and enabled end-to-end + content-idempotence.
2026-05-22 13:06:59 -04:00
341bcb325a
docs: refine style rule; add Balance-All-Workstations + 8-capital sections 2026-05-22 12:24:34 -04:00
10382bd104
fix: fast_mode must ignore crawl-delay on robots-less sites
fast_mode is meant to ignore crawl-delay, but the per-domain delay was
only zeroed on the robots.txt-200 path. A site whose robots.txt 404s
(or errors) fell back to default_crawl_delay (2s), so under fast_mode
every concurrent fetch wave still slept ~2s — the dominant cost of a
wide crawl on a robots-less host. _enforce_crawl_delay now short-circuits
when fast_mode. Disallow unaffected; polite mode still enforces the delay.

Fixed upstream in agents.ai.unturf.com/core; this is the same one-line
fix in this copy of the verbatim-lift fetcher.
2026-05-22 09:15:22 -04:00
05b39054b8
supply-chain: hash-pin dependencies (requirements.lock)
requirements.txt used >= floors and installed with no hashes, so every CI run and
install re-resolved to whatever PyPI served. A poisoned release of any dep
(fastapi, aiohttp, lxml, pillow...) would land unverified.

- requirements.lock: 42 pkgs pinned to exact versions + SHA256 (1258 hashes), uv
  (targeted py3.11 to match CI image)
- Makefile install + CI: pip install --require-hashes -r requirements.lock
- requirements.txt stays the loose source; make pins-lock regenerates

Validated: lock installs under --require-hashes, 460 tests pass under resolved versions.
2026-05-21 10:11:31 -04:00
8ab03641df
license: 'The permacomputer' -> 'Our permacomputer'
Permacomputer Preamble wording fix per CLAUDE.md style rule:
prefer 'our' for community-owned things; 'the' implies fixed
singular ownership.
2026-05-04 09:28:23 -04:00
02e87dd164 style: avoid "the", use "our" — writing style rule + sweep 2026-03-31 13:20:21 -04:00
c8b0ecbd87 add canonical permacomputer preamble to all source files 2026-02-25 17:40:12 -05:00
75f39bab08 consolidate LICENSE preamble: normalize copyright & URIs 2026-02-25 15:01:16 -05:00
cb69004fe0 update LICENSE preamble: add russell.ballestrini.net, remove dashes, and to & 2026-02-25 14:45:17 -05:00
timehexon
337e3ff70d Replace "AI" with "machine learning" in CLAUDE.md
Machine learning is what we grow. "AI" is forbidden in all
permacomputer discourse, marketing, & documentation.
2026-02-02 19:56:08 +00:00
63ab20bedd Add Gangnam Style easter egg to screenshots feature card
LinkPeek + uri2png caught the billion views world record moment.
2026-01-26 11:46:34 -05:00
6c8d9e9ad2 world record caught by linkpeek
first video to reach 1 billion views

	new file:   static/images/linkpeek-psy-gangnam-style-1-billion.png
2026-01-26 11:36:58 -05:00
faf34e298b docs: update CLI examples to use un instead of un2 2026-01-17 10:12:31 -05:00
250b84b11e Add z-index: 9999 to spider animations 2026-01-08 16:36:38 -05:00
87a4a73207 Move sprout emoji to right of 'grow food not lawn' 2026-01-08 16:34:43 -05:00
027f5afc57 Add public domain license and headers to all source files
- Add LICENSE file (public domain, permacomputer values)
- Add license headers to all 27 Python source files
- Restore full about_ch9_p2 with "terminated 🟣" content
- Translate about_ch9_p2 to all 26 languages

The permacomputer is community-owned infrastructure optimized around:
TRUTH, FREEDOM, HARMONY, LOVE
2026-01-08 15:38:28 -05:00
8cc4a5440d Add |safe filter to render HTML links in about page translations 2026-01-08 15:00:51 -05:00
763f27f6ab Restore missing links and text to about page translations
7 translation keys restored with HTML links across all 27 languages:
- about_ch1_p1: link to pig.py blog post
- about_ch2_p3: dead-link to bitbucket + "Click it. We dare you..." text
- about_ch3_p1: link to "programming is like alchemy" article
- about_ch3_p4: link to arxiv:2507.13461 (Marathon Fusion chrysopoeia)
- about_ch3_p7: link to Wikipedia wu wei + restored energy balance text
- about_ch4_p4: link to git.unturf.com/engineering/unturf/pig.py
- about_ch9_p2: link to permacomputer.com

These links were lost during initial i18n extraction. Wu wei energy
that elites used to tombstone pig.py now unfolds neopig.py.
2026-01-08 14:57:46 -05:00
2c30aa8672 Restore full about page translations for all 27 languages
- Restored 7 translation keys that were compressed during initial i18n:
  - about_ch3_p4: 'pigs in an hg blanket' joke and (n,2n) reaction details
  - about_ch3_p5: 17.7 years cooling time detail
  - about_ch3_p6: 'Old pig was slaughtered' reference
  - about_ch9_truth/harmony/freedom/love: Full philosophical paragraphs

- Added apply_restored_translations.py utility script
- All 189 translations updated (27 languages × 7 keys)
2026-01-07 20:41:12 -05:00
3d0146f3be Add HUGE SOURCE CODE button to about page hero 2026-01-07 20:06:12 -05:00
c6bf3c375e Fix /page/{uri_hash} to render directly instead of redirecting 2026-01-06 17:26:58 -05:00
d91c0592ca Fix remaining import paths in serp/server.py
- async_web_fetcher -> neopig.async_web_fetcher
- screenshot -> neopig.screenshot

These were missed during the module reorganization, causing
/page/view and other endpoints to fail with import errors.
2026-01-06 15:44:22 -05:00
6193ce2724 Fix domain vault init check in finish_crawl/get_stats
- Add _initialized check to finish_crawl() and get_stats() in all 3 vault classes
- Prevents FileNotFoundError when git commands run on non-existent directories
- Update test_crawl.py to use pytest tmp_path fixture
- Add network marker to skip functional tests in CI with '-m "not network"'
2026-01-06 15:26:31 -05:00
45e851aa15 Fix database import in test_crawl.py 2026-01-06 14:54:25 -05:00
58c93f217a Reorganize project structure: move modules to neopig/, scripts to scripts/, data to data/ 2026-01-06 14:06:43 -05:00
ee7a193d0f Reduce become manifesto font size on mobile 2026-01-06 13:44:19 -05:00
b62add7af3 Link footer un. to unturf.com 2026-01-06 13:22:33 -05:00
b61959eb34 Link Marathon Fusion chrysopoeia citation to arxiv:2507.13461 2026-01-06 13:17:05 -05:00
af19d951a1 Increase become manifesto font sizes 2026-01-06 12:32:58 -05:00
d8e5d52d40 Vendor ChunkFive and highlight.js assets
- Add ChunkFive font (woff, woff2) for become manifesto
- Add highlight.js and GitHub Dark theme
- Update .gitignore to allow static/vendor/
2026-01-06 12:30:18 -05:00
d7e74dadab Add ChunkFive font and periods to become manifesto
- Vendor ChunkFive font for become phrases
- Add periods to all become_ translations (27 languages)
- Simplify become_un to just the prefix (un., in., не-., etc.)
- White color for finale un. in footer
2026-01-06 12:26:38 -05:00
17d7e576ea Scatter 'become un*' manifesto across chapters
- become ungovernable → Chapter II (Extinction) red
- become unstoppable → Chapter IV (Pig Awakens) orange
- become untouchable → Chapter V (Mirror) purple
- become unseen → Chapter VII (Skeleton Key) gray
- become unknown → Chapter VIII (Why We Archive) muted
- become un → Footer finale, large red
2026-01-06 12:05:38 -05:00
0a805a14a7 Complete definite article removal across all translations
Round 2 fixes:
- Quadrivium cite: El/O/Le/Das/Il/Het → removed (es/pt/fr/de/it/nl)
- French ch3_p3: Les années/Le web → Années/Web
- French ch3_p7: L'apprentissage → Apprentissage
- Italian: L'originale/I programmi/Il pensiero/Il machine/Il codice/Gli archivi
- Dutch: Het originele/De gedachte/De code/Het quadrivium

Pattern: 'a web is ephemeral' applied consistently
2026-01-06 11:54:25 -05:00
329cf1c454 Remove definite articles from about page body text
- Spanish: El/Los/La → removed or use Una (web)
- Portuguese: O/A → removed or use Uma (web)
- French: Le/Les/La → removed or use Une (web)
- German: Das/Der → removed or use Ein (web)
- Italian: Il/I/Gli/Le → removed or use Un (web)
- Dutch: Het/De → removed or use Een (web)
- Swedish: Den → removed or use En (webb)

Applies 'a web is ephemeral' pattern across all languages
2026-01-06 11:45:49 -05:00
2ac5681c69 Remove definite articles from about page translations
- about_ch2_title: Remove La/Das/De/Den (es/pt/fr/de/it/nl/sv)
- about_ch6_title: Remove Arsenalen → Arsenal (sv)
- about_ch11_title: Remove al/o/le/das/il/het/Grisen (6 langs)
2026-01-06 11:40:40 -05:00
1df1e9cc49 Update Langoliers translations for all 27 languages 2026-01-06 11:36:33 -05:00
061ea5b6f4 In loving memory of repos Atlassian fed to Langoliers 2026-01-06 11:32:59 -05:00
10b86ef745 Remove 'the' from about page - cleaner prose 2026-01-06 11:29:46 -05:00
b43e79e881 Fix: 'an original pig.py' not 'the original pig' 2026-01-06 11:21:57 -05:00
5fa60638ea Fix: 'our digital depths' not 'the' 2026-01-06 11:20:56 -05:00
7e67ee4900 Fix: 'bones' not 'the bones', 'our public domain' not 'the' 2026-01-06 11:19:58 -05:00
3494338ebf Rename animation to micronova 2026-01-06 10:37:10 -05:00
b503d471a7 Delay sign-maker link 1.2s to show full animation 2026-01-06 10:36:04 -05:00
093dddfcb4 Make sign-maker-mark (☉) a glowing sun link to unturf.com/software 2026-01-06 10:30:45 -05:00
2d3327fd2a Move sign-maker-mark to end of footer 2026-01-06 10:28:49 -05:00
0a3e9a638b Fix double 'Sorry for the convenience' in footer 2026-01-06 10:27:57 -05:00
db4eada111 Fix CI: add httpx to test deps (stale cache) 2026-01-06 09:40:10 -05:00
38a87e0b6b Add httpx for FastAPI TestClient 2026-01-06 09:37:40 -05:00
85d1d1e119 Add 'become un*' manifesto and cross to about footer
- become ungovernable/unstoppable/untouchable/unseen/unknown/un
- ✝️ cross with "Sorry for the convenience" (Mitch Hedberg)
- Translations in all 27 languages
2026-01-06 09:33:42 -05:00
0974593873 Refactor language handling to FastAPI Depends
- Replace get_lang() calls with Depends(get_language) dependency
- Language resolution: ?lang=XX query > cookie > Accept-Language header
- Middleware sets cookie, frontend cleans URL via history.replaceState
- view_page_by_hash now redirects instead of direct call
2026-01-06 08:25:50 -05:00