Maltfield Log/2026

From Eco-Libre

This is my (Michael Altfield's) work log from 2026

I intentionally make my log entries very verbose -- to make future volunteer's work easier. The more information that is dumped into this log, the more helpful it will be for future volunteers.

See Also

  1. Maltfield_Log
  2. User:Maltfield
  3. Special:Contributions/Maltfield

2026-04-28

  1. one of the authors of the CERN OHL license got back to me! https://forums.ohwr.org/t/possible-to-triple-license-cern-ohl-s-2-0-agpl-3-0-cc-by-sa-4-0/849882/6
  2. they confirmed what I said: don't license under 3 licenses, or the person who uses our stuff can choose which license they want. that's not good.
  3. unfortuantely they didn't comment on my copyright DEP5 file, so I asked them to
  4. in the meantime, I did look into REUSE
    1. it looked like a big PIA. their demo vid shows you having to define the license of every file. that's a nightmare.
    2. the docs said that there is a 'convert dep5'. that would be a lifesaver! https://codeberg.org/fsfe/reuse-tool
    3. I installed reuse from apt, but I discovered there is NO 'convert-dep5' option :(
    4. I tried, instead, to install from pip (very insecure but I did it in a dispVM), and it *does* have the 'convert-dep5' command
user@disp4360:~/sandbox/life-line$ pip install reuse
error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
	python3-xyz, where xyz is the package you are trying to
	install.
    
	If you wish to install a non-Debian-packaged Python package,
	create a virtual environment using python3 -m venv path/to/venv.
	Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
	sure you have python3-full installed.
    
	If you wish to install a non-Debian packaged Python application,
	it may be easiest to use pipx install xyz, which will manage a
	virtual environment for you. Make sure you have pipx installed.
    
	See /usr/share/doc/python3.11/README.venv for more information.

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.
user@disp4360:~/sandbox/life-line$

user@disp4360:~/sandbox/life-line$ sudo apt-get install python3-virtualenv
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
  python3-binaryornot python3-boolean python3-debian python3-license-expression
Use 'sudo apt autoremove' to remove them.
The following additional packages will be installed:
  python3-distlib python3-filelock python3-pip-whl python3-platformdirs
  python3-setuptools-whl python3-wheel-whl
The following NEW packages will be installed:
  python3-distlib python3-filelock python3-pip-whl python3-platformdirs
  python3-setuptools-whl python3-virtualenv python3-wheel-whl
0 upgraded, 7 newly installed, 0 to remove and 59 not upgraded.
Need to get 3,245 kB of archives.
After this operation, 4,914 kB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 https://deb.debian.org/debian bookworm/main amd64 python3-distlib all 0.3.6-1 [257 kB]
Get:2 https://deb.debian.org/debian bookworm/main amd64 python3-filelock all 3.9.0-1 [9,460 B]
Get:3 https://deb.debian.org/debian bookworm/main amd64 python3-pip-whl all 23.0.1+dfsg-1 [1,717 kB]
Get:4 https://deb.debian.org/debian bookworm/main amd64 python3-platformdirs all 2.6.0-1 [16.3 kB]
Get:5 https://deb.debian.org/debian bookworm/main amd64 python3-setuptools-whl all 66.1.1-1+deb12u2 [1,112 kB]
Get:6 https://deb.debian.org/debian bookworm/main amd64 python3-wheel-whl all 0.38.4-2 [38.6 kB]
Get:7 https://deb.debian.org/debian bookworm/main amd64 python3-virtualenv all 20.17.1+ds-1 [93.9 kB]
Fetched 3,245 kB in 4s (776 kB/s)        
Selecting previously unselected package python3-distlib.
(Reading database ... 450690 files and directories currently installed.)
Preparing to unpack .../0-python3-distlib_0.3.6-1_all.deb ...
Unpacking python3-distlib (0.3.6-1) ...
Selecting previously unselected package python3-filelock.
Preparing to unpack .../1-python3-filelock_3.9.0-1_all.deb ...
Unpacking python3-filelock (3.9.0-1) ...
Selecting previously unselected package python3-pip-whl.
Preparing to unpack .../2-python3-pip-whl_23.0.1+dfsg-1_all.deb ...
Unpacking python3-pip-whl (23.0.1+dfsg-1) ...
Selecting previously unselected package python3-platformdirs.
Preparing to unpack .../3-python3-platformdirs_2.6.0-1_all.deb ...
Unpacking python3-platformdirs (2.6.0-1) ...
Selecting previously unselected package python3-setuptools-whl.
Preparing to unpack .../4-python3-setuptools-whl_66.1.1-1+deb12u2_all.deb ...
Unpacking python3-setuptools-whl (66.1.1-1+deb12u2) ...
Selecting previously unselected package python3-wheel-whl.
Preparing to unpack .../5-python3-wheel-whl_0.38.4-2_all.deb ...
Unpacking python3-wheel-whl (0.38.4-2) ...
Selecting previously unselected package python3-virtualenv.
Preparing to unpack .../6-python3-virtualenv_20.17.1+ds-1_all.deb ...
Unpacking python3-virtualenv (20.17.1+ds-1) ...
Setting up python3-setuptools-whl (66.1.1-1+deb12u2) ...
Setting up python3-filelock (3.9.0-1) ...
Setting up python3-pip-whl (23.0.1+dfsg-1) ...
Setting up python3-distlib (0.3.6-1) ...
Setting up python3-platformdirs (2.6.0-1) ...
Setting up python3-wheel-whl (0.38.4-2) ...
Setting up python3-virtualenv (20.17.1+ds-1) ...
Processing triggers for man-db (2.11.2-2) ...
Scanning processes...                                                                    
Scanning linux images...                                                                 

No services need to be restarted.

No containers need to be restarted.

No user sessions are running outdated binaries.

No VM guests are running outdated hypervisor (qemu) binaries on this host.
user@disp4360:~/sandbox/life-line$ python3 -m virtualenv --python=python3.7 /tmp/virtualenv
RuntimeError: failed to find interpreter for Builtin discover of python_spec='python3.7'
user@disp4360:~/sandbox/life-line$

user@disp4360:~/sandbox/life-line$ python3 -m virtualenv --python=python3 /tmp/virtualenvcreated virtual environment CPython3.11.2.final.0-64 in 248ms
  creator CPython3Posix(dest=/tmp/virtualenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/user/.local/share/virtualenv)
	added seed packages: pip==23.0.1, setuptools==66.1.1, wheel==0.38.4
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator
user@disp4360:~/sandbox/life-line$

user@disp4360:~/sandbox/life-line$ source /tmp/virtualenv/bin/activate
(virtualenv) user@disp4360:~/sandbox/life-line$ pip install --user --upgrade reuse
ERROR: Can not perform a '--user' install. User site-packages are not visible in this virtualenv.
(virtualenv) user@disp4360:~/sandbox/life-line$

(virtualenv) user@disp4360:~/sandbox/life-line$ pip install  --upgrade reuse
Collecting reuse
  Downloading reuse-6.2.0.tar.gz (1.6 MB)
	 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.6/1.6 MB 696.8 kB/s eta 0:00:00
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Collecting Jinja2>=3.0.0
  Downloading jinja2-3.1.6-py3-none-any.whl (134 kB)
	 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 134.9/134.9 kB 576.8 kB/s eta 0:00:00
Collecting attrs>=23.2
  Downloading attrs-26.1.0-py3-none-any.whl (67 kB)
	 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 67.5/67.5 kB 674.1 kB/s eta 0:00:00
Collecting click>=8.1
  Downloading click-8.3.3-py3-none-any.whl (110 kB)
	 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 110.5/110.5 kB 1.1 MB/s eta 0:00:00
Collecting license-expression>=21.6.14
  Downloading license_expression-30.4.4-py3-none-any.whl (120 kB)
	 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 120.6/120.6 kB 1.3 MB/s eta 0:00:00
Collecting python-debian>=0.1.48
  Downloading python_debian-1.1.0-py3-none-any.whl (137 kB)
	 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 138.0/138.0 kB 819.7 kB/s eta 0:00:00
Collecting python-magic>=0.4.12
  Downloading python_magic-0.4.27-py2.py3-none-any.whl (13 kB)
Collecting tomlkit>=0.8
  Downloading tomlkit-0.14.0-py3-none-any.whl (39 kB)
Collecting MarkupSafe>=2.0
  Downloading markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (22 kB)
Collecting boolean.py>=4.0
  Downloading boolean_py-5.0-py3-none-any.whl (26 kB)
Collecting charset-normalizer
  Downloading charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (214 kB)
	 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 214.1/214.1 kB 1.3 MB/s eta 0:00:00
Building wheels for collected packages: reuse
  Building wheel for reuse (pyproject.toml) ... done
  Created wheel for reuse: filename=reuse-6.2.0-cp311-cp311-manylinux_2_36_x86_64.whl size=158934 sha256=db5cd3e5984de36238f3ead308c250b12c1cce318d17eb802313e29b25bd28cf
  Stored in directory: /home/user/.cache/pip/wheels/a0/8e/93/87a9da23115993a12577ff1fc8df222b28bd91e19b9987c529
Successfully built reuse
Installing collected packages: boolean.py, tomlkit, python-magic, MarkupSafe, license-expression, click, charset-normalizer, attrs, python-debian, Jinja2, reuse
Successfully installed Jinja2-3.1.6 MarkupSafe-3.0.3 attrs-26.1.0 boolean.py-5.0 charset-normalizer-3.4.7 click-8.3.3 license-expression-30.4.4 python-debian-1.1.0 python-magic-0.4.27 reuse-6.2.0 tomlkit-0.14.0
(virtualenv) user@disp4360:~/sandbox/life-line$

(virtualenv) user@disp4360:~/sandbox/life-line$ reuse --version
reuse, version 6.2.0

This program is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version.

This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with
this program. If not, see <https://www.gnu.org/licenses/>.
(virtualenv) user@disp4360:~/sandbox/life-line$ 

(virtualenv) user@disp4360:~/sandbox/life-line$ reuse convert-dep5
(virtualenv) user@disp4360:~/sandbox/life-line$ 
    1. no output; but it looked like it worked
(virtualenv) user@disp4360:~/sandbox/life-line$ reuse lint
# MISSING LICENSES

'AGPL-3.0' found in:
* docs/buildDocs.sh
* docs/conf.py
'CC-BY-SA-4.0' found in:
* .github/workflows/docs_pages_workflow.yml
* .gitignore
* CHANGELOG
* KEYS
* README.md
* docs/.gitignore
* docs/Makefile
* docs/_static/custom.css
* docs/_templates/versions.html
* docs/attribution.rst
* docs/build/index.rst
* docs/build/intake/bom.ods
* docs/build/intake/bom.rst
* docs/build/intake/index.rst
* docs/build/intake/what.rst
* docs/build/settling-tank/bom.rst
* docs/build/settling-tank/index.rst
* docs/build/settling-tank/what.rst
* docs/changelog.rst
* docs/conf.py.orig
* docs/dev/index.rst
* docs/faq.rst
* docs/images/eco-libre_logo-2025.08.svg
* docs/images/eco-libre_text-logo-2025.08.svg
* docs/images/eco-libre_text-logo-2025.08_500px.png
* docs/images/life-line_2023.12.jpg
* docs/images/life-line_2025.10.jpg
* docs/images/life-line_intake_cleanout-drain.jpg
* docs/images/life-line_intake_drum.jpg
* docs/images/life-line_intake_expanded-metal.jpg
* docs/images/life-line_intake_fine-mesh.jpg
* docs/images/life-line_intake_outflow.jpg
* docs/images/life-line_intake_parts.svg
* docs/images/life-line_intake_turbulence-bar.jpg
* docs/images/life-line_intake_weir.jpg
* docs/images/life-line_praxis_boris-plotkin.2024-11.jpg
* docs/images/life-line_praxis_vegan-beasts_screen.2025-04.jpg
* docs/images/life-line_praxis_vegan-beasts_weir.2025-04.jpg
* docs/index.rst
* docs/introduction/index.rst
* docs/license.rst
* docs/locales/es/LC_MESSAGES/autodoc.mo
* docs/locales/es/LC_MESSAGES/autodoc.po
* docs/locales/es/LC_MESSAGES/index.mo
* docs/locales/es/LC_MESSAGES/index.po
* docs/make.bat
* docs/praxis/index.rst
* docs/support.rst
* docs/theory/index.rst
'CERN-OHL-S-2.0' found in:
* intake.FCStd

# SUMMARY

* Bad licenses: 0
* Deprecated licenses: 0
* Licenses without file extension: 0
* Missing licenses: AGPL-3.0, CC-BY-SA-4.0, CERN-OHL-S-2.0
* Unused licenses: 0
* Used licenses: AGPL-3.0, CC-BY-SA-4.0, CERN-OHL-S-2.0
* Read errors: 0
* Invalid SPDX License Expressions: 0
* Files with copyright information: 52 / 52
* Files with license information: 52 / 52

Unfortunately, your project is not compliant with version 3.3 of the REUSE Specification :-(


# RECOMMENDATIONS

* Fix missing licenses: For at least one of the license identifiers provided by
  the 'SPDX-License-Identifier' tags, there is no corresponding license text
  file in the 'LICENSES' directory. For SPDX license identifiers, you can simply
  run 'reuse download --all' to get any missing ones. For custom licenses
  (starting with 'LicenseRef-'), you need to add these files yourself.

(virtualenv) user@disp4360:~/sandbox/life-line$ 
    1. ok, so it's just unhappy the licenses are missing; let's add them with the tool
(virtualenv) user@disp4360:~/sandbox/life-line$ reuse download
(virtualenv) user@disp4360:~/sandbox/life-line$ 

(virtualenv) user@disp4360:~/sandbox/life-line$ reuse download CC-BY-SA-4.0
Successfully downloaded LICENSES/CC-BY-SA-4.0.txt.
(virtualenv) user@disp4360:~/sandbox/life-line$

(virtualenv) user@disp4360:~/sandbox/life-line$ ls -lah LICENSES
total 28K
drwxr-xr-x 2 user user 4.0K Apr 28 16:43 .
drwxr-xr-x 7 user user 4.0K Apr 28 16:43 ..
-rw-r--r-- 1 user user  18K Apr 28 16:43 CC-BY-SA-4.0.txt
(virtualenv) user@disp4360:~/sandbox/life-line$ 

(virtualenv) user@disp4360:~/sandbox/life-line$ reuse download CERN-OHL-S-2.0
Successfully downloaded LICENSES/CERN-OHL-S-2.0.txt.
(virtualenv) user@disp4360:~/sandbox/life-line$ 

(virtualenv) user@disp4360:~/sandbox/life-line$ reuse download AGPL-3.0
Successfully downloaded LICENSES/AGPL-3.0.txt.
(virtualenv) user@disp4360:~/sandbox/life-line$ 

(virtualenv) user@disp4360:~/sandbox/life-line$ ls -lah LICENSES
total 80K
drwxr-xr-x 2 user user 4.0K Apr 28 16:44 .
drwxr-xr-x 7 user user 4.0K Apr 28 16:43 ..
-rw-r--r-- 1 user user  34K Apr 28 16:44 AGPL-3.0.txt
-rw-r--r-- 1 user user  18K Apr 28 16:43 CC-BY-SA-4.0.txt
-rw-r--r-- 1 user user  14K Apr 28 16:43 CERN-OHL-S-2.0.txt
(virtualenv) user@disp4360:~/sandbox/life-line$ 
    1. wut. they said we can't use AGPL-3.0?
(virtualenv) user@disp4360:~/sandbox/life-line$ reuse lint
# DEPRECATED LICENSES

The following licenses are deprecated by SPDX:
* AGPL-3.0

# SUMMARY

* Bad licenses: 0
* Deprecated licenses: AGPL-3.0
* Licenses without file extension: 0
* Missing licenses: 0
* Unused licenses: 0
* Used licenses: AGPL-3.0, CC-BY-SA-4.0, CERN-OHL-S-2.0
* Read errors: 0
* Invalid SPDX License Expressions: 0
* Files with copyright information: 52 / 52
* Files with license information: 52 / 52

Unfortunately, your project is not compliant with version 3.3 of the REUSE Specification :-(


# RECOMMENDATIONS

* Fix deprecated licenses: At least one of the licenses in the LICENSES
  directory and/or provided by an 'SPDX-License-Identifier' tag or in
  '.reuse/dep5' has been deprecated by SPDX. The current list and their
  respective recommended  new identifiers can be found here:
  <https://spdx.org/licenses/#deprecated>

(virtualenv) user@disp4360:~/sandbox/life-line$ 
    1. ok, apparently they want one of these https://spdx.org/licenses/
      1. AGPL-3.0-only
      2. AGPL-3.0-or-later
    2. ugh, they deleted our dep5 file; appraently it puts everything in a REUSE.toml file (there's no .license files everywhere, which I do like)
(virtualenv) user@disp4360:~/sandbox/life-line$ ls -lah .reuse/
total 8.0K
drwxr-xr-x 2 user user 4.0K Apr 28 16:34 .
drwxr-xr-x 7 user user 4.0K Apr 28 16:43 ..
(virtualenv) user@disp4360:~/sandbox/life-line$ 

(virtualenv) user@disp4360:~/sandbox/life-line$ ls -lah
total 376K
drwxr-xr-x  7 user user 4.0K Apr 28 16:43 .
drwxr-xr-x  3 user user 4.0K Apr 28 16:23 ..
-rw-r--r--  1 user user  531 Apr 28 16:23 CHANGELOG
drwxr-xr-x 11 user user 4.0K Apr 28 16:23 docs
drwxr-xr-x  8 user user 4.0K Apr 28 16:28 .git
drwxr-xr-x  3 user user 4.0K Apr 28 16:23 .github
-rw-r--r--  1 user user   44 Apr 28 16:23 .gitignore
-rw-r--r--  1 user user 221K Apr 28 16:23 intake.FCStd
-rw-r--r--  1 user user  71K Apr 28 16:23 KEYS
-rw-r--r--  1 user user  35K Apr 28 16:23 LICENSE
drwxr-xr-x  2 user user 4.0K Apr 28 16:44 LICENSES
-rw-r--r--  1 user user 1.3K Apr 28 16:23 README.md
drwxr-xr-x  2 user user 4.0K Apr 28 16:34 .reuse
-rw-r--r--  1 user user 1.7K Apr 28 16:34 REUSE.toml
(virtualenv) user@disp4360:~/sandbox/life-line$ 
    1. oh, this isn't so bad. I was afriad it would literally list every single file, but instead it more-or-less just adapted what I had for the dep5 format
(virtualenv) user@disp4360:~/sandbox/life-line$ cat REUSE.toml 
version = 1
SPDX-PackageName = "Eco-Libre Life-Line"
SPDX-PackageSupplier = "https://eco-libre.org/contact"
SPDX-PackageDownloadLocation = "https://github.com/Eco-Libre/life-line"

[[annotations]]
path = "**"
precedence = "aggregate"
SPDX-FileCopyrightText = ["", "2023 Michael Altfield <https://email.michaelaltfield.net>", "2023 Eco-Libre <https://eco-libre.org/contact>"]
SPDX-License-Identifier = "CC-BY-SA-4.0"

[[annotations]]
path = ["**.FCStd", "**.scad", "**.fzz", "**.blend", "**.kicad_pcb", "**.sh3d", "**.vue", "**.dxf", "**.dwg", "**.bim", "**.skp", "**.skb", "**.max", "**.3ds", "**.gto", "**.pod", "**.brd", "**.sch", "**.3dm", "**.dwb", "**.slddrw", "**.sldasm"]
precedence = "aggregate"
SPDX-FileCopyrightText = ["", "2023 Michael Altfield <https://email.michaelaltfield.net>", "2023 Eco-Libre <https://eco-libre.org/contact>"]
SPDX-License-Identifier = "CERN-OHL-S-2.0"

[[annotations]]
path = ["**.c", "**.cpp", "**.h", "**.hpp", "**.cc", "**.ino", "**.pde", "**.make", "**.automake", "**.cmake", "**.java", "**.javacc", "**.rust", "**.d", "**.j", "**.r", "**.sh", "**.bash", "**.zsh", "**.awk", "**.tcl", "**.py", "**.python", "**.python2", "**.python3", "**.FCMacro", "**.pl", "**.perl", "**.kivy", "**.qix", "**.dtd", "**.shp", "**.shz", "**.dbf", "**.shx", "**.prj", "**.kml", "**.php", "**.js", "**.javascript", "**.typescript", "**.ruby", "**.eruby", "**.cuda", "**.erlang", "**.lisp", "**.lua", "**.haskell", "**.go", "**.autohotkey", "**.basic", "**.swift", "**.vb", "**.asp"]
precedence = "aggregate"
SPDX-FileCopyrightText = ["", "2023 Michael Altfield <https://email.michaelaltfield.net>", "2023 Eco-Libre <https://eco-libre.org/contact>"]
SPDX-License-Identifier = "AGPL-3.0"
(virtualenv) user@disp4360:~/sandbox/life-line$ 
    1. I edited the file, but the lint still isn't happy. I guess I have to update the LICENSES dir from AGPL-3.0 to AGPL-3.0-only :/
(virtualenv) user@disp4360:~/sandbox/life-line$ vim REUSE.toml 
(virtualenv) user@disp4360:~/sandbox/life-line$ 

(virtualenv) user@disp4360:~/sandbox/life-line$ reuse lint
# DEPRECATED LICENSES

The following licenses are deprecated by SPDX:
* AGPL-3.0

# MISSING LICENSES

'AGPL-3.0-only' found in:
* docs/buildDocs.sh
* docs/conf.py

# UNUSED LICENSES

The following licenses are not used:
* AGPL-3.0

# SUMMARY

* Bad licenses: 0
* Deprecated licenses: AGPL-3.0
* Licenses without file extension: 0
* Missing licenses: AGPL-3.0-only
* Unused licenses: AGPL-3.0
* Used licenses: AGPL-3.0-only, CC-BY-SA-4.0, CERN-OHL-S-2.0
* Read errors: 0
* Invalid SPDX License Expressions: 0
* Files with copyright information: 52 / 52
* Files with license information: 52 / 52

Unfortunately, your project is not compliant with version 3.3 of the REUSE Specification :-(


# RECOMMENDATIONS

* Fix deprecated licenses: At least one of the licenses in the LICENSES
  directory and/or provided by an 'SPDX-License-Identifier' tag or in
  '.reuse/dep5' has been deprecated by SPDX. The current list and their
  respective recommended  new identifiers can be found here:
  <https://spdx.org/licenses/#deprecated>
* Fix missing licenses: For at least one of the license identifiers provided by
  the 'SPDX-License-Identifier' tags, there is no corresponding license text
  file in the 'LICENSES' directory. For SPDX license identifiers, you can simply
  run 'reuse download --all' to get any missing ones. For custom licenses
  (starting with 'LicenseRef-'), you need to add these files yourself.
* Fix unused licenses: At least one of the license text files in 'LICENSES' is
  not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please
  make sure that you either tag the accordingly licensed files properly, or
  delete the unused license text if you are sure that no file or code snippet is
  licensed as such.

(virtualenv) user@disp4360:~/sandbox/life-line$ 
    1. ok, now it's happy
(virtualenv) user@disp4360:~/sandbox/life-line$ ls -lah LICENSES
total 80K
drwxr-xr-x 2 user user 4.0K Apr 28 16:44 .
drwxr-xr-x 7 user user 4.0K Apr 28 16:50 ..
-rw-r--r-- 1 user user  34K Apr 28 16:44 AGPL-3.0.txt
-rw-r--r-- 1 user user  18K Apr 28 16:43 CC-BY-SA-4.0.txt
-rw-r--r-- 1 user user  14K Apr 28 16:43 CERN-OHL-S-2.0.txt
(virtualenv) user@disp4360:~/sandbox/life-line$ 
(virtualenv) user@disp4360:~/sandbox/life-line$ rm LICENSES/AGPL-3.0.txt 
(virtualenv) user@disp4360:~/sandbox/life-line$ 
(virtualenv) user@disp4360:~/sandbox/life-line$ reuse download AGPL-3.0-only
Successfully downloaded LICENSES/AGPL-3.0-only.txt.
(virtualenv) user@disp4360:~/sandbox/life-line$ 
(virtualenv) user@disp4360:~/sandbox/life-line$ reuse lint
# SUMMARY

* Bad licenses: 0
* Deprecated licenses: 0
* Licenses without file extension: 0
* Missing licenses: 0
* Unused licenses: 0
* Used licenses: AGPL-3.0-only, CC-BY-SA-4.0, CERN-OHL-S-2.0
* Read errors: 0
* Invalid SPDX License Expressions: 0
* Files with copyright information: 52 / 52
* Files with license information: 52 / 52

Congratulations! Your project is compliant with version 3.3 of the REUSE Specification :-)
(virtualenv) user@disp4360:~/sandbox/life-line$ 
    1. anyway, here's our final file
(virtualenv) user@disp4360:~/sandbox/life-line$ cat REUSE.toml 
version = 1
SPDX-PackageName = "Eco-Libre Life-Line"
SPDX-PackageSupplier = "https://eco-libre.org/contact"
SPDX-PackageDownloadLocation = "https://github.com/Eco-Libre/life-line"

[[annotations]]
path = "**"
precedence = "aggregate"
SPDX-FileCopyrightText = ["", "2023 Michael Altfield <https://email.michaelaltfield.net>", "2023 Eco-Libre <https://eco-libre.org/contact>"]
SPDX-License-Identifier = "CC-BY-SA-4.0"

[[annotations]]
path = ["**.FCStd", "**.scad", "**.fzz", "**.blend", "**.kicad_pcb", "**.sh3d", "**.vue", "**.dxf", "**.dwg", "**.bim", "**.skp", "**.skb", "**.max", "**.3ds", "**.gto", "**.pod", "**.brd", "**.sch", "**.3dm", "**.dwb", "**.slddrw", "**.sldasm"]
precedence = "aggregate"
SPDX-FileCopyrightText = ["", "2023 Michael Altfield <https://email.michaelaltfield.net>", "2023 Eco-Libre <https://eco-libre.org/contact>"]
SPDX-License-Identifier = "CERN-OHL-S-2.0"

[[annotations]]
path = ["**.c", "**.cpp", "**.h", "**.hpp", "**.cc", "**.ino", "**.pde", "**.make", "**.automake", "**.cmake", "**.java", "**.javacc", "**.rust", "**.d", "**.j", "**.r", "**.sh", "**.bash", "**.zsh", "**.awk", "**.tcl", "**.py", "**.python", "**.python2", "**.python3", "**.FCMacro", "**.pl", "**.perl", "**.kivy", "**.qix", "**.dtd", "**.shp", "**.shz", "**.dbf", "**.shx", "**.prj", "**.kml", "**.php", "**.js", "**.javascript", "**.typescript", "**.ruby", "**.eruby", "**.cuda", "**.erlang", "**.lisp", "**.lua", "**.haskell", "**.go", "**.autohotkey", "**.basic", "**.swift", "**.vb", "**.asp"]
precedence = "aggregate"
SPDX-FileCopyrightText = ["", "2023 Michael Altfield <https://email.michaelaltfield.net>", "2023 Eco-Libre <https://eco-libre.org/contact>"]
SPDX-License-Identifier = "AGPL-3.0-only"
(virtualenv) user@disp4360:~/sandbox/life-line$
    1. looks like that only created the toml file. None of the files are actually annoated; we do that with `reuse annotate`
      1. apparently that command only works for individual files, so I did some find magic
(virtualenv) user@disp4360:~/sandbox/life-line$ find . -type f -exec reuse annotate --copyright --license '{}' \;
Successfully changed header of docs/license.rst
Successfully changed header of docs/build/intake/bom.rst
Successfully changed header of docs/build/intake/index.rst
Successfully changed header of docs/build/intake/bom.ods.license
Successfully changed header of docs/build/intake/what.rst
Successfully changed header of docs/build/index.rst
Successfully changed header of docs/build/settling-tank/bom.rst
Successfully changed header of docs/build/settling-tank/index.rst
Successfully changed header of docs/build/settling-tank/what.rst
Successfully changed header of docs/support.rst
Successfully changed header of docs/theory/index.rst
Successfully changed header of docs/make.bat
Successfully changed header of docs/buildDocs.sh
Successfully changed header of docs/images/life-line_intake_cleanout-drain.jpg.license
Successfully changed header of docs/images/life-line_intake_outflow.jpg.license
Successfully changed header of docs/images/life-line_2025.10.jpg.license
Successfully changed header of docs/images/life-line_2023.12.jpg.license
Successfully changed header of docs/images/life-line_intake_drum.jpg.license
Successfully changed header of docs/images/life-line_praxis_vegan-beasts_weir.2025-04.jpg.license
Successfully changed header of docs/images/life-line_praxis_vegan-beasts_screen.2025-04.jpg.license
Successfully changed header of docs/images/life-line_intake_turbulence-bar.jpg.license
Successfully changed header of docs/images/life-line_praxis_boris-plotkin.2024-11.jpg.license
Successfully changed header of docs/images/life-line_intake_fine-mesh.jpg.license
Successfully changed header of docs/images/eco-libre_logo-2025.08.svg.license
Successfully changed header of docs/images/eco-libre_text-logo-2025.08.svg.license
Successfully changed header of docs/images/life-line_intake_weir.jpg.license
Successfully changed header of docs/images/life-line_intake_parts.svg.license
Successfully changed header of docs/images/eco-libre_text-logo-2025.08_500px.png.license
Successfully changed header of docs/images/life-line_intake_expanded-metal.jpg.license
Successfully changed header of docs/praxis/index.rst
Successfully changed header of docs/introduction/index.rst
Successfully changed header of docs/_static/custom.css
Successfully changed header of docs/index.rst
Successfully changed header of docs/Makefile
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

docs/conf.py.orig
Successfully changed header of docs/conf.py
Successfully changed header of docs/faq.rst
Successfully changed header of docs/.gitignore
Successfully changed header of docs/attribution.rst
Successfully changed header of docs/changelog.rst
Successfully changed header of docs/_templates/versions.html
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

docs/locales/es/LC_MESSAGES/autodoc.mo
Successfully changed header of docs/locales/es/LC_MESSAGES/index.po
Successfully changed header of docs/locales/es/LC_MESSAGES/autodoc.po
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

docs/locales/es/LC_MESSAGES/index.mo
Successfully changed header of docs/dev/index.rst
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

CHANGELOG
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

LICENSES/CC-BY-SA-4.0.txt
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

LICENSES/CERN-OHL-S-2.0.txt
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

LICENSES/AGPL-3.0-only.txt
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: Invalid value for 'PATH': Path './.git/objects/pack/pack-38957d03ba60a2a9101b19234fac447289823e43.idx' is not writable.
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: Invalid value for 'PATH': Path './.git/objects/pack/pack-38957d03ba60a2a9101b19234fac447289823e43.pack' is not writable.
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

.git/logs/HEAD
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

.git/logs/refs/remotes/origin/HEAD
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

.git/logs/refs/heads/main
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

.git/hooks/pre-push.sample
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

.git/hooks/post-update.sample
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

.git/hooks/pre-rebase.sample
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

.git/hooks/update.sample
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

.git/hooks/push-to-checkout.sample
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

.git/hooks/pre-receive.sample
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

.git/hooks/prepare-commit-msg.sample
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

.git/hooks/applypatch-msg.sample
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

.git/hooks/pre-merge-commit.sample
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

.git/hooks/pre-applypatch.sample
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

.git/hooks/pre-commit.sample
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

.git/hooks/fsmonitor-watchman.sample
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

.git/hooks/commit-msg.sample
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

.git/config
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

.git/HEAD
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

.git/description
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

.git/info/exclude
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

.git/index
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

.git/refs/remotes/origin/HEAD
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

.git/refs/heads/main
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

.git/packed-refs
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

KEYS
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

intake.FCStd
Successfully changed header of REUSE.toml
Successfully changed header of .gitignore
Successfully changed header of README.md
Successfully changed header of .github/workflows/docs_pages_workflow.yml
Usage: reuse annotate [OPTIONS] PATH
Try 'reuse annotate --help' for help.

Error: The following files do not have a recognised file extension. Please use '--style', '--force-dot-license', '--fallback-dot-license', or '--skip-unrecognised':

LICENSE
(virtualenv) user@disp4360:~/sandbox/life-line$ 
    1. ah fuk, that didn't do what we wanted at all. I expected it would have pulled the copyright info from the REUSE.toml file. Instead it just took the contents '--license' as the value of the copyright attribute :(
(virtualenv) user@disp4360:~/sandbox/life-line$ head docs/faq.rst 
.. SPDX-FileCopyrightText: 2026 --license

.. _faq:

Frequently Asked Questions
==========================

.. _faq_follow:

Q: How can I get updates about Eco-Libre?
(virtualenv) user@disp4360:~/sandbox/life-line$ 
    1. the faq says that we *should* update headers to every file, but it's not necessary if we use `REUSE.toml` file – as was also indicated with the `reuse lint` output above https://reuse.software/faq/
    2. we can, at any time, get a list of every file's copyright and license using the `reuse spdx` command
(virtualenv) user@disp4360:~/sandbox/life-line$ reuse spdx
SPDXVersion: SPDX-2.1
DataLicense: CC0-1.0
SPDXID: SPDXRef-DOCUMENT
DocumentName: life-line
DocumentNamespace: http://spdx.org/spdxdocs/spdx-v2.1-16677618-7d18-4c76-8411-c508a053c01d
Creator: Person: Anonymous ()
Creator: Organization: Anonymous ()
Creator: Tool: reuse-6.2.0
Created: 2026-04-28T22:19:51Z
CreatorComment: <text>This document was created automatically using available reuse information consistent with REUSE.</text>
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-97ed0fdad1415bc2a07967691fb8b548
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5a39e4fd6c4d6fe353cacabc360bd279
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-25ab5821b678be2b2b12d29b956be405
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3a1f36e95ccd2fd666e9798d3ac7eb47
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-21b8c0e80d2658f4b88b5a3938551f27
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1a8de53ae2a6abc46eb8ed1144b7a1f9
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f9fec76b2bf698c8fb90b872cd0318c1
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-10a5417ebf693664c167892a336585dc
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3baf92437e62e7b84893396f6d6d2c31
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-120ec97787268d2d531b284f8f238388
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-96f0aa3db80b8611b0cad4fd7f43d887
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-55954c104527c72b6f63da5076e914f7
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-87ca5b46937380db7a2e234fe72b2988
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ce4d5cb6868565afb76744142953776c
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7df4243f95862b10bf244e1a932a1305
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-009fc4d41e5673f7da41e8b27bd3ebd6
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-87008e367a587fb44b1e9b7aaa52f6b6
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c531371aac660823102048108ce60921
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-732742039a9682c0d5bfa8d8845abb5f
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1228cd07cdef9163c78a4847c409b29e
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f039812ae7f967b8f08d9147e2fd4153
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-35b1d5815fbbdd7c4356fb3b3cba3b1e
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c1aae1897500b74ec3aaca84335f882f
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3598f5057a1cdb741af433a6096d913d
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c17ac5ff4f166b672e4510ff2c577dbc
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7b9171fdbbab79cca77d36069477c84a
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7a9621b85efc539284dde0394be036d8
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4658cb22cc4a9761f1206a7297889577
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-49300cf0d117ccc668836b524d21d3f9
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d6b38587054ac699a38698e0eefb93c8
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-49b84e58657e7ccc299f61b0cf539e20
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-39d79d9e7219bdbab89178b7dc21d0da
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ed584b122f50739f0fda5917ea3f7f59
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1e2b0fda7ea1435b44332b7c8900d12a
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2595e40eb2dc20ee8fc015548806efdc
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fdc6a9c01b345699ecf781d28fa90f5a
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9cd72e674f0f994995a06528ee25ce2f
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9cc2a1a37bc4829e8725d74912f56b16
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e2350358bd19a26c28ac28cc5e18c5a1
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b33bfd4d5eec5e96e039ec43915bfbf8
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7015c357dbfa9a8c1900250df442c421
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4dedfba4994163f7e688743fc42a33d6
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-89b9ed2df6780dc61cffdf6dab799cff
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-eb10117cc0b1fcd44808cc34f4cb1083
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f1dc0b0fba5c4ce78e065efb774669a8
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-01067d41eee220cdd87bfbf80ea71e87
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-111708d19b33da1a42118224ef69665e
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-472c7aaf2054b6662a0f02656ff453e0
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f373dac39205edb0975081cc2411a334
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3d7c4e6cccb3294880a3d23a9edc019c
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fe7b87a77ea58c18a39d99c8cc4fd9b8
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8979307823bc12e1df0c4754fb92b50a

FileName: ./.github/workflows/docs_pages_workflow.yml
SPDXID: SPDXRef-97ed0fdad1415bc2a07967691fb8b548
FileChecksum: SHA1: 9d6615d72965d4a93b8f7b9eb83b6484b44dee95
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./.gitignore
SPDXID: SPDXRef-5a39e4fd6c4d6fe353cacabc360bd279
FileChecksum: SHA1: ac7e0839e77460fca604674fb11218c9fca3a62b
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./CHANGELOG
SPDXID: SPDXRef-25ab5821b678be2b2b12d29b956be405
FileChecksum: SHA1: 0d0ca350f7daa0808bebebd0a65784358dfc45c3
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./KEYS
SPDXID: SPDXRef-3a1f36e95ccd2fd666e9798d3ac7eb47
FileChecksum: SHA1: f97678ccd0eed19288e1962a838be2f4aa8b7c43
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./README.md
SPDXID: SPDXRef-21b8c0e80d2658f4b88b5a3938551f27
FileChecksum: SHA1: 954a6f4347c29a012ef72704606756c843b6a522
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
Copyright (C) 2023 Michael Altfield and the Eco-Libre Team
SPDX-FileCopyrightText: </text>

FileName: ./docs/.gitignore
SPDXID: SPDXRef-1a8de53ae2a6abc46eb8ed1144b7a1f9
FileChecksum: SHA1: 71683d32ff456772212653e2e836b217c3b7fb73
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/Makefile
SPDXID: SPDXRef-f9fec76b2bf698c8fb90b872cd0318c1
FileChecksum: SHA1: 77b7d944eb62d73c1f46a1cfcba1e70e31e4297a
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/_static/custom.css
SPDXID: SPDXRef-10a5417ebf693664c167892a336585dc
FileChecksum: SHA1: 6cd536f874aadf0ccc0a0e17ad33f948b4fba44c
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/_templates/versions.html
SPDXID: SPDXRef-3baf92437e62e7b84893396f6d6d2c31
FileChecksum: SHA1: 8443bd4bfd306f5b6cf6485e6a6cff5599def6f7
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/attribution.rst
SPDXID: SPDXRef-120ec97787268d2d531b284f8f238388
FileChecksum: SHA1: e4b0c037aac62dc9b64293fe57a188f6bf4c5615
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/build/index.rst
SPDXID: SPDXRef-96f0aa3db80b8611b0cad4fd7f43d887
FileChecksum: SHA1: 464d9b8ffa36876d3eb0c95a093f4c212d80ff1b
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/build/intake/bom.ods
SPDXID: SPDXRef-55954c104527c72b6f63da5076e914f7
FileChecksum: SHA1: 916d43e423eea34a6b63c4cc36190b998b426d85
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: 2026 --license
SPDX-FileCopyrightText: </text>

FileName: ./docs/build/intake/bom.rst
SPDXID: SPDXRef-87ca5b46937380db7a2e234fe72b2988
FileChecksum: SHA1: b72018fd716c9cd1f44b96e84a97d7891a9659c2
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/build/intake/index.rst
SPDXID: SPDXRef-ce4d5cb6868565afb76744142953776c
FileChecksum: SHA1: 73e83f3d88739f3a711cdc22d05a17e5e46135a0
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/build/intake/what.rst
SPDXID: SPDXRef-7df4243f95862b10bf244e1a932a1305
FileChecksum: SHA1: e444a37cc9615febee656e969dac625b9c2014ba
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/build/settling-tank/bom.rst
SPDXID: SPDXRef-009fc4d41e5673f7da41e8b27bd3ebd6
FileChecksum: SHA1: e03a27e7d09a23245baa962f0f4ea12fac7ea6d2
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/build/settling-tank/index.rst
SPDXID: SPDXRef-87008e367a587fb44b1e9b7aaa52f6b6
FileChecksum: SHA1: f8ff63ef2190341ea2bd810c300d54b83d5d3674
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/build/settling-tank/what.rst
SPDXID: SPDXRef-c531371aac660823102048108ce60921
FileChecksum: SHA1: 57a0fa949c5e6e46eca53d0889f152c2962bfa61
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/buildDocs.sh
SPDXID: SPDXRef-732742039a9682c0d5bfa8d8845abb5f
FileChecksum: SHA1: befd1b0246b958791ad57f4e18bbba43d8872cd7
LicenseConcluded: NOASSERTION
LicenseInfoInFile: AGPL-3.0-only
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/changelog.rst
SPDXID: SPDXRef-1228cd07cdef9163c78a4847c409b29e
FileChecksum: SHA1: 26793d0a9acc383ba3ccfa7d622b7071db91418e
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/conf.py
SPDXID: SPDXRef-f039812ae7f967b8f08d9147e2fd4153
FileChecksum: SHA1: 96026b86d9255c306df4b1fc8b2f5e94cc66c529
LicenseConcluded: NOASSERTION
LicenseInfoInFile: AGPL-3.0-only
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: 
© ' +copyright,</text>

FileName: ./docs/conf.py.orig
SPDXID: SPDXRef-35b1d5815fbbdd7c4356fb3b3cba3b1e
FileChecksum: SHA1: 71f3dc660a741b97542c68e32eaa33c80dc42630
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/dev/index.rst
SPDXID: SPDXRef-c1aae1897500b74ec3aaca84335f882f
FileChecksum: SHA1: 8075e5fb62dcb27431df32d5928e7561d66a2c46
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/faq.rst
SPDXID: SPDXRef-3598f5057a1cdb741af433a6096d913d
FileChecksum: SHA1: f3b1399a843bcd73a4eb67e1fc62a4e090b2377a
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/images/eco-libre_logo-2025.08.svg
SPDXID: SPDXRef-c17ac5ff4f166b672e4510ff2c577dbc
FileChecksum: SHA1: d582ec414c54cea2834891d35349c09ae069cbbd
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: 2026 --license
SPDX-FileCopyrightText: </text>

FileName: ./docs/images/eco-libre_text-logo-2025.08.svg
SPDXID: SPDXRef-7b9171fdbbab79cca77d36069477c84a
FileChecksum: SHA1: 513c03e164c26e0b35644bee03625b8d343fc49b
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: 2026 --license
SPDX-FileCopyrightText: </text>

FileName: ./docs/images/eco-libre_text-logo-2025.08_500px.png
SPDXID: SPDXRef-7a9621b85efc539284dde0394be036d8
FileChecksum: SHA1: de27a5411a683f090c1b543c1e93f8164c4d44cc
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: 2026 --license
SPDX-FileCopyrightText: </text>

FileName: ./docs/images/life-line_2023.12.jpg
SPDXID: SPDXRef-4658cb22cc4a9761f1206a7297889577
FileChecksum: SHA1: 8bff1f109f6f7ebc2accd5996d13fb94f7e8939a
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: 2026 --license
SPDX-FileCopyrightText: </text>

FileName: ./docs/images/life-line_2025.10.jpg
SPDXID: SPDXRef-49300cf0d117ccc668836b524d21d3f9
FileChecksum: SHA1: af42083713949fb9aac751421fc9a5fc3e794e4d
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: 2026 --license
SPDX-FileCopyrightText: </text>

FileName: ./docs/images/life-line_intake_cleanout-drain.jpg
SPDXID: SPDXRef-d6b38587054ac699a38698e0eefb93c8
FileChecksum: SHA1: 2652eedb0face5fececa50537198fc0f3aaf6092
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: 2026 --license
SPDX-FileCopyrightText: </text>

FileName: ./docs/images/life-line_intake_drum.jpg
SPDXID: SPDXRef-49b84e58657e7ccc299f61b0cf539e20
FileChecksum: SHA1: e26715adcf558fe12f4eded7308bc1be3e12761c
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: 2026 --license
SPDX-FileCopyrightText: </text>

FileName: ./docs/images/life-line_intake_expanded-metal.jpg
SPDXID: SPDXRef-39d79d9e7219bdbab89178b7dc21d0da
FileChecksum: SHA1: 0d0c3398256d96884fcd11daaebc4507b23d7750
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: 2026 --license
SPDX-FileCopyrightText: </text>

FileName: ./docs/images/life-line_intake_fine-mesh.jpg
SPDXID: SPDXRef-ed584b122f50739f0fda5917ea3f7f59
FileChecksum: SHA1: 4b3786e5f403c70f9598350c04cf12abb4a790aa
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: 2026 --license
SPDX-FileCopyrightText: </text>

FileName: ./docs/images/life-line_intake_outflow.jpg
SPDXID: SPDXRef-1e2b0fda7ea1435b44332b7c8900d12a
FileChecksum: SHA1: 0b7db555483b713324756799e657d2324bdab4f7
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: 2026 --license
SPDX-FileCopyrightText: </text>

FileName: ./docs/images/life-line_intake_parts.svg
SPDXID: SPDXRef-2595e40eb2dc20ee8fc015548806efdc
FileChecksum: SHA1: d98da9d0de766b61df6fb0c25f61521a3d26344a
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: 2026 --license
SPDX-FileCopyrightText: </text>

FileName: ./docs/images/life-line_intake_turbulence-bar.jpg
SPDXID: SPDXRef-fdc6a9c01b345699ecf781d28fa90f5a
FileChecksum: SHA1: 0f9c8372c9737ad1bac27204292c6aa7e5098813
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: 2026 --license
SPDX-FileCopyrightText: </text>

FileName: ./docs/images/life-line_intake_weir.jpg
SPDXID: SPDXRef-9cd72e674f0f994995a06528ee25ce2f
FileChecksum: SHA1: 7f64e42c9fe3b1d2c7d1ae1ece0b55bf544c781a
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: 2026 --license
SPDX-FileCopyrightText: </text>

FileName: ./docs/images/life-line_praxis_boris-plotkin.2024-11.jpg
SPDXID: SPDXRef-9cc2a1a37bc4829e8725d74912f56b16
FileChecksum: SHA1: baef65c6984d5b04e1cf44d435f471be0727bfd1
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: 2026 --license
SPDX-FileCopyrightText: </text>

FileName: ./docs/images/life-line_praxis_vegan-beasts_screen.2025-04.jpg
SPDXID: SPDXRef-e2350358bd19a26c28ac28cc5e18c5a1
FileChecksum: SHA1: d21be6517081f4f294ed88dca32a920e6bfeaadf
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: 2026 --license
SPDX-FileCopyrightText: </text>

FileName: ./docs/images/life-line_praxis_vegan-beasts_weir.2025-04.jpg
SPDXID: SPDXRef-b33bfd4d5eec5e96e039ec43915bfbf8
FileChecksum: SHA1: ba75a617970d7819263e2f21f0d52dcaa61c961c
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: 2026 --license
SPDX-FileCopyrightText: </text>

FileName: ./docs/index.rst
SPDXID: SPDXRef-7015c357dbfa9a8c1900250df442c421
FileChecksum: SHA1: e2618dda841766cbd533441dbd21fcfa55e2f119
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/introduction/index.rst
SPDXID: SPDXRef-4dedfba4994163f7e688743fc42a33d6
FileChecksum: SHA1: 636e89b3596a43b9ca869502795fdc1956101d1c
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/license.rst
SPDXID: SPDXRef-89b9ed2df6780dc61cffdf6dab799cff
FileChecksum: SHA1: c858a38846985c5a96c11c170468688b2860f529
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/locales/es/LC_MESSAGES/autodoc.mo
SPDXID: SPDXRef-eb10117cc0b1fcd44808cc34f4cb1083
FileChecksum: SHA1: 3b2fa212f0265c96b1cde5a8cc061cc49385ed96
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/locales/es/LC_MESSAGES/autodoc.po
SPDXID: SPDXRef-f1dc0b0fba5c4ce78e065efb774669a8
FileChecksum: SHA1: 58fca147c574cbda23a9c7a5ce420f6385d80ca1
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>Copyright (C) 2020 Michael Altfield
SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/locales/es/LC_MESSAGES/index.mo
SPDXID: SPDXRef-01067d41eee220cdd87bfbf80ea71e87
FileChecksum: SHA1: f6dda249389c9eb42684431b13c68bbb98530c35
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/locales/es/LC_MESSAGES/index.po
SPDXID: SPDXRef-111708d19b33da1a42118224ef69665e
FileChecksum: SHA1: 21c57fcf054a05fcf4e0ef8660a6a38f98239e80
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>Copyright (C) 2020 Michael Altfield
SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/make.bat
SPDXID: SPDXRef-472c7aaf2054b6662a0f02656ff453e0
FileChecksum: SHA1: 3c504feedb2e1f1e85ed443a4d5aba20bafe0b28
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/praxis/index.rst
SPDXID: SPDXRef-f373dac39205edb0975081cc2411a334
FileChecksum: SHA1: 03c98408278e3ebd2cdb61ecae75bd1c52cf4c02
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/support.rst
SPDXID: SPDXRef-3d7c4e6cccb3294880a3d23a9edc019c
FileChecksum: SHA1: 3aabd6b0faf44abd22ae7d802d5e2baa988d4eaa
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./docs/theory/index.rst
SPDXID: SPDXRef-fe7b87a77ea58c18a39d99c8cc4fd9b8
FileChecksum: SHA1: 7b1906423a6b89ef1e047613a4a7bcee33ebbb7b
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CC-BY-SA-4.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

FileName: ./intake.FCStd
SPDXID: SPDXRef-8979307823bc12e1df0c4754fb92b50a
FileChecksum: SHA1: e0df68c56c2984184fccd26890583c8f82406525
LicenseConcluded: NOASSERTION
LicenseInfoInFile: CERN-OHL-S-2.0
FileCopyrightText: <text>SPDX-FileCopyrightText: 2023 Eco-Libre <https://eco-libre.org/contact>
SPDX-FileCopyrightText: 2023 Michael Altfield <https://email.michaelaltfield.net>
SPDX-FileCopyrightText: </text>

(virtualenv) user@disp4360:~/sandbox/life-line$ 
    1. I guess we could even have a CI job that automatically generated this file on-push
  1. Javier Serrano (Deputy Group Leader of the accelerator Controls Electronics and Mechatronics and co-author of the CERN OHL license) said that he would be open to updating the "how to use the CERN OHL license" guide to include our REUSE.toml example, but that he'd want us to provide an example repo\
  2. ok, on my eco-libre vm I did some real changes and pushed them up to github
user@eco-libre:~/sandbox/life-line$ ls -lah
total 116K
drwxr-xr-x  7 user user 4.0K Apr 28 18:32 .
drwxr-xr-x 18 user user 4.0K Apr 28 17:59 ..
drwxr-xr-x  2 user user 4.0K Apr 28 18:00 cad
-rw-r--r--  1 user user  531 Apr 28 17:59 CHANGELOG
drwxr-xr-x 11 user user 4.0K Apr 28 17:59 docs
drwxr-xr-x  8 user user 4.0K Apr 28 18:59 .git
drwxr-xr-x  3 user user 4.0K Apr 28 17:59 .github
-rw-r--r--  1 user user   44 Apr 28 17:59 .gitignore
-rw-r--r--  1 user user  71K Apr 28 17:59 KEYS
drwxr-xr-x  2 user user 4.0K Apr 28 18:20 LICENSES
-rw-r--r--  1 user user 1.3K Apr 28 18:32 README.md
-rw-r--r--  1 user user 1.7K Apr 28 18:10 REUSE.toml
user@eco-libre:~/sandbox/life-line$ 
user@eco-libre:~/sandbox/life-line$ ls -lah LICENSES/
total 80K
drwxr-xr-x 2 user user 4.0K Apr 28 18:20 .
drwxr-xr-x 7 user user 4.0K Apr 28 18:32 ..
-rw-r--r-- 1 user user  34K Apr 28 18:08 AGPL-3.0-only.txt
-rw-r--r-- 1 user user  18K Apr 28 18:08 CC-BY-SA-4.0.txt
-rw-r--r-- 1 user user  14K Apr 28 18:08 CERN-OHL-S-2.0.txt
user@eco-libre:~/sandbox/life-line$ 
user@eco-libre:~/sandbox/life-line$ cat REUSE.toml 
version = 1
SPDX-PackageName = "Eco-Libre Life-Line"
SPDX-PackageSupplier = "https://eco-libre.org/contact"
SPDX-PackageDownloadLocation = "https://github.com/Eco-Libre/life-line"

[[annotations]]
path = "**"
precedence = "aggregate"
SPDX-FileCopyrightText = ["", "2023 Michael Altfield <https://email.michaelaltfield.net>", "2023 Eco-Libre <https://eco-libre.org/contact>"]
SPDX-License-Identifier = "CC-BY-SA-4.0"

[[annotations]]
path = ["**.FCStd", "**.scad", "**.fzz", "**.blend", "**.kicad_pcb", "**.sh3d", "**.vue", "**.dxf", "**.dwg", "**.bim", "**.skp", "**.skb", "**.max", "**.3ds", "**.gto", "**.pod", "**.brd", "**.sch", "**.3dm", "**.dwb", "**.slddrw", "**.sldasm"]
precedence = "aggregate"
SPDX-FileCopyrightText = ["", "2023 Michael Altfield <https://email.michaelaltfield.net>", "2023 Eco-Libre <https://eco-libre.org/contact>"]
SPDX-License-Identifier = "CERN-OHL-S-2.0"

[[annotations]]
path = ["**.c", "**.cpp", "**.h", "**.hpp", "**.cc", "**.ino", "**.pde", "**.make", "**.automake", "**.cmake", "**.java", "**.javacc", "**.rust", "**.d", "**.j", "**.r", "**.sh", "**.bash", "**.zsh", "**.awk", "**.tcl", "**.py", "**.python", "**.python2", "**.python3", "**.FCMacro", "**.pl", "**.perl", "**.kivy", "**.qix", "**.dtd", "**.shp", "**.shz", "**.dbf", "**.shx", "**.prj", "**.kml", "**.php", "**.js", "**.javascript", "**.typescript", "**.ruby", "**.eruby", "**.cuda", "**.erlang", "**.lisp", "**.lua", "**.haskell", "**.go", "**.autohotkey", "**.basic", "**.swift", "**.vb", "**.asp"]
precedence = "aggregate"
SPDX-FileCopyrightText = ["", "2023 Michael Altfield <https://email.michaelaltfield.net>", "2023 Eco-Libre <https://eco-libre.org/contact>"]
SPDX-License-Identifier = "AGPL-3.0-only"
user@eco-libre:~/sandbox/life-line$ 
  1. I don't trust pip, so I did this with the `reuse` from `apt`. Unfortuantly, this old version of reuse says we're not in compliance with REUSE specification 3.0
user@eco-libre:~/sandbox/life-line$ git log | head
commit fd844016efa29f34b97ea59aa6dc575bf21f8916
Author: Michael Altfield <michael@michaelaltfield.net>
Date:   Tue Apr 28 18:32:21 2026 -0500

	updated the README with new license info
    
	TODO: see if I can get a CI process to automatically generate a SPDX BOM

commit e4ece950b29294681a435e3239777390e417b274
Author: Michael Altfield <michael@michaelaltfield.net>
user@eco-libre:~/sandbox/life-line$ 
user@eco-libre:~/sandbox/life-line$ reuse --version
reuse 1.1.2
user@eco-libre:~/sandbox/life-line$ 
user@eco-libre:~/sandbox/life-line$ reuse lint
# UNUSED LICENSES

The following licenses are not used:
* AGPL-3.0-only
* CC-BY-SA-4.0
* CERN-OHL-S-2.0


# MISSING COPYRIGHT AND LICENSING INFORMATION

The following files have no copyright and licensing information:
* .github/workflows/docs_pages_workflow.yml
* .gitignore
* CHANGELOG
* KEYS
* REUSE.toml
* cad/intake.FCStd
* docs/.gitignore
* docs/Makefile
* docs/_static/custom.css
* docs/_templates/versions.html
* docs/attribution.rst
* docs/build/index.rst
* docs/build/intake/bom.ods
* docs/build/intake/bom.rst
* docs/build/intake/index.rst
* docs/build/intake/what.rst
* docs/build/settling-tank/bom.rst
* docs/build/settling-tank/index.rst
* docs/build/settling-tank/what.rst
* docs/buildDocs.sh
* docs/changelog.rst
* docs/conf.py
* docs/conf.py.orig
* docs/dev/index.rst
* docs/faq.rst
* docs/images/eco-libre_logo-2025.08.svg
* docs/images/eco-libre_text-logo-2025.08.svg
* docs/images/eco-libre_text-logo-2025.08_500px.png
* docs/images/life-line_2023.12.jpg
* docs/images/life-line_2025.10.jpg
* docs/images/life-line_intake_cleanout-drain.jpg
* docs/images/life-line_intake_drum.jpg
* docs/images/life-line_intake_expanded-metal.jpg
* docs/images/life-line_intake_fine-mesh.jpg
* docs/images/life-line_intake_outflow.jpg
* docs/images/life-line_intake_parts.svg
* docs/images/life-line_intake_turbulence-bar.jpg
* docs/images/life-line_intake_weir.jpg
* docs/images/life-line_praxis_boris-plotkin.2024-11.jpg
* docs/images/life-line_praxis_vegan-beasts_screen.2025-04.jpg
* docs/images/life-line_praxis_vegan-beasts_weir.2025-04.jpg
* docs/index.rst
* docs/introduction/index.rst
* docs/license.rst
* docs/locales/es/LC_MESSAGES/autodoc.mo
* docs/locales/es/LC_MESSAGES/index.mo
* docs/make.bat
* docs/praxis/index.rst
* docs/support.rst
* docs/theory/index.rst

The following files have no licensing information:
* README.md
* docs/locales/es/LC_MESSAGES/autodoc.po
* docs/locales/es/LC_MESSAGES/index.po


# SUMMARY

* Bad licenses:
* Deprecated licenses:
* Licenses without file extension:
* Missing licenses:
* Unused licenses: AGPL-3.0-only, CC-BY-SA-4.0, CERN-OHL-S-2.0
* Used licenses:
* Read errors: 0
* Files with copyright information: 3 / 53
* Files with license information: 0 / 53

Unfortunately, your project is not compliant with version 3.0 of the REUSE Specification :-(
user@eco-libre:~/sandbox/life-line$ 
  1. however, if I checkout the repo to the *exact same* commit on my dispvm (where we've installed reuse insecurely from pip), it says that we *are* in compliance with REUSE Specification 3.3
(virtualenv) user@disp4360:~/sandbox/life-line$ git log | head
commit fd844016efa29f34b97ea59aa6dc575bf21f8916
Author: Michael Altfield <michael@michaelaltfield.net>
Date:   Tue Apr 28 18:32:21 2026 -0500

	updated the README with new license info
    
	TODO: see if I can get a CI process to automatically generate a SPDX BOM

commit e4ece950b29294681a435e3239777390e417b274
Author: Michael Altfield <michael@michaelaltfield.net>
(virtualenv) user@disp4360:~/sandbox/life-line$ 

(virtualenv) user@disp4360:~/sandbox/life-line$ reuse --version
reuse, version 6.2.0

This program is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version.

This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with
this program. If not, see <https://www.gnu.org/licenses/>.
(virtualenv) user@disp4360:~/sandbox/life-line$ 

(virtualenv) user@disp4360:~/sandbox/life-line$ reuse lint
# SUMMARY

* Bad licenses: 0
* Deprecated licenses: 0
* Licenses without file extension: 0
* Missing licenses: 0
* Unused licenses: 0
* Used licenses: AGPL-3.0-only, CC-BY-SA-4.0, CERN-OHL-S-2.0
* Read errors: 0
* Invalid SPDX License Expressions: 0
* Files with copyright information: 52 / 52
* Files with license information: 52 / 52

Congratulations! Your project is compliant with version 3.3 of the REUSE Specification :-)
(virtualenv) user@disp4360:~/sandbox/life-line$ 
  1. so that means that, if I wanted to build a spdx bom (one file that lists every copyright & license of every file in the repo, by following the REUSE.toml file's spec) using a CI job on-push, I would have to download some sketch code and then give it permission to modify the repo's contents. That's a problem
    1. Eco-Libre isn't a huge security risk, but the first thing that comes to mind is our "donate to us" info in the docs. If someone did a Remote Code Execution (the vuln opened by the fact that pip is vulnerable to a MITM attack when it downloads software because it isn't cryptographically signed – like with gpg as apt has done for decades), then an attacker could swap any of our docs as they please on-build – including changing our bitcoin address. Or URL to the "donate" page
    2. It's also concieveable that it would tell someone to build something that's obviously very unsafe. And, for heavy machinerary, that could be very bad.
    3. threfore, I guess we'll just skip this nice-to-have. It should be enough to just link them to the spec and the toml file
  2. TODO: apply these license changes to some repo (probably life-line) and then update this thead https://forums.ohwr.org/t/possible-to-triple-license-cern-ohl-s-2-0-agpl-3-0-cc-by-sa-4-0/849882/9
  3. TODO: write an article about this on our website, explaining our rationale, how to add it to a repo, and an example (eg life-line but probably create an article-specific repo with some eco-libre internal & also external hardware files plus some content in other licenses)

2026-04-26

  1. I started working on writing a privacy policy for wiki.eco-lbre.org
  2. I wrote one years ago for OSE. editing history suggests I finished that in Nov 2018 https://wiki.opensourceecology.org/index.php?title=Media-wiki:Privacy_policy&action=history
  3. I largely copied it from the Creative Commons Privacy Policy, and I know Marcin made some (very non-gdpr-compliant) changes to it since then (in 2024)
  4. so I did diff of the current privacy policy on CC's website and OSE's; they had very little in common! https://creativecommons.org/privacy/
  5. it looks like CC updated their Privacy Policy in Dec 2019, so unfortuantly about a year after I did my work with it, they changed it almost completely
  6. so I'm just going to start fresh with this, and make changes I think necessary
  7. I struggled to find the ToS page. It didn't appear on the special list of long pages, and nothign returend for a search of "terms of service" – I guess because it's in the Eco-Libre namespace? I had to search my logs to find it https://wiki.eco-libre.org/wiki/Eco-Libre:Terms_of_Service
  8. I think I should change the link in the bottom-left footer from "Privacy Policy" to "Terms of Service" – since the PP is one of the ToS (and not the other way around)
    1. here's the docs on how to change the links in the footer https://www.mediawiki.org/wiki/Manual:Footer
    2. I was able to do this by updating the following two pages (one is the hyperlink text and one is the hyperlink article destination)
      1. https://wiki.eco-libre.org/wiki/MediaWiki:Privacypage
      2. https://wiki.eco-libre.org/wiki/MediaWiki:Privacy
  9. I created the Privacy Policy from the CC one, cleaned up the syntax and did my best to replace all the relevant CC stuff to EL https://wiki.eco-libre.org/wiki/Eco-Libre:Privacy_policy
  10. the privacy policy references a CoC (Code of Conduct). Ugh, I guess we need one of those too..
    1. I wonder if we can say "you must wash your hands with soap and water" and "you must take b12 if you're vegan" in the CoC. Or is that *another* agreement?
    2. probably we should make some CoC that applies to in-person and remote users *and* a separate agreement with that sort of thing, only for live-in guests (maybe call it a "Housing Agreeemnt" or something)
    3. here's the rules from veganism.social
	Rule #1No speciesism, animal abuse, carnists, omnivores, vegetarians, or other non-vegans
	Rule #2Sexually explicit or violent media must be marked as sensitive when posting
	Rule #3No racism, sexism, homophobia, transphobia, xenophobia, fatphobia, or casteism
	Rule #4No incitement of violence or promotion of violent ideologies
	Rule #5No harassment or doxxing of other users
	Rule #6Do not share intentionally false or misleading information
    1. here's mastodon.energy's
1. Be Nice
2. Tell the Truth
3. Be Ethical
    1. here's chaos.social, which is where we have our mastodon now

Rules

We expect users on chaos.social to adhere to the following rules:

	No content condoning or advocating for the oppression of members of marginalised groups, or general discrimination of groups based on characteristics like gender, race, disabilities, nationality, education, religion etc.
	No harassment, stalking, mobbing, deadnaming, misgendering, contacting users who have made it clear they do not wish to be contacted.
	Obviously: no content that is illegal in Germany, no actions intended to damage this instance (performance, reputation, security).
	No right or alt-right bullshit, Nazi content, conspiracy narratives.
	No automated accounts (unless approved by the moderators). This includes bots, crossposters, feedposters etc.
	When posting to the local timeline, provide Content Warnings for violence, sexually explicit content, death/disease, and politics, particularly when negative or controversial (those are the larger categories, a CW might be something like “uspol, elections”).
	When posting to the local timeline, provide image descriptions.
	Provide credit for creative works that are not your own. That includes marking AI generated content clearly as such.

Clarification: You post to the local timeline when you give your post “public” visibility. If you don’t want to follow local timeline rules, you can post with visibility “quiet public” (which used to be called “unlisted”) – posts will still be visible to everybody (your followers and everybody else), they just won’t get shown on the local and federated timelines. Boosts also do not appear on the local timeline.

Note that the instance is also subject to our terms and privacy policy.
Best practices

We ask users on chaos.social to keep the following guidelines in mind, in order to foster a considerate and accessible atmosphere. Forgetting about them is not as serious as breaking the instance rules, but repeated malicious unwillingness to follow the best practices will be considered just like breaking a rule.

	Use content warnings liberally, especially for topics that are potentially disturbing or controversial, or that make life harder for people struggling with addiction or trauma.
	Don’t be a reply guy – uninvited comments about another user’s personal choices, lifestyle or family are strongly discouraged and may be considered harassment.
	In discussions, please remain civil, do not insult the people you’re talking to. Don’t escalate.

Enforcement

Rules are only worth as much as their enforcement, so here is what you can expect from the chaos.social moderators (we will publish our moderation guidelines in the future, but here’s the short version):

Breaking these rules can get you kicked off the instance, though unless you’re behaving in bad faith, we will give you several warnings first. Going against the Best Practices can also get you kicked off the instance, but you have to really persistently act against them (and at that point, why are you on chaos.social?).

Please report behaviour that bothers you. We will keep your report confidential.

We run this instance in our spare time, so we can’t respond instantly. We try to react to all reports within a day, but please allow for delays. You can always contact us us in private if you have concerns about moderation. We will not comment in public about individual moderation cases.
Ultimately,

we (@leah and @rixx) are maintaining this instance on our spare time, hardware and nerves. Don’t push either of those.

The rules are licensed under CC-BY-SA by chaos.social e.V.
      1. and this one explicilty says it's CC-BY-SA, so that's cool.
    1. I guess we'll copy chaos.socials' since it's already copyleft
    2. ok, here's what I came-up with
By using this website, you agree to the following Code of Conduct:

# Only submit content for which you have the right to submit it under the terms of our copyleft licensing (it must either be created in whole or in part by you or already licensed under a comparable copyleft)
# No AI content! This is a violation of rule #1.
# No content condoning or advocating for the oppression of members of marginalised groups, or general discrimination of groups based on characteristics like species, gender, race, disabilities, nationality, education, religion etc.
# No harassment, stalking, mobbing, deadnaming, misgendering, contacting users who have made it clear they do not wish to be contacted.
# No content that is illegal in Germany or Ecuador, no actions intended to damage this instance (performance, reputation, security).
# No pro-fascist or pro-Nazi content
# Post Content Warnings for violence, sexually explicit content, death and/or disease
# Whenever possible, provide image descriptions for visually impaired readers
# No misinformation or disinformaton
# Provide attribution (credit) for works that are not your own. This should include a name of the original copyright holder and a link to the source.
  1. now we have a CLA (Community License Agreement), ToS (Terms of Service), PP (Privacy Policy), and CoC (Code of Conduct)
    1. so I think we still have just 2 agreeements missing
      1. Public Data Agreement
      2. In-House Volunteer Agreement
  2. I had previously drafted the Public Data Agreeement as followes
1. I understand that Eco-Libre will publish all of my work publicly on their website
2. I understand that, because my work is licensed openly, I cannot request it to be taken down from the Internet
3. I understand that I have the right to use an alias, so that all of my work can be attributed to an anonymous profile with no PII (publicly identifiable information).
4. I understand that, if I wish to use an anonymous identity for my public contributions, then I should not use my real name in this application
5. I understand that currently my name is set to XXXX, and this is the name that will be publicly listed on Eco-Libre's website associated with all of my contributions
    1. I'm actually not fully sure that's necessary. The PP from CC had a clause
Eco-Libre Volunteers.

o In connection with you Eco-Libre Volunteer application, we may provide your information to the individuals you’ve selected to vouch for you, and with those reviewing your application, including the Membership Council whose members include people not employed by Eco-Libre and who are located in various countries around the world.

o If you vouch for someone’s application to the Eco-Libre Volunteer program, your information will be shared with those reviewing the application, including the Membership Council, and if you provide a positive vouching statement, that statement will be shared with the applicant if and when they are admitted for membership.

o Once you are an Eco-Libre Volunteer, we may provide you with a public profile page, pre-populated with certain information you provided in your application such as your name, areas of interest, images or other content you upload, which will be publicly displayed to anyone who visits the site. 
    1. I added a paragraph
o   As an Eco-Libre Volunteer, all of your Contributions will be licensed under a copyleft license, and published publicly.
    1. well, I guess this satisfies the legal requirements, but I do want to make the pseudonym stuff more clear. But I apparently wrote that to go on the application itself. Currently our application process is non-existant: the user just sends and email, we have a call, and we figure it out. I did just add some docs to sign to that process, but we need a more streamlined process: a form
    2. it's on our TODO list to review some wordpress plugins that we can use for building an application process. eventually *that's* where this text should be copied, and it should reference things like our official Privacy Policy
  1. the other thing was our " In-House Volunteer Agreement" which is *really* premature, as we don't even have housing yet. Nonetheless, I drafted this
1. I am at least 15 years old
2. I sincerely want live a sustainable lifestyle and work on developing tools to help others live sustainably. I understand that volunteering at Eco-Libre is an active experience, not a cheap vacation. 
3. I am ready to participate in the community and share in the daily routine of my hosts, while respecting their living conditions and boundaries.
4. I will contribute my time to the community the agreed-upon number of hours per week.
5. I am willing to adapt to a lifestyle that may be different from mine. I will make known to the community any pertinent health conditions (disabilities, addictions...) beforehand.
6. I have insurance that will cover me for accidents, illness, and liability during my stay. I am aware that Eco-Libre cannot be held responsible for damages and / or losses linked to my stay.
7. I will prevent the spread of disease by washing my hands with soap and water after using the toilet and before preparing meals
8. I will only purchase vegan goods (derived from non-animal sources) during my time at Eco-Libre in accordance with the community values of ecological sustainability.
9. I will supplement my diet by taking vitamin B12
  1. I also think that should be included in the online volunteer application form. And probably physically signed by folks who are going to actually come to Ecudaor. But we're not there yet...
  2. anyway, I think we've finally satisifed the requrements of (and finished the configuration of) ConfirmAccount!
  3. TODO: finish enabling & configuring wiki extensions: DeleteBatch, SmiteSpam, UserMerge, Widgets

2026-04-24

  1. someone answered my "how do I license kdnelive files" here https://opensource.stackexchange.com/a/15747/30915
It sounds like your desired outcome is that copies of your mp4 can only be distributed while also sharing the kdenlive source files. You're correct that CC ShareAlike terms won't do this. ShareAlike requires that all downstream works that reuse the work be shareable under the same kind of ShareAlike license, but it doesn't require redistributors to share the underlying source code.

If you do want to require source to accompany your work, this requirement differs from the desires of many artists who choose a CC license: they want their song or image to be shared around without having to be followed by the underlying sound-editor archive or photo-editor layer file. If that actually is what you want, then the GPL is a sensible choice for such a strong requirement, and it is perfectly applicable to non-software works.

 * https://www.gnu.org/licenses/gpl-faq.html#GPLOtherThanSoftware

If you don't want to impose this requirement, then I think CC BY-SA is still a reasonable choice for the underlying "source code" of your video. The output mp4 is legally derivative of your kdenlive files, so CC BY-SA will ensure that all mp4 files made from (derivatives of) your kdenlive source must also be freely shareable under CC BY-SA, but will not impose source disclosure. Future derivatives of the source kdenlive files will, similarly, have to remain under CC BY-SA even as others change them (but they can be kept secret even when built into a CC BY-SA mp4).
  1. I half-decided we should then license all artwork (images made in gimp or inkscape, videos made in kdenlive) under GPL, so the sources would need to be public
  2. then I started thinking, hey, maybe our documentation should also be GPL, since sphinx and reST are like sources for PDFs they produce
  3. then I realized what that would actually mean. Say we make a video showing the construction of a launch-nest. Say the sources for that video include a camera that was mounted to a post and recording for 8 hours every day over the period of 3 months. Maybe five of them, for differet angles. Once we finally finish producing the video, I'm going to be super relieved when we can delete that enormous source footage. The kdenlive file itself would be fine to release; it's small. But would we then be forced to indefinitely save and distribute the source video footage, even if it's a combined 3 TB of 1,000 video files, for a 1 GB finally-rendered mp4?
  4. inkscape is easy; the svg literally *is* the source file
  5. gimp is somewhere in-between. I typically hang-onto the source images used to make a feature image (sometimes brands, or screenshots or stock copyleft images of forests or whatever) for some number of months. eventually they get deleted. I would love to upload the gimp files, but those might be broken without the source images. Or they just would be too enormous and break git over time.
  6. also, if we can't do it, we can't expect downstream to do it. imagine we work with some youtuber and demand that the must forever store and publish the sources in order to do a video with us? I think 99% would turn us down, because they know they can't do that. It's too expensive and unrealistic.
  7. due to this very real logistical problem, I think we should just keep CC BY-SA on media files. We can go above-and-beyond that license and provide kdenlive and gimp files *sometimes*, but we shouldn't mandate it by using GPL.
  8. and, honestly, if downstream just licenses CC BY-SA, that lets us cut that up and use it in future videos. That's good enough. And appropriate for the (expensive-to-store) medium.
  9. ...
  10. revisting the DEB5 system, I found an example on another project that I maintain: buskill https://salsa.debian.org/debian/buskill/-/blob/master/debian/copyright?ref_type=heads
    1. so our debian maintainer built this. he put a file 'copyright' in the root with this contents
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Source: https://github.com/BusKill/buskill-app
Upstream-Name: buskill
Upstream-Contact: Michael Altfield <michael@michaelaltfield.net>
Files:
 *
Copyright:
 2020-2022 Michael Altfield <michael@michaelaltfield.net>
 2020-2021 Steven Johnson <steven.j2019@protonmail.com>
License: GPL-3+
Files:
 src/fonts/*
Copyright:
 2015 Google
License: Apache-2.0
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at
 ․
	https://www.apache.org/licenses/LICENSE-2.0
 ․
 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
Comment:
 On Debian systems, the complete text of the Apache License
 version 2 can be found in "/usr/share/common-licenses/Apache-2.0".
Files:
 src/packages/garden/navigationdrawer/*
Copyright:
 2013 Alexander Taylor
License: MIT
Files:
 src/packages/garden/progressspinner/*
Copyright:
 2015 Ryan Pessa <dkived@gmail.com>
License: MIT
Files:
 debian/*
Copyright:
 2022-2026 Francois Marier <francois@debian.org>
License: GPL-3+
License: GPL-3+
 This package is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 3 of the License, or
 (at your option) any later version.
 .
 This package is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 .
 You should have received a copy of the GNU General Public License
 along with this program. If not, see <https://www.gnu.org/licenses/>
Comment:
 On Debian systems, the complete text of the GNU General
 Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".
License: MIT
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal

 in the Software without restriction, including without limitation the rights
 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:
 .
 The above copyright notice and this permission notice shall be included in
 all copies or substantial portions of the Software.
 .
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
  1. I spent some time trying to craft a 'copyright' file that we could use for Eco-Libre
    1. one thing that bothers me is that I have so many 'Files' stanzas – one for each programming language. I wish I could do something like
Files:
 *.py|*.php|*.c
    1. there are no examples where a single file stanza has many file paths, but the text of the standard does say they are whitespace-delimited (not pipe-delimited, like I naturally think)
4. File syntax
...
4.2. Whitespace-separated lists

Field values defined as whitespace-separated lists may be on one line or many. Values in the list are separated by one or more whitespace characters (space, tab, or newline). For example, the Files field contains a whitespace-separated list of filename patterns.
...
6.9. Files

Whitespace-separated list: list of patterns indicating files covered by the license and copyright specified in this stanza.

Filename patterns in the Files field are specified using a simplified shell glob syntax. Patterns are separated by whitespace. 
    1. let's see if I can find any example package that use this whitespace, so I don't fuck it up
    2. looks like debian has a *ton* of these already available on my system
user@disp4360:~$ ls /usr/share/doc/*/copyright | head
/usr/share/doc/acl/copyright
/usr/share/doc/adduser/copyright
/usr/share/doc/adwaita-icon-theme/copyright
/usr/share/doc/alsa-topology-conf/copyright
/usr/share/doc/alsa-ucm-conf/copyright
/usr/share/doc/alsa-utils/copyright
/usr/share/doc/amd64-microcode/copyright
/usr/share/doc/anacron/copyright
/usr/share/doc/ansible/copyright
/usr/share/doc/ansible-core/copyright
user@disp4360:~$ 

user@disp4360:~$ ls /usr/share/doc/*/copyright | wc -l
2798
user@disp4360:~$ 
    1. the very first one has a great example
user@disp4360:~$ cat /usr/share/doc/acl/copyright
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/

Files:
 *
Copyright:
 Copyright © 2000-2008 Silicon Graphics, Inc.
 Copyright © 1999-2001,2007-2009 Andreas Gruenbacher
License: GPL-2+
 This program is free software: you can redistribute it and/or modify it
 under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 2 of the License, or
 (at your option) any later version.
 .
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 .
 You should have received a copy of the GNU General Public License
 along with this program.  If not, see <https://www.gnu.org/licenses/>.
Comment:
 On Debian systems, the full text of the GNU General Public License
 can be found in '/usr/share/common-licenses/GPL-2'.

Files:
 exports
 include/*.h
 libacl/*.c
 libacl/*.h
 libmisc/*.c
 tools/do_set.*
 tools/parse.*
 tools/sequence.c
 tools/setfacl.c
 tools/user_group.h
Copyright:
 Copyright © 2001-2002 Silicon Graphics, Inc.
 Copyright © 1999-2003,2007,2009,2011 Andreas Gruenbacher
License: LGPL-2+
 This program is free software: you can redistribute it and/or modify it
 under the terms of the GNU Lesser General Public License as published by
 the Free Software Foundation, either version 2.1 of the License, or
 (at your option) any later version.
 .
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU Lesser General Public License for more details.
 .
 You should have received a copy of the GNU Lesser General Public License
 along with this program.  If not, see <https://www.gnu.org/licenses/>.
Comment:
 On Debian systems, the full text of the GNU Lesser General Public License
 can be found in '/usr/share/common-licenses/LGPL-2.1'.
user@disp4360:~$ 
  1. I also found an example where the whitespace was a space, not a newline + space
user@disp4360:~$ cat /usr/share/doc/apparmor/copyright 
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: AppArmor
Upstream-Contact: apparmor@lists.ubuntu.com
Source: https://launchpad.net/apparmor

Files: *
Copyright: 1998-2010 Novell/SuSE/Immunix
		   2008-2014 Canonical Ltd.
License: GPL-2+

Files: changehat/pam_apparmor/*
Copyright: 2006 SUSE Linux Products GmbH, Nuernberg, Germany
		   2002, 2003, 2004 SuSE GmbH Nuernberg, Germany
		   2002-2006 Novell/SuSE
		   2010 Canonical Ltd.
License: BSD-3-clause or GPL-2+

Files: changehat/mod_apparmor/*
Copyright: 2004-2006 Novell
		   2014 Canonical Ltd.
License: LGPL-2.1+

Files: libraries/libapparmor/* parser/libapparmor_re/*
Copyright: 1999-2008 Novell
		   2009-2013 Canonical Ltd.
License: LGPL-2.1+

Files: profiles/apparmor.d/abstractions/mysql
Copyright: 2002-2006 Novell/SUSE
		   2013 Christian Boltz
License: GPL-2

Files: profiles/apparmor.d/usr.sbin.dnsmasq
Copyright: 2009 John Dong <jdong@ubuntu.com>
		   2010 Canonical Ltd.
License: GPL-2

Files: profiles/apparmor.d/sbin.syslog-ng
Copyright: 2006-2009 Novell/SUSE
		   2006 Christian Boltz
		   2010 Canonical Ltd.
License: GPL-2

Files: profiles/apparmor.d/usr.lib.dovecot.*
Copyright: 2013 Christian Boltz
License: GPL-2

Files: profiles/apparmor.d/usr.lib.dovecot.auth
Copyright: 2013 Christian Boltz
		   2014 Christian Wittmer
License: GPL-2

Files: profiles/apparmor.d/usr.lib.dovecot.deliver
Copyright: 2009 Dulmandakh Sukhbaatar <dulmandakh@gmail.com>
		   2009-2014 Canonical Ltd.
		   2011-2013 Christian Boltz
License: GPL-2

Files: profiles/apparmor.d/usr.lib.dovecot.dovecot-auth
Copyright: 2009-2013 Canonical Ltd.
		   2013 Christian Boltz
License: GPL-2

Files: profiles/apparmor.d/usr.lib.dovecot.imap profiles/apparmor.d/usr.lib.dovecot.pop3
Copyright: 2009-2010 Canonical Ltd.
		   2011-2013 Christian Boltz
License: GPL-2

Files: profiles/apparmor.d/usr.lib.dovecot.imap-login profiles/apparmor.d/usr.lib.dovecot.pop3-login
Copyright: 2009-2011 Canonical Ltd.
		   2013 Christian Boltz
License: GPL-2

Files: profiles/apparmor.d/usr.lib.dovecot.managesieve
Copyright: 2013 Christian Boltz
		   2014 Christian Wittmer
License: GPL-2

Files: profiles/apparmor.d/usr.lib.dovecot.managesieve-login
Copyright: 2009 Dulmandakh Sukhbaatar <dulmandakh@gmail.com>
		   2009-2011 Canonical Ltd.
		   2013 Christian Boltz
		   2014 Christian Wittmer
License: GPL-2

Files: profiles/apparmor/profiles/extras/usr.bin.mlmmj-make-ml.sh
Copyright: 2002-2005 Novell/SUSE
License: GPL-2

Files: profiles/apparmor/profiles/extras/usr.bin.passwd
Copyright: 2006 Volker Kuhlmann
License: GPL-2

Files: debian/*
Copyright: 2007-2011 Canonical Ltd.
		   2014-2022 intrigeri
License: GPL-2

License: BSD-3-clause
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions
 are met:
 .
 1. Redistributions of source code must retain any existing copyright
	notice, and this entire permission notice in its entirety,
	including the disclaimer of warranties.
 .
 2. Redistributions in binary form must reproduce all prior and current
	copyright notices, this list of conditions, and the following
	disclaimer in the documentation and/or other materials provided
	with the distribution.
 .
 3. The name of any author may not be used to endorse or promote
	products derived from this software without their specific prior
	written permission.

License: GPL-2
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; version 2 of the License.
 .
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 .
 You should have received a copy of the GNU General Public License along
 with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 .
 On Debian systems, the complete text of the GNU General
 Public License can be found in `/usr/share/common-licenses/GPL-2'.

License: GPL-2+
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2 of the License, or
 (at your option) any later version.
 .
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 .
 You should have received a copy of the GNU General Public License along
 with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 .
 On Debian systems, the complete text of the GNU General
 Public License can be found in `/usr/share/common-licenses/GPL-2'.

License: LGPL-2.1+
 This library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
 License as published by the Free Software Foundation; either
 version 2.1 of the License, or (at your option) any later version.
 .
 This library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 Lesser General Public License for more details.
 .
 You should have received a copy of the GNU Lesser General Public
 License along with this library; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 .
 On Debian systems, the complete text of the GNU General
 Public License can be found in `/usr/share/common-licenses/LGPL-2.1'.
user@disp4360:~$ 
<pre>
## so we already have a "short version" of the license for GPL and CERN. For example
### GPL
<pre>
 This package is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 3 of the License, or
 (at your option) any later version.
 .
 This package is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 .
 You should have received a copy of the GNU General Public License
 along with this program. If not, see <https://www.gnu.org/licenses/>
      1. CERN
You may redistribute and modify this source and make products using it under the terms of the CERN-OHL-S v2 (https://ohwr.org/cern_ohl_s_v2.txt).

This source is distributed WITHOUT ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING OF MERCHANTABILITY, SATISFACTORY QUALITY AND FITNESS FOR A PARTICULAR PURPOSE. Please see the CERN-OHL-S v2 for applicable conditions.

Source location: foundationdevices.com/passport-electronics

As per CERN-OHL-S v2 section 4, should You produce hardware based on this source, You must where practicable and applicable maintain the Source Location visible (1) on the packaging of the hardware, (2) on the circuit board(s) via silkscreen or copper, (3) in any documentation, and (4) on other products you make using this source.
    1. I was hoping for some sort of equivalent in CC-BY-SA-4.0, but all of these (which were the only ones I found with BY-SA-4.0) had the full text of the license
user@disp4360:/usr/share/doc$ grep -irl BY-SA-4.0 /usr/share/doc/*/copyright
/usr/share/doc/adwaita-icon-theme/copyright
/usr/share/doc/containerd/copyright
/usr/share/doc/gimp/copyright
/usr/share/doc/gimp-data/copyright
/usr/share/doc/gir1.2-gtk-3.0/copyright
/usr/share/doc/gtk-update-icon-cache/copyright
/usr/share/doc/libadwaita-1-0/copyright
/usr/share/doc/libgimp2.0/copyright
/usr/share/doc/libgtk-3-0/copyright
/usr/share/doc/libgtk-3-bin/copyright
/usr/share/doc/libgtk-3-common/copyright
/usr/share/doc/libmd4c0/copyright
/usr/share/doc/libnftables1/copyright
/usr/share/doc/libwildmidi2/copyright
/usr/share/doc/mythes-en-us/copyright
/usr/share/doc/nftables/copyright
/usr/share/doc/syncthing/copyright
user@disp4360:/usr/share/doc$ 
user@disp4360:/usr/share/doc$ cat /usr/share/doc/libadwaita-1-0/copyright
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: libadwaita
Source: https://gitlab.gnome.org/GNOME/libadwaita
Files-Excluded: doc/libadwaita-1
Comment: Let's build the docs from source

Files: *
Copyright: 2019, Alexander Mikhaylenko <exalm7659@gmail.com>
  2018, 2019, Zander Brown <zbrown@gnome.org>
  2017-2021, Purism SPC
  2016, Endless Mobile Inc.
  2013, 2019, Red Hat, Inc.
  1995-1997, Peter Mattis, Spencer Kimball and Josh MacDonald
  2021, GNOME Foundation
  2021, Manuel Genovés
  2021, Nahuel Gomez Castro
  2021, Maximiliano Sandoval
  2011, Intel Corporation
License: LGPL-2.1+

Files: debian/*
Copyright: 2021, Guido Günther <agx@sigxcpu.org>
License: GPL-3+

Files:
 doc/libadwaita-1/*.html
 doc/libadwaita-1/main.js
Copyright:
 2021, GNOME Foundation
License: Apache-2.0 or GPL-3+

Files:
 demo/data/org.gnome.Adwaita1.Demo.metainfo.xml.in.in
Copyright: none
License: CC0-1.0

Files:
 demo/data/org.gnome.Adwaita1.Demo.Source.svg
Copyright:
 GNOME Design Team
License: CC-BY-SA-4.0

License: Apache-2.0
 SPDX license identifier Apache-2.0.
 .
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at
 .
	  http://www.apache.org/licenses/LICENSE-2.0
 .
 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 .
 On Debian systems, a copy of the Apache License version 2.0
 can be found in /usr/share/common-licenses/Apache-2.0.

License: CC0-1.0
 SPDX license identifier CC0-1.0.
 .
 On Debian systems, a copy of the Creative Commons Zero license, version 1.0
 can be found in /usr/share/common-licenses/CC0-1.0.

License: CC-BY-SA-4.0
 http://creativecommons.org/licenses/by-sa/4.0/
 .
 Attribution-ShareAlike 4.0 International
 .
 =======================================================================
 .
 Creative Commons Corporation ("Creative Commons") is not a law firm and
 does not provide legal services or legal advice. Distribution of
 Creative Commons public licenses does not create a lawyer-client or
 other relationship. Creative Commons makes its licenses and related
 information available on an "as-is" basis. Creative Commons gives no
 warranties regarding its licenses, any material licensed under their
 terms and conditions, or any related information. Creative Commons
 disclaims all liability for damages resulting from their use to the
 fullest extent possible.
 .
 Using Creative Commons Public Licenses
 .
 Creative Commons public licenses provide a standard set of terms and
 conditions that creators and other rights holders may use to share
 original works of authorship and other material subject to copyright
 and certain other rights specified in the public license below. The
 following considerations are for informational purposes only, are not
 exhaustive, and do not form part of our licenses.
 .
	  Considerations for licensors: Our public licenses are
	  intended for use by those authorized to give the public
	  permission to use material in ways otherwise restricted by
	  copyright and certain other rights. Our licenses are
	  irrevocable. Licensors should read and understand the terms
	  and conditions of the license they choose before applying it.
	  Licensors should also secure all rights necessary before
	  applying our licenses so that the public can reuse the
	  material as expected. Licensors should clearly mark any
	  material not subject to the license. This includes other CC-
	  licensed material, or material used under an exception or
	  limitation to copyright. More considerations for licensors:
	  wiki.creativecommons.org/Considerations_for_licensors
 .
	  Considerations for the public: By using one of our public
	  licenses, a licensor grants the public permission to use the
	  licensed material under specified terms and conditions. If
	  the licensor's permission is not necessary for any reason--for
	  example, because of any applicable exception or limitation to
	  copyright--then that use is not regulated by the license. Our
	  licenses grant only permissions under copyright and certain
	  other rights that a licensor has authority to grant. Use of
	  the licensed material may still be restricted for other
	  reasons, including because others have copyright or other
	  rights in the material. A licensor may make special requests,
	  such as asking that all changes be marked or described.
	  Although not required by our licenses, you are encouraged to
	  respect those requests where reasonable. More_considerations
	  for the public:
	  wiki.creativecommons.org/Considerations_for_licensees
 .
 =======================================================================
 .
 Creative Commons Attribution-ShareAlike 4.0 International Public
 License
 .
 By exercising the Licensed Rights (defined below), You accept and agree
 to be bound by the terms and conditions of this Creative Commons
 Attribution-ShareAlike 4.0 International Public License ("Public
 License"). To the extent this Public License may be interpreted as a
 contract, You are granted the Licensed Rights in consideration of Your
 acceptance of these terms and conditions, and the Licensor grants You
 such rights in consideration of benefits the Licensor receives from
 making the Licensed Material available under these terms and
 conditions.
 .
 .
 Section 1 -- Definitions.
 .
   a. Adapted Material means material subject to Copyright and Similar
	  Rights that is derived from or based upon the Licensed Material
	  and in which the Licensed Material is translated, altered,
	  arranged, transformed, or otherwise modified in a manner requiring
	  permission under the Copyright and Similar Rights held by the
	  Licensor. For purposes of this Public License, where the Licensed
	  Material is a musical work, performance, or sound recording,
	  Adapted Material is always produced where the Licensed Material is
	  synched in timed relation with a moving image.
 .
   b. Adapter's License means the license You apply to Your Copyright
	  and Similar Rights in Your contributions to Adapted Material in
	  accordance with the terms and conditions of this Public License.
 .
   c. BY-SA Compatible License means a license listed at
	  creativecommons.org/compatiblelicenses, approved by Creative
	  Commons as essentially the equivalent of this Public License.
 .
   d. Copyright and Similar Rights means copyright and/or similar rights
	  closely related to copyright including, without limitation,
	  performance, broadcast, sound recording, and Sui Generis Database
	  Rights, without regard to how the rights are labeled or
	  categorized. For purposes of this Public License, the rights
	  specified in Section 2(b)(1)-(2) are not Copyright and Similar
	  Rights.
 .
   e. Effective Technological Measures means those measures that, in the
	  absence of proper authority, may not be circumvented under laws
	  fulfilling obligations under Article 11 of the WIPO Copyright
	  Treaty adopted on December 20, 1996, and/or similar international
	  agreements.
 .
   f. Exceptions and Limitations means fair use, fair dealing, and/or
	  any other exception or limitation to Copyright and Similar Rights
	  that applies to Your use of the Licensed Material.
 .
   g. License Elements means the license attributes listed in the name
	  of a Creative Commons Public License. The License Elements of this
	  Public License are Attribution and ShareAlike.
 .
   h. Licensed Material means the artistic or literary work, database,
	  or other material to which the Licensor applied this Public
	  License.
 .
   i. Licensed Rights means the rights granted to You subject to the
	  terms and conditions of this Public License, which are limited to
	  all Copyright and Similar Rights that apply to Your use of the
	  Licensed Material and that the Licensor has authority to license.
 .
   j. Licensor means the individual(s) or entity(ies) granting rights
	  under this Public License.
 .
   k. Share means to provide material to the public by any means or
	  process that requires permission under the Licensed Rights, such
	  as reproduction, public display, public performance, distribution,
	  dissemination, communication, or importation, and to make material
	  available to the public including in ways that members of the
	  public may access the material from a place and at a time
	  individually chosen by them.
 .
   l. Sui Generis Database Rights means rights other than copyright
	  resulting from Directive 96/9/EC of the European Parliament and of
	  the Council of 11 March 1996 on the legal protection of databases,
	  as amended and/or succeeded, as well as other essentially
	  equivalent rights anywhere in the world.
 .
   m. You means the individual or entity exercising the Licensed Rights
	  under this Public License. Your has a corresponding meaning.
 .
 .
 Section 2 -- Scope.
 .
   a. License grant.
 .
		1. Subject to the terms and conditions of this Public License,
		   the Licensor hereby grants You a worldwide, royalty-free,
		   non-sublicensable, non-exclusive, irrevocable license to
		   exercise the Licensed Rights in the Licensed Material to:
 .
			 a. reproduce and Share the Licensed Material, in whole or
				in part; and
 .
			 b. produce, reproduce, and Share Adapted Material.
 .
		2. Exceptions and Limitations. For the avoidance of doubt, where
		   Exceptions and Limitations apply to Your use, this Public
		   License does not apply, and You do not need to comply with
		   its terms and conditions.
 .
		3. Term. The term of this Public License is specified in Section
		   6(a).
 .
		4. Media and formats; technical modifications allowed. The
		   Licensor authorizes You to exercise the Licensed Rights in
		   all media and formats whether now known or hereafter created,
		   and to make technical modifications necessary to do so. The
		   Licensor waives and/or agrees not to assert any right or
		   authority to forbid You from making technical modifications
		   necessary to exercise the Licensed Rights, including
		   technical modifications necessary to circumvent Effective
		   Technological Measures. For purposes of this Public License,
		   simply making modifications authorized by this Section 2(a)
		   (4) never produces Adapted Material.
 .
		5. Downstream recipients.
 .
			 a. Offer from the Licensor -- Licensed Material. Every
				recipient of the Licensed Material automatically
				receives an offer from the Licensor to exercise the
				Licensed Rights under the terms and conditions of this
				Public License.
 .
			 b. Additional offer from the Licensor -- Adapted Material.
				Every recipient of Adapted Material from You
				automatically receives an offer from the Licensor to
				exercise the Licensed Rights in the Adapted Material
				under the conditions of the Adapter's License You apply.
 .
			 c. No downstream restrictions. You may not offer or impose
				any additional or different terms or conditions on, or
				apply any Effective Technological Measures to, the
				Licensed Material if doing so restricts exercise of the
				Licensed Rights by any recipient of the Licensed
				Material.
 .
		6. No endorsement. Nothing in this Public License constitutes or
		   may be construed as permission to assert or imply that You
		   are, or that Your use of the Licensed Material is, connected
		   with, or sponsored, endorsed, or granted official status by,
		   the Licensor or others designated to receive attribution as
		   provided in Section 3(a)(1)(A)(i).
 .
   b. Other rights.
 .
		1. Moral rights, such as the right of integrity, are not
		   licensed under this Public License, nor are publicity,
		   privacy, and/or other similar personality rights; however, to
		   the extent possible, the Licensor waives and/or agrees not to
		   assert any such rights held by the Licensor to the limited
		   extent necessary to allow You to exercise the Licensed
		   Rights, but not otherwise.
 .
		2. Patent and trademark rights are not licensed under this
		   Public License.
 .
		3. To the extent possible, the Licensor waives any right to
		   collect royalties from You for the exercise of the Licensed
		   Rights, whether directly or through a collecting society
		   under any voluntary or waivable statutory or compulsory
		   licensing scheme. In all other cases the Licensor expressly
		   reserves any right to collect such royalties.
 .
 .
 Section 3 -- License Conditions.
 .
 Your exercise of the Licensed Rights is expressly made subject to the
 following conditions.
 .
   a. Attribution.
 .
		1. If You Share the Licensed Material (including in modified
		   form), You must:
 .
			 a. retain the following if it is supplied by the Licensor
				with the Licensed Material:
 .
				  i. identification of the creator(s) of the Licensed
					 Material and any others designated to receive
					 attribution, in any reasonable manner requested by
					 the Licensor (including by pseudonym if
					 designated);
 .
				 ii. a copyright notice;
 .
				iii. a notice that refers to this Public License;
 .
				 iv. a notice that refers to the disclaimer of
					 warranties;
 .
				  v. a URI or hyperlink to the Licensed Material to the
					 extent reasonably practicable;
 .
			 b. indicate if You modified the Licensed Material and
				retain an indication of any previous modifications; and
 .
			 c. indicate the Licensed Material is licensed under this
				Public License, and include the text of, or the URI or
				hyperlink to, this Public License.
 .
		2. You may satisfy the conditions in Section 3(a)(1) in any
		   reasonable manner based on the medium, means, and context in
		   which You Share the Licensed Material. For example, it may be
		   reasonable to satisfy the conditions by providing a URI or
		   hyperlink to a resource that includes the required
		   information.
 .
		3. If requested by the Licensor, You must remove any of the
		   information required by Section 3(a)(1)(A) to the extent
		   reasonably practicable.
 .
   b. ShareAlike.
 .
	  In addition to the conditions in Section 3(a), if You Share
	  Adapted Material You produce, the following conditions also apply.
 .
		1. The Adapter's License You apply must be a Creative Commons
		   license with the same License Elements, this version or
		   later, or a BY-SA Compatible License.
 .
		2. You must include the text of, or the URI or hyperlink to, the
		   Adapter's License You apply. You may satisfy this condition
		   in any reasonable manner based on the medium, means, and
		   context in which You Share Adapted Material.
 .
		3. You may not offer or impose any additional or different terms
		   or conditions on, or apply any Effective Technological
		   Measures to, Adapted Material that restrict exercise of the
		   rights granted under the Adapter's License You apply.
 .
 .
 Section 4 -- Sui Generis Database Rights.
 .
 Where the Licensed Rights include Sui Generis Database Rights that
 apply to Your use of the Licensed Material:
 .
   a. for the avoidance of doubt, Section 2(a)(1) grants You the right
	  to extract, reuse, reproduce, and Share all or a substantial
	  portion of the contents of the database;
 .
   b. if You include all or a substantial portion of the database
	  contents in a database in which You have Sui Generis Database
	  Rights, then the database in which You have Sui Generis Database
	  Rights (but not its individual contents) is Adapted Material,
 .
	  including for purposes of Section 3(b); and
   c. You must comply with the conditions in Section 3(a) if You Share
	  all or a substantial portion of the contents of the database.
 .
 For the avoidance of doubt, this Section 4 supplements and does not
 replace Your obligations under this Public License where the Licensed
 Rights include other Copyright and Similar Rights.
 .
 .
 Section 5 -- Disclaimer of Warranties and Limitation of Liability.
 .
   a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
	  EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
	  AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
	  ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
	  IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
	  WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
	  PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
	  ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
	  KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
	  ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
 .
   b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
	  TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
	  NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
	  INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
	  COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
	  USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
	  ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
	  DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
	  IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
 .
   c. The disclaimer of warranties and limitation of liability provided
	  above shall be interpreted in a manner that, to the extent
	  possible, most closely approximates an absolute disclaimer and
	  waiver of all liability.
 .
 .
 Section 6 -- Term and Termination.
 .
   a. This Public License applies for the term of the Copyright and
	  Similar Rights licensed here. However, if You fail to comply with
	  this Public License, then Your rights under this Public License
	  terminate automatically.
 .
   b. Where Your right to use the Licensed Material has terminated under
	  Section 6(a), it reinstates:
 .
		1. automatically as of the date the violation is cured, provided
		   it is cured within 30 days of Your discovery of the
		   violation; or
 .
		2. upon express reinstatement by the Licensor.
 .
	  For the avoidance of doubt, this Section 6(b) does not affect any
	  right the Licensor may have to seek remedies for Your violations
	  of this Public License.
 .
   c. For the avoidance of doubt, the Licensor may also offer the
	  Licensed Material under separate terms or conditions or stop
	  distributing the Licensed Material at any time; however, doing so
	  will not terminate this Public License.
 .
   d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
	  License.
 .
 .
 Section 7 -- Other Terms and Conditions.
 .
   a. The Licensor shall not be bound by any additional or different
	  terms or conditions communicated by You unless expressly agreed.
 .
   b. Any arrangements, understandings, or agreements regarding the
	  Licensed Material not stated herein are separate from and
	  independent of the terms and conditions of this Public License.
 .
 .
 Section 8 -- Interpretation.
 .
   a. For the avoidance of doubt, this Public License does not, and
	  shall not be interpreted to, reduce, limit, restrict, or impose
	  conditions on any use of the Licensed Material that could lawfully
	  be made without permission under this Public License.
 .
   b. To the extent possible, if any provision of this Public License is
	  deemed unenforceable, it shall be automatically reformed to the
	  minimum extent necessary to make it enforceable. If the provision
	  cannot be reformed, it shall be severed from this Public License
	  without affecting the enforceability of the remaining terms and
	  conditions.
 .
   c. No term or condition of this Public License will be waived and no
	  failure to comply consented to unless expressly agreed to by the
	  Licensor.
 .
   d. Nothing in this Public License constitutes or may be interpreted
	  as a limitation upon, or waiver of, any privileges and immunities
	  that apply to the Licensor or You, including from the legal
	  processes of any jurisdiction or authority.
 .
 .
 =======================================================================
 .
 Creative Commons is not a party to its public
 licenses. Notwithstanding, Creative Commons may elect to apply one of
 its public licenses to material it publishes and in those instances
 will be considered the “Licensor.” The text of the Creative Commons
 public licenses is dedicated to the public domain under the CC0 Public
 Domain Dedication. Except for the limited purpose of indicating that
 material is shared under a Creative Commons public license or as
 otherwise permitted by the Creative Commons policies published at
 creativecommons.org/policies, Creative Commons does not authorize the
 use of the trademark "Creative Commons" or any other trademark or logo
 of Creative Commons without its prior written consent including,
 without limitation, in connection with any unauthorized modifications
 to any of its public licenses or any other arrangements,
 understandings, or agreements concerning use of licensed material. For
 the avoidance of doubt, this paragraph does not form part of the
 public licenses.
 .
 Creative Commons may be contacted at creativecommons.org.

License: GPL-3+
 This package is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 3 of the License, or
 (at your option) any later version.
 .
 This package is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 .
 You should have received a copy of the GNU General Public License
 along with this program. If not, see <https://www.gnu.org/licenses/>
 .
 On Debian systems, the complete text of the GNU General
 Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".

License: LGPL-2.1+
 This library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
 License as published by the Free Software Foundation; either
 version 2.1 of the License, or (at your option) any later version.
 .
 This library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 Lesser General Public License for more details.
 .
 You should have received a copy of the GNU Lesser General Public License
 along with this library. If not, see <https://www.gnu.org/licenses/>
 .
 On Debian systems, the complete text of the GNU Lesser General
 Public License version 3 can be found in "/usr/share/common-licenses/LGPL-2.1".
user@disp4360:/usr/share/doc$ 
    1. that's a big annoying, but I guess we can live with it
    2. they also apparently put a dot (.) on every double-newline in a single indented stanza. I guess that's to not break the syntax of "two newlines becomes a new stanaza". So I'll adopt that for the CERN License snippet.
    3. I grepd all the "Files" lines in all the systems, and generated a reasonably complete list of all programming language source files
Files:
 *.c *.cpp *.h *.hpp
 *.py *.pl *.go
 *.dtd
 *.html *.css *.js *.xml
Copyright:
 2023 Michael Altfield <https://email.michaelaltfield.net>
 2023 Eco-Libre <https://eco-libre.org/contact>
License: AGPL-3.0
    1. .dtd came up a few times. something related to gis, I think. I added a few more gis formats
    2. per https://docs.qgis.org/3.44/en/docs/user_manual/managing_data_source/supported_data.html
    3. and https://gis.stackexchange.com/questions/392708/list-of-data-file-formats-supported-in-qgis-including-read-write-support
Files:
 *.c *.cpp *.h *.hpp
 *.py *.pl *.go
 *.qix *.dtd *.shp *.shz *.dbf *.shx *.prj *.kml
 *.html *.css *.js *.xml
Copyright:
 2023 Michael Altfield <https://email.michaelaltfield.net>
 2023 Eco-Libre <https://eco-libre.org/contact>
License: AGPL-3.0
    1. Another thing I can do is to check some syntax highlighers, which have some logic to auto-detect code syntax based on filename. That would be a great list of code-specific filenames
      1. here's the one we use as a wordpress plugin for eco-libre.org https://wordpress.org/plugins/syntaxhighlighter/
      2. code is here https://github.com/Automattic/syntaxhighlighter
      3. here's the block where they map languages to file extensions https://github.com/Automattic/syntaxhighlighter/blob/61fd26c64d019641db143e90e05b0eb9a4a57d62/syntaxhighlighter.php#L181-L246
      4. oh crap, those are aliases, not file extensions. maybe I should check something like notepad++ or vim
      5. we can get 694 file types from vim with this crazy command https://vi.stackexchange.com/a/14980
user@disp4360:/usr/share/vim/vim90$ find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u | wc -l
694
user@disp4360:/usr/share/vim/vim90$ 

user@disp4360:/usr/share/vim/vim90$ find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u | xargs
2html 8th a2ps a65 aap abap abaqus abc abel acedb ada aflex ahdl aidl alsaconf amiga aml ampl ant antlr apache apachestyle aptconf arch arduino art asciidoc asm asm68k asmh8300 asn aspperl aspvbs asterisk asteriskvm atlas autodoc autohotkey autoit automake ave avra awk ayacc b baan bash basic bc bdf bib bindzone bitbake blank bsdl bst btm bzl bzr c cabal cabalconfig cabalproject calendar catalog cdl cdrdaoconf cdrtoc cf cfg ch chaiscript change changelog chaskell chatito cheetah chicken chill chordpro cl clean clipper clojure cmake cmod cmusrc cobol coco colortest conaryrecipe conf config confini context context-data-context context-data-interfaces context-data-metafun context-data-tex cpp crm crontab cs csc csdl csh csp css cterm ctrlh cucumber cuda cupl cuplsim cvs cvsrc cweb cynlib cynpp d dart datascript dcd dcl debchangelog debcontrol debcopyright debsources def denyhosts dep3patch desc desktop dictconf dictdconf diff dircolors dirpager diva django dns dnsmasq docbk docbksgml docbkxml dockerfile dosbatch dosini dot doxygen dracula dsl dtd dtml dtrace dts dune dylan dylanintr dylanlid ecd edif editorconfig eiffel elf elinks elixir elm elmfilt erlang eruby esmtprc esqlc esterel eterm euphoria3 euphoria4 eviews exim expect exports falcon fan fasm fdcc fennel fetchmail fgl fish flexwiki focexec form forth fortran foxpro fpcmake framescript freebasic fstab fvwm fvwm2m4 gdb gdmo gdresource gdscript gdshader gedcom gemtext gift git gitattributes gitcommit gitconfig gitignore gitolite gitrebase gitsendemail gkrellmrc gnash gnuplot go godoc gp gpg gprof grads gretl groff groovy group grub gsp gtkrc gvpr gyp haml hamster hare haskell haste hastepreproc hb heex help help_ru hercules hex hgcommit hgcommitDiff hitest hlsplaylist hog hollywood hostconf hostsaccess html htmlcheetah htmldjango htmlm4 htmlos i3config ia64 ibasic icemenu icon idl idlang indent inform initex initng inittab ipfilter ishd iss ist j jal jam jargon java javacc javascript javascriptreact jess jgraph jovial jproperties json jsonc jsonnet jsp julia kconfig kivy kix krl kscript kwt lace latte lc ld ldapconf ldif less lex lftp lhaskell libao lifelines lilo limits liquid lisp lite litestep logcheck loginaccess logindefs logtalk lotos lout lpc lprolog lscript lsl lss lua lynx lyrics m3build m3quake m4 mail mailaliases mailcap make mallard man manconf manual maple markdown masm mason master matlab maxima mel mermaid meson messages mf mgl mgp mib mix mma mmix mmp modconf model modsim3 modula2 modula3 monk moo mp mplayerconf mrxvtrc msidl msmessages msql mupad murphi mush muttrc mysql n1ql named nanorc nasm nastran natural ncf neomuttrc netrc netrw nginx ninja nix nosyntax nqc nroff nsis obj objc objcpp obse ocaml occam octave omnimark opam openroad openscad openvpn opl ora pamconf pamenv papp pascal passwd pbtxt pcap pccts pdf perl pf pfmain php phtml pic pike pilrc pine pinfo plaintex pli plm plp plsql po pod poefilter poke postscr pov povini ppd ppwiz prescribe privoxy procmail progress prolog promela proto protocols ps1 ps1xml psf psl ptcap purifylog pyrex python python2 qb64 qf quake quarto r racc racket radiance raku raml ratpoison rc rcs rcslog readline rebol redif registry rego remind resolv reva rexx rhelp rib rmd rnc rng rnoweb robots routeros rpcgen rpl rrst rst rtf ruby rust samba sas sass sather sbt scala scdoc scheme scilab screen scss sd sdc sdl sed sendpr sensors services setserial sexplib sgml sgmldecl sgmllnx sh sicad sieve sil simula sinda sindacmp sindaout sisu skill sl slang slice slpconf slpreg slpspi slrnrc slrnsc sm smarty smcl smil smith sml snnsnet snnspat snnsres snobol4 solidity solution spec specman spice splint spup spyce sql sqlanywhere sqlforms sqlhana sqlinformix sqlj sqloracle sqr squid squirrel srec srt ssa sshconfig sshdconfig st stata stp strace structurizr sudoers svg svn swayconfig swift swiftgyb syncolor synload syntax sysctl systemd systemverilog tads tags tak takcmp takout tap tar taskdata taskedit tasm tcl tcsh template teraterm terminfo tex texinfo texmf text tf tidy tilde tli tmux toml tpp trasys treetop trustees tsalt tsscl tssgm tssop tt2 tt2html tt2js typescript typescriptcommon typescriptreact uc udevconf udevperm udevrules uil updatedb upstart upstreamdat upstreaminstalllog upstreamlog upstreamrpt usserverlog usw2kagtlog valgrind vb vdf vera verilog verilogams vgrindefs vhdl vim viminfo virata vmasm voscm vrml vroom vsejcl vue wast wdiff wdl web webmacro wget wget2 whitespace winbatch wml wsh wsml wvdial xbl xdefaults xf86conf xhtml xinetd xkb xmath xml xmodmap xpm xpm2 xquery xs xsd xslt xxd yacc yaml z8a zig zimbu zir zsh
user@disp4360:/usr/share/vim/vim90$ 
      1. so I definitely don't want all of those. for example, .po files are not code.
    1. I decided to remove html and css from the list, as those are markup and not code. but js should remain.
    2. I reduced the vim list to the following
user@disp4360:~$ cat filetypes1.txt 
autohotkey
automake
awk
bash
basic
cmake
cuda
d
erlang
eruby
haskell
j
java
javacc
javascript
javascriptreact
kivy
lisp
lua
make
perl
r
ruby
rust
sh
swift
tcl
typescript
vb
zsh
user@disp4360:~$ 
    1. fun fact, autohotkey was the first "language" I learned – which I used to script my windows computer to feed my fish and collect their pooped-out gold in some video game, wayy back when I was kid & before I used Linux. It's a cool way to automate GUI macros on Windows (which is otherwise a PIA to automate, by (terrible) design.
    2. I merged this into our copyright file. I also added asp.
Files:
 *.c *.cpp *.h *.hpp *.make *.automake *.cmake
 *.java *.javacc *.rust
 *.d *.j *.r
 *.sh *.bash *.zsh *.awk *.tcl
 *.py *.python *.python2 *.python3 *.pl *.perl *.kivy
 *.qix *.dtd *.shp *.shz *.dbf *.shx *.prj *.kml
 *.php *.js *.javascript *.typescript
 *.ruby *.eruby *.cuda *.erlang *.lisp *.lua *.haskell *.go
 *.autohotkey *.basic *.swift *.vb *.asp
Copyright:
 2023 Michael Altfield <https://email.michaelaltfield.net>
 2023 Eco-Libre <https://eco-libre.org/contact>
License: AGPL-3.0
    1. let's also add exceptions for the CERN-licensed files
    2. I hope we never use tools like AutoCAD, but it's likely that someone will design something in AutoCAD and copyleft it. Then we'll be able to use that in one of our projects, but where we redesign it in FreeCAD. In that case, we still might want to include the source AutoCAD DXF file in our repo, and license it properly (though, if that happens, we'd probably need to update the copyright file to whatever license they use; unless they happen to use the same CERN strong license as us)
    3. I added scad. And .vue was one from vim.
    4. bibliocad lists wg, bim, skp, max, and 3ds https://www.bibliocad.com/
    5. I logged into the OSE wiki and checked all of the files that have been uploaded, and I added a few more: 3dm, fcmacro, ino, fzz, gto, blend, kicad_pcb, sh3d, pod, brd, sch, abp, dwb, cc, skb, sldrw, sldasm, pde
    6. note that I've *not* put stp, gcode, stl, igs, wrl, wrz, etc files as CERN licensed (so they'd be CC). I'm not sure if that's the right thing or not.
      1. also dia, gan, mpp, mm, svg, jpg, png, jpeg, tiff, bmp, ai, idml, psd, mp4, mp3, webm, wav, kdenlive, xcf, doc, docx, ppt, pptx, xls, odt, ods, odg, numbers, tex, zip, rar, 7z, tar.gz, torrent, etc..
      2. there was also some ini config files. I read you can't license config files. so those will be CC.
  1. ok, here's what I got
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Source: https://github.com/Eco-Libre/life-line
Upstream-Name: Eco-Libre Life-Line
Upstream-Contact: https://eco-libre.org/contact

Files:
 *
Copyright:
 2023 Michael Altfield <https://email.michaelaltfield.net>
 2023 Eco-Libre <https://eco-libre.org/contact>
License: CC-BY-SA-4.0

Files:
 *.FCStd *.scad *.fzz *.blend *.kicad_pcb *.sh3d
 *.vue *.dxf *.dwg *.bim *.skp *.skb *.max *.3ds *.gto *.pod *.brd
 *.sch *.3dm *.dwb *.slddrw *.sldasm
Copyright:
 2023 Michael Altfield <https://email.michaelaltfield.net>
 2023 Eco-Libre <https://eco-libre.org/contact>
License: CERN-OHL-S-2.0

Files:
 *.c *.cpp *.h *.hpp *.cc *.ino *.pde *.make *.automake *.cmake
 *.java *.javacc *.rust
 *.d *.j *.r
 *.sh *.bash *.zsh *.awk *.tcl
 *.py *.python *.python2 *.python3 *.FCMacro *.pl *.perl *.kivy
 *.qix *.dtd *.shp *.shz *.dbf *.shx *.prj *.kml
 *.php *.js *.javascript *.typescript
 *.ruby *.eruby *.cuda *.erlang *.lisp *.lua *.haskell *.go
 *.autohotkey *.basic *.swift *.vb *.asp
Copyright:
 2023 Michael Altfield <https://email.michaelaltfield.net>
 2023 Eco-Libre <https://eco-libre.org/contact>
License: AGPL-3.0

License: AGPL-3.0
 https://www.gnu.org/licenses/agpl-3.0.html
 .
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU Affero General Public License as
 published by the Free Software Foundation, version 3
 .
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU Affero General Public License for more details.
 .
 You should have received a copy of the GNU Affero General Public License
 along with this program.  If not, see <https://www.gnu.org/licenses/>.

License: CERN-OHL-S-2.0
 https://ohwr.org/cern_ohl_s_v2.txt
 .
 You may redistribute and modify this source and make products using 
 it under the terms of the CERN-OHL-S v2 
 (https://ohwr.org/cern_ohl_s_v2.txt).
 .
 This source is distributed WITHOUT ANY EXPRESS OR IMPLIED WARRANTY, 
 INCLUDING OF MERCHANTABILITY, SATISFACTORY QUALITY AND FITNESS FOR A 
 PARTICULAR PURPOSE. Please see the CERN-OHL-S v2 for applicable 
 conditions.
 .
 Source location: eco-libre.org/p/
 .
 As per CERN-OHL-S v2 section 4, should You produce hardware based on 
 this source, You must where practicable and applicable maintain the 
 Source Location visible (1) on the packaging of the hardware, (2) on 
 the circuit board(s) via silkscreen or copper, (3) in any 
 documentation, and (4) on other products you make using this source.

License: CC-BY-SA-4.0
 http://creativecommons.org/licenses/by-sa/4.0/
 .
 Attribution-ShareAlike 4.0 International
 .
 =======================================================================
 .
 Creative Commons Corporation ("Creative Commons") is not a law firm and
 does not provide legal services or legal advice. Distribution of
 Creative Commons public licenses does not create a lawyer-client or
 other relationship. Creative Commons makes its licenses and related
 information available on an "as-is" basis. Creative Commons gives no
 warranties regarding its licenses, any material licensed under their
 terms and conditions, or any related information. Creative Commons
 disclaims all liability for damages resulting from their use to the
 fullest extent possible.
 .
 Using Creative Commons Public Licenses
 .
 Creative Commons public licenses provide a standard set of terms and
 conditions that creators and other rights holders may use to share
 original works of authorship and other material subject to copyright
 and certain other rights specified in the public license below. The
 following considerations are for informational purposes only, are not
 exhaustive, and do not form part of our licenses.
 .
	  Considerations for licensors: Our public licenses are
	  intended for use by those authorized to give the public
	  permission to use material in ways otherwise restricted by
	  copyright and certain other rights. Our licenses are
	  irrevocable. Licensors should read and understand the terms
	  and conditions of the license they choose before applying it.
	  Licensors should also secure all rights necessary before
	  applying our licenses so that the public can reuse the
	  material as expected. Licensors should clearly mark any
	  material not subject to the license. This includes other CC-
	  licensed material, or material used under an exception or
	  limitation to copyright. More considerations for licensors:
	  wiki.creativecommons.org/Considerations_for_licensors
 .
	  Considerations for the public: By using one of our public
	  licenses, a licensor grants the public permission to use the
	  licensed material under specified terms and conditions. If
	  the licensor's permission is not necessary for any reason--for
	  example, because of any applicable exception or limitation to
	  copyright--then that use is not regulated by the license. Our
	  licenses grant only permissions under copyright and certain
	  other rights that a licensor has authority to grant. Use of
	  the licensed material may still be restricted for other
	  reasons, including because others have copyright or other
	  rights in the material. A licensor may make special requests,
	  such as asking that all changes be marked or described.
	  Although not required by our licenses, you are encouraged to
	  respect those requests where reasonable. More_considerations
	  for the public:
	  wiki.creativecommons.org/Considerations_for_licensees
 .
 =======================================================================
 .
 Creative Commons Attribution-ShareAlike 4.0 International Public
 License
 .
 By exercising the Licensed Rights (defined below), You accept and agree
 to be bound by the terms and conditions of this Creative Commons
 Attribution-ShareAlike 4.0 International Public License ("Public
 License"). To the extent this Public License may be interpreted as a
 contract, You are granted the Licensed Rights in consideration of Your
 acceptance of these terms and conditions, and the Licensor grants You
 such rights in consideration of benefits the Licensor receives from
 making the Licensed Material available under these terms and
 conditions.
 .
 .
 Section 1 -- Definitions.
 .
   a. Adapted Material means material subject to Copyright and Similar
	  Rights that is derived from or based upon the Licensed Material
	  and in which the Licensed Material is translated, altered,
	  arranged, transformed, or otherwise modified in a manner requiring
	  permission under the Copyright and Similar Rights held by the
	  Licensor. For purposes of this Public License, where the Licensed
	  Material is a musical work, performance, or sound recording,
	  Adapted Material is always produced where the Licensed Material is
	  synched in timed relation with a moving image.
 .
   b. Adapter's License means the license You apply to Your Copyright
	  and Similar Rights in Your contributions to Adapted Material in
	  accordance with the terms and conditions of this Public License.
 .
   c. BY-SA Compatible License means a license listed at
	  creativecommons.org/compatiblelicenses, approved by Creative
	  Commons as essentially the equivalent of this Public License.
 .
   d. Copyright and Similar Rights means copyright and/or similar rights
	  closely related to copyright including, without limitation,
	  performance, broadcast, sound recording, and Sui Generis Database
	  Rights, without regard to how the rights are labeled or
	  categorized. For purposes of this Public License, the rights
	  specified in Section 2(b)(1)-(2) are not Copyright and Similar
	  Rights.
 .
   e. Effective Technological Measures means those measures that, in the
	  absence of proper authority, may not be circumvented under laws
	  fulfilling obligations under Article 11 of the WIPO Copyright
	  Treaty adopted on December 20, 1996, and/or similar international
	  agreements.
 .
   f. Exceptions and Limitations means fair use, fair dealing, and/or
	  any other exception or limitation to Copyright and Similar Rights
	  that applies to Your use of the Licensed Material.
 .
   g. License Elements means the license attributes listed in the name
	  of a Creative Commons Public License. The License Elements of this
	  Public License are Attribution and ShareAlike.
 .
   h. Licensed Material means the artistic or literary work, database,
	  or other material to which the Licensor applied this Public
	  License.
 .
   i. Licensed Rights means the rights granted to You subject to the
	  terms and conditions of this Public License, which are limited to
	  all Copyright and Similar Rights that apply to Your use of the
	  Licensed Material and that the Licensor has authority to license.
 .
   j. Licensor means the individual(s) or entity(ies) granting rights
	  under this Public License.
 .
   k. Share means to provide material to the public by any means or
	  process that requires permission under the Licensed Rights, such
	  as reproduction, public display, public performance, distribution,
	  dissemination, communication, or importation, and to make material
	  available to the public including in ways that members of the
	  public may access the material from a place and at a time
	  individually chosen by them.
 .
   l. Sui Generis Database Rights means rights other than copyright
	  resulting from Directive 96/9/EC of the European Parliament and of
	  the Council of 11 March 1996 on the legal protection of databases,
	  as amended and/or succeeded, as well as other essentially
	  equivalent rights anywhere in the world.
 .
   m. You means the individual or entity exercising the Licensed Rights
	  under this Public License. Your has a corresponding meaning.
 .
 .
 Section 2 -- Scope.
 .
   a. License grant.
 .
		1. Subject to the terms and conditions of this Public License,
		   the Licensor hereby grants You a worldwide, royalty-free,
		   non-sublicensable, non-exclusive, irrevocable license to
		   exercise the Licensed Rights in the Licensed Material to:
 .
			 a. reproduce and Share the Licensed Material, in whole or
				in part; and
 .
			 b. produce, reproduce, and Share Adapted Material.
 .
		2. Exceptions and Limitations. For the avoidance of doubt, where
		   Exceptions and Limitations apply to Your use, this Public
		   License does not apply, and You do not need to comply with
		   its terms and conditions.
 .
		3. Term. The term of this Public License is specified in Section
		   6(a).
 .
		4. Media and formats; technical modifications allowed. The
		   Licensor authorizes You to exercise the Licensed Rights in
		   all media and formats whether now known or hereafter created,
		   and to make technical modifications necessary to do so. The
		   Licensor waives and/or agrees not to assert any right or
		   authority to forbid You from making technical modifications
		   necessary to exercise the Licensed Rights, including
		   technical modifications necessary to circumvent Effective
		   Technological Measures. For purposes of this Public License,
		   simply making modifications authorized by this Section 2(a)
		   (4) never produces Adapted Material.
 .
		5. Downstream recipients.
 .
			 a. Offer from the Licensor -- Licensed Material. Every
				recipient of the Licensed Material automatically
				receives an offer from the Licensor to exercise the
				Licensed Rights under the terms and conditions of this
				Public License.
 .
			 b. Additional offer from the Licensor -- Adapted Material.
				Every recipient of Adapted Material from You
				automatically receives an offer from the Licensor to
				exercise the Licensed Rights in the Adapted Material
				under the conditions of the Adapter's License You apply.
 .
			 c. No downstream restrictions. You may not offer or impose
				any additional or different terms or conditions on, or
				apply any Effective Technological Measures to, the
				Licensed Material if doing so restricts exercise of the
				Licensed Rights by any recipient of the Licensed
				Material.
 .
		6. No endorsement. Nothing in this Public License constitutes or
		   may be construed as permission to assert or imply that You
		   are, or that Your use of the Licensed Material is, connected
		   with, or sponsored, endorsed, or granted official status by,
		   the Licensor or others designated to receiv

= 2026-04-23 =
# I've been thinking about chaning our licensing, to something like this
## All hardware designs are licened under CERN-OHL-S-2.0 
## All code is licened under AGPL-3.0
## Everything else (art, documentation, etc) are CC BY-SA
# here's the design rational for the cern license (the s means strongly reciprocal, which is what we want) https://gitlab.com/ohwr/project/cernohl/-/wikis/uploads/0be6f561d2b4a686c5765c74be32daf9/CERN_OHL_rationale.pdf
# apparently creative commons license aren't OSI approved — only because they don't work for sourcecode https://opensource.stackexchange.com/questions/5021/osi-approved-license-similar-to-cc-by-sa-4-0
## by CC BY-SA (without NC or ND) are recommended by OSHWA for things like art and docs https://oshwa.org/resources/sharing-best-practices/
## hah, the footer of the OSI website (opensource.org) says that the contents of the website are licened CC BY – even though it's not OSI approved. That's a good enough endorsement for me
# oh, I found a CERN Discourse forum https://forums.ohwr.org/c/cernohl/53
## I never did get a response from OSHWA from my toot about their recommended CLAs https://chaos.social/@ecolibre/116444933464052302
## da fuk. the "register" button redirects to gitlab?
### ugh, it's some SSO OAuth (OpenID Connect). I don't trust that
<pre>
OHWR Forum is requesting access to your account on GitLab.com.
 Make sure you trust OHWR Forum before authorizing.

Vasco Guita added this OAuth application over 1 year ago. You will be redirected to forums.ohwr.org after authorizing.
      1. I decllined it, and chose to create a new github account that's specific to these oshwa forums, and nothing else
    1. ok I asked about the triple-licensing here https://forums.ohwr.org/t/possible-to-triple-license-cern-ohl-s-2-0-agpl-3-0-cc-by-sa/849882
    2. ugh, the license of the licnese itself is CC BY-ND 4.0 :( https://gitlab.com/ohwr/project/cernohl/-/wikis/faq#q-i-am-using-one-of-variants-of-cern-ohl-v2-what-is-the-licence-of-the-licence-text-itself
      1. I have no intention to change it, but it would be nice if we had the abilty to add, idk, footnotes or page numbers or any trivial change if we needed
  1. hmm...the faq on the cern license say that it's *not* compatible with GPL https://gitlab.com/ohwr/project/cernohl/-/wikis/faq#q-is-cern-ohl-s-compatible-with-gpl
Q: Is CERN-OHL-S compatible with GPL?
A: No...
    1. so we can't just license everything under both, I guess. But we might be able to specify that the hardware designs are CERN and any software is GPL, still
  1. here's a good example usage; they have the full license in LICENSE file, but they also have a "License Notice" section of their README.mde with the following https://github.com/Foundation-Devices/passport-electronics
You may redistribute and modify this source and make products using it under the terms of the CERN-OHL-S v2 (https://ohwr.org/cern_ohl_s_v2.txt).

This source is distributed WITHOUT ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING OF MERCHANTABILITY, SATISFACTORY QUALITY AND FITNESS FOR A PARTICULAR PURPOSE. Please see the CERN-OHL-S v2 for applicable conditions.

Source location: foundationdevices.com/passport-electronics

As per CERN-OHL-S v2 section 4, should You produce hardware based on this source, You must where practicable and applicable maintain the Source Location visible (1) on the packaging of the hardware, (2) on the circuit board(s) via silkscreen or copper, (3) in any documentation, and (4) on other products you make using this source.
    1. I especially like the "Source location" part. We can use https://eco-libre.org/p (which is our "projects" page, indended to have one page per project – each with a *very* short summary, link to the *real* docs (currently on github, but that may change to codeberg – which is why we have this simple project page on our own infra), and a list of articles that are tagged with the project's name.
      1. currently we only have one example for life-line https://www.eco-libre.org/p/life-line/ – but, again, we'd want to just link to eco-libre.org/p/ so we can have a boilerplate copy-pasta for all repo's README.md files
  1. there's a 6-page guide on how to use the CERN license here https://gitlab.com/ohwr/project/cernohl/-/wikis/uploads/cf37727497ca2b5295a7ab83a40fcf5a/cern_ohl_s_v2_user_guide.pdf
    1. cool, they do recommend using git. something I advocated-for (and never really got traction-on) at OSE
    2. interesting, they recommend we create a CHANGES file, because the license requires downstream modifications to be clearly documented. And by creating a blank file, it's where they should write their downstream changes.
    3. oh wow, they specifically mention FCStd files. So the writers of this license had FreeCAD in mind. Cool!
    4. they reference SPDX standard by resue.software https://reuse.software/tutorial/
      1. apparently this is a standardized way to indicate licenses of files that are machine-readable. Because, of course there is a standard for that.
      2. interesting, they advocate for a folder LICENSES instead of a file LICENSE. that would be better for us, if we're using three.
      3. ok, apparently SPDX is a distinct product from the Linux Foundation https://spdx.org/
      4. they say all of these are valid ways to declare copyright; I like it
SPDX-FileCopyrightText: 2019 Jane Doe <jane@example.com>
SPDX-FileCopyrightText: © 2019 John Doe <john@example.com>
SPDX-FileCopyrightText: Contributors to Example Project <https://project.example.com>
SPDX-FileCopyrightText: 2023 Alice Hack and (other) contributors to Project X <https://git.example.com/alicehack/projectx/CONTRIBUTORS.md>
SPDX-SnippetCopyrightText: (C) Example Cooperative <info@coop.example.com>
© Example Corporation <https://corp.example.com>
Copyright 2016, 2018-2019 Joe Anybody
Copyright (c) Alice, some rights reserved
        1. I especially like line 4. I think I'd use that. So it would be my name, all contributors, and a link to the Attribution section of the docs
      1. they also clarify that the copyright line can omit the year or include a range, the current year, or the original year. I always thought the first year that we did a single commit was best, and they had a link to an article that argues this too. I like that. https://matija.suklje.name/how-and-why-to-properly-write-copyright-statements-in-your-code
      2. they have a section on license compatiblity https://reuse.software/faq/#license-compatibility
        1. apparently GPL isn't compatible with lots of license, because it says you can't add restrictions to it. that would make it incompatible with CC NC licenses, for example.
      3. god, both CERN and reuse.software want us to add comments or a cooresponding '<file>.license' file to *every* file to indicate its license. I was hoping instead that we could just put text that says "hardware files are CERN and software is GPL" but idk if that'll work :/
        1. they have an "eaiser" method of defining a REUSE.toml file – but that's per-dir. So I'd have to put all software in one dir and all CAD files in another dir. I guess that would work, but eventually someone will probably break it due to human error and volunteer chaos https://reuse.software/faq/#license-compatibility
    1. the faq had said they were going to apply to the FSF, but fsf.org has no mention of the CERN OHL
      1. this thread goes into some detail on why they "gave up" on GPL compatibility https://forums.ohwr.org/t/concerns-on-the-impact-of-ohl-on-gpl-community/848400
        1. also some good history on the OHL from Javier Serrano at CERN. He said he gave a presentation on why using GPL was good for hardware, but after the Q&A he realized it wasn't. That was in 2015 at ORConf.
        2. that thread linked to another cool open hardware forum. GOSH! https://forum.openhardware.science/
      2. here's the thread where CERN applied for OHL to be covered by OSI (which it got) https://lists.opensource.org/pipermail/license-review_lists.opensource.org/2020-June/004892.html
    2. back to the usage guide on CERN OHL, they also mention Debian's DEP5. DEP5 used to be supported by reuse.software, but it was deprecated
      1. DEP-5 is another machine-readable copyright/license standard, currently documented here https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
        1. man, I don't know which I like better: human-readable legaleze (well, readable only to a subset of superhumans) or machine-readable complexity
        2. they use machine-readable license shortcodes, which are defined by spdx here https://spdx.org/licenses/
        3. so we want
          1. CERN-OHL-S-2.0
          2. AGPL-3.0-or-later
          3. CC-BY-SA-4.0
        4. curiously, only two of the CC licenses are marked as "FSF libre" = CC-BY-4.0 and CC-BY-SA-4.0. None are "OSI Approved" (but see above because OSI uses them for docs!)
        5. hah, cern is the opposite. their 2.0 OHLs are "OSI approved" but not "FSF libre"
        6. the AGPL-3.0-or-later (or -only) is both "OSI approved" *and* "FSF libre" huh
      2. anyway, the DEP5 has a similar system to define regex-like globs of files under different licenses
      3. the end of the spec includes a "complex" example
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Source: https://www.example.com/code/venus
Upstream-Name: Planet Venus
Upstream-Contact: John Doe <jdoe@example.com>

Files:
 *
Copyright: 2008, John Doe <jdoe@example.com>
		   2007, Jane Smith <jsmith@example.org>
		   2007, Joe Average <joe@example.org>
		   2007, J. Random User <jr@users.example.com>
License: PSF-2

Files:
 debian/*
Copyright: 2008, Dan Developer <dan@debian.example.com>
License: permissive
 Copying and distribution of this package, with or without modification,
 are permitted in any medium without royalty provided the copyright notice
 and this notice are preserved.

Files:
 debian/patches/theme-diveintomark.patch
Copyright: 2008, Joe Hacker <hack@example.org>
License: GPL-2+

Files:
 planet/vendor/compat_logging/*
Copyright: 2002, Mark Smith <msmith@example.org>
License: MIT
 [LICENSE TEXT]

Files:
 planet/vendor/httplib2/*
Copyright: 2006, John Brown <brown@example.org>
License: MIT2
 Unspecified MIT style license.

Files:
 planet/vendor/feedparser.py
Copyright: 2007, Mike Smith <mike@example.org>
License: PSF-2

Files:
 planet/vendor/htmltmpl.py
Copyright: 2004, Thomas Brown <coder@example.org>
License: GPL-2+

License: PSF-2
 [LICENSE TEXT]

License: GPL-2+
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2 of the License, or
 (at your option) any later version.
 .
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 .
 You should have received a copy of the GNU General Public License
 along with this package; if not, see <https://www.gnu.org/licenses/>.
Comment:
 On Debian systems, the full text of the GNU General Public License
 version 2 can be found in the file '/usr/share/common-licenses/GPL-2'.
      1. I was wondering if I could match all files of a given type at any depth, and it looks like this is accounted-for
Patterns match pathnames that start at the root of the source tree. Thus, “Makefile.in” matches only the file at the root of the tree, but “*/Makefile.in” matches at any depth.
      1. oh, it also says globs include slashes
Only the wildcards * and ? apply; the former matches any number of characters (including none), the latter a single character. Both match slashes (/) and leading dots, unlike shell globs. The pattern *.in therefore matches any file whose name ends in .in anywhere in the source tree, not just at the top level.
      1. so I could do something like
Files:
 *
Copyright: 2023 Michael Altfield and Eco-Libre
License: CC-BY-SA-4.0

Files:
 *.FCStd
Copyright: 2023 Michael Altfield and Eco-Libre
License: CERN-OHL-S-2.0

Files:
 *.py
Copyright: 2023 Michael Altfield and Eco-Libre
License: AGPL-3.0-or-later
      1. but then it's not clear which overrrides the others
      2. oh, it says the last one that matches applies. So I did that perfect
Multiple Files stanzas are allowed. The last stanza that matches a particular file applies to it. More general stanzas should therefore be given first, followed by more specific overrides.
      1. honestly, that seems like the perfect happy-medium. It's less to maintain (or for maintainers to screw-up) than .license files everywhere (per REUSE). so it's more long-term durable. I just need to think of all possible file extensions for code that we'll use (it'll be more than just .py files, I'm sure) and hardware files (stl would be CC, so that's caught by the first one but OpenSCAD could foreseably be one)
      2. hmm...I wonder how kdenlive files should be licensed. It's used to make media, but not the media itself.
      3. I asked my question on Stack Exchange too https://opensource.stackexchange.com/questions/15745/possible-to-triple-license-cern-ohl-s-2-0-agpl-3-0-cc-by-sa
      4. I also asked about kdenlive files here https://opensource.stackexchange.com/questions/15746/best-libre-license-for-kdenlive-files
    1. back to the usage guide of the CERN OHL. they do say you should use the SPDX headers, but that's REUSE – not DEP5
    2. they also recommend adding a "+" for "-or-later"
CERN-OHL-S-2.0+
    1. but I guess I have to place trust in FSF and/or CERN that they won't become evil and fuck-up future licenses to be not-libre. hmm. imagine if they got bought-out by John Deere.. Yeah, it's probably better to pin to the current version, and just do the copyright transfer in the CLA. Then we can control the license, and change it if we ever discover some new tech that necessitates changes to a new license
    2. for the copyright, they suggest "and others" – that might be better than just "and contributors to Eco-Libre"
Suggestion: You can optionally include a copyright notice to be printed
on the Product (remember you must keep intact any Notices in the source,
though). If you do, and your design includes part of other designs, you
should at least acknowledge the work is not all your own by using e.g.
Copyright c 2020 Sam Smith and others. In any case, do not include the
CERN logo.
  1. well we'll see if I got any answers on the forums
  2. in the meantime, I want to finish my CLA agreements
  3. yesterday I made a very slick looking libreoffice document with the individual CLA, but I realized today that it would be better if I could store it in reST and generate the PDF using sphinx or pandoc
    1. so, yeah, it would absolutely be better, but I really think I'm letting perfect be the enemy of the good here. I'm already spending weeks just to finish the ConfirmAccount extension on the wiki – just because I didn't have a Terms of Service, which sent me down this rabbit hole.
    2. I'm going to make the reST -> PDF part a TODO. The libreoffice file is currently 64 KB and the PDF is 95 KB. I'll probably have maybe 4-10x that, as I add a corporate CLA and also some other less-important agreements for volunteers (I agree not to use AI. I agree to follow the CoC. Etc)
    3. oh wtf. I finished making the libreoffice for the corporate version of the contract (it's called "entity") but the only difference in the file's contents is literally the subtitle
Individual Contributor Exclusive License Agreement
Entity Contributor Exclusive License Agreement
    1. I also diff'd the html version, just in-case it was a bug. same thing
<h2 id="tmp-subtitle"><span id="tmp-contributor-type">Individual</span> Contributor <span id="tmp-contributor-exclusivity-1" class="tmp-contributor-exclusivity-1">Exclusive</span> License Agreement</h2>
<h2 id="tmp-subtitle"><span id="tmp-contributor-type">Entity</span> Contributor <span id="tmp-contributor-exclusivity-1" class="tmp-contributor-exclusivity-1">Exclusive</span> License Agreement</h2>
    1. maybe there would be differences if I chose a different patent option?
  1. idk, but I guess I only need one doc...
  2. TODO: finish the CLA docs in LibreOffice, put them on github somewhere, then do the other volunteer agreements, and then sign them myself

2026-04-22

  1. picking up where we left-off yesterday, we're looking at examples of open-source CLAs
  2. Ideally we want a simple one for the wiki an a strong legal one for future volunteers to sign
  3. OpenJS has these https://openjsf.org/cla
    1. indivdual https://images.prismic.io/openjsf/4c740999-4bd7-4f69-8c4a-b80db0919690_OpenJS-Foundation-ICLA-2020-09-23.pdf
    2. corporate https://images.prismic.io/openjsf/7f4dc103-c6cf-41ab-a2e8-42248e8a45f2_OpenJS-Foundation-CCLA-2020-09-23.pdf
    3. they say they were made by the Linux Foundation's EasyCLA tool https://easycla.lfx.linuxfoundation.org/#/
      1. oh, we saw that one yesterday; it's authalled :/
  4. CNCF (kubernetes) also uses EasyCLA, which is apparently integrated into GitHub https://github.com/kubernetes/community/blob/main/CLA.md
  5. OpenBMC has these two; no idea what the doc's license is
    1. individual https://github.com/kubernetes/community/blob/main/CLA.md
    2. corporate https://drive.google.com/file/d/1d-2M8ng_Dl2j1odsvZ8o1QHAdHB-pNSH/edit
  6. here's python's; the license is unsaid https://www.python.org/psf/contrib/
  7. Apollo's derived its from Apache's https://contribute.apollographql.com/
  8. here's microsoft's https://opensource.microsoft.com/cla/
    1. actual doc is here; it's CC0 https://opensource.microsoft.com/pdf/microsoft-contribution-license-agreement.pdf
    2. it's pretty software focused, but I like that it's licensed openly
    3. it's also only good for individual contributions
  9. here's a short & sweet one by musescore, but it's not clear how it's licensed https://musescore.org/en/cla
  10. here's openmediavault's https://www.openmediavault.org/contributoragreement.html
    1. doc is actually here; it's derived from apache's CLA https://www.openmediavault.org/wp-content/uploads/2013/12/oca.pdf
  11. the link to openstack (openinfra) was bad; looks like they replaced their CLA with the Linux Foundation's DOC https://www.openmediavault.org/wp-content/uploads/2013/12/oca.pdf
  12. puppet uses this CLA Assistant one, based on Apache's https://cla-assistant.io/puppetlabs/
  13. sangoma uses this one, also using CLA Assistant, but it doesn't mention apache https://web.archive.org/web/20230429235353/https://oss-cla.sangoma.com/asterisk/asterisk
  14. the W3C's looks pretty good, and specifc to them https://www.w3.org/community/about/process/cla/
    1. the license isn't explicilty stated, but the footer says it's website contents is licensed by, uh, their own "document license - 2023 version" https://www.w3.org/copyright/document-license-2023/
  15. here's one by zed; it's not clear how the text is licensed https://zed.dev/cla
  16. KDE announced theirs here https://ev.kde.org/2008/08/22/2008-08-22-fsfe-welcomes-kde-s-fiduciary-license-agreement/
    1. actual doc about the FLA is here https://ev.kde.org/rules/fla/
    2. actual doc is here
      1. individuals https://ev.kde.org/resources/FLA-2.0-individual.pdf
      2. companies https://ev.kde.org/resources/FLA-2.0-entity.pdf
    3. they seem pretty good, albeit they're very focused on software (not hardware)
    4. it says it's based on this https://contributoragreements.org/
      1. and that site's footer says its contents is CC BY-SA 4.0. Perfect.
    5. I went through their CLA Chooser generator/wizard https://contributoragreements.org/ca-cla-chooser/#
  17. that spat-out two, one for individual and one for corporate
	Fiduciary License Agreement 2.0
	based on the
	Individual Contributor Exclusive License Agreement
	(including the Traditional Patent License OPTION)

	Thank you for your interest in contributing to Eco-Libre's ____________________ ("We" or "Us").

	The purpose of this contributor agreement ("Agreement") is to clarify and document the rights granted by contributors to Us. To make this document effective, please follow the instructions at ____________________.
	Preamble

	Software is deeply embedded in all aspects of our lives and it is important that it empower, rather than restrict us. Free Software gives everybody the rights to use, understand, adapt and share software. These rights help support other fundamental freedoms like freedom of speech, press and privacy.

	Development of Free Software can follow many patterns. In some cases whole development is handled by a sole programmer or a small group of people. But usually, the creation and maintenance of software is a complex process that requires the contribution of many individuals. This also affects who owns the rights to the software. In the latter case, rights in software are owned jointly by a great number of individuals.

	To tackle this issue some projects require a full copyright assignment to be signed by all contributors. The problem with such assignments is that they often lack checks and balances that would protect the contributors from potential abuse of power from the new copyright holder.

	FSFE’s Fiduciary License Agreement (FLA) was created by the Free Software Foundation Europe e.V. with just that in mind – to concentrate all deciding power within one entity and prevent fragmentation of rights on one hand, while on the other preventing that single entity from abusing its power. The main aim is to ensure that the software covered under the FLA will forever remain Free Software.

	This process only serves for the transfer of economic rights. So-called moral rights (e.g. authors right to be identified as author) remain with the original author(s) and are inalienable.
	How to use this FLA

	If You are an employee and have created the Contribution as part of your employment, You need to have Your employer approve this Agreement. If You do not own the Copyright in Your Contribution, any other author of the Contribution should also sign this. In any event, please contact Us at https://www.eco-libre.org/contact.
	Definitions

	"You" means the individual Copyright owner who Submits a Contribution to Us; or

	if the Copyright in the Contribution is held by a Legal Entity and the Contribution is being Submitted to Us on behalf of such Legal Entity, "You" means such Legal Entity.

	"Contribution" means any original work of authorship, including any original modifications or additions to an existing work of authorship, Submitted for inclusion into Material by You to Us, in which you own the Copyright.

	"Copyright" means all rights protecting works of authorship, including copyright, moral and neighboring rights, as appropriate, for the full term of their existence.

	"Material" means the software and/or documentation of ____________________ that we make available to third parties.

	"Submit" means any act by which a Contribution is transferred to Us by You by means of tangible or intangible media, including but not limited to electronic mailing lists, source code control systems, and issue tracking systems, but excluding any transfer that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution."

	"Documentation" means any non-software portion of a Contribution.
	License grant
	Copyright license to Us

	Subject to the terms and conditions of this Agreement, You hereby grant to Us a worldwide, royalty-free, exclusive, perpetual and irrevocable (except as stated in Section "Term") license, with the right to transfer an unlimited number of non-exclusive licenses or to grant sublicenses to third parties, under the Copyright covering the Contribution to use the Contribution by all means, including, but not limited to:
		publish the Contribution,
		modify the Contribution,
		prepare derivative works based upon or containing the Contribution and/or to combine the Contribution with other Materials,
		reproduce the Contribution in original or modified form,
		distribute, to make the Contribution available to the public, display and publicly perform the Contribution in original or modified form.
	Moral rights

	Moral Rights remain unaffected to the extent they are recognized and not waivable by applicable law. Notwithstanding, You may add your name to the attribution mechanism customary used in the Materials you Contribute to, such as the header of the source code files of Your Contribution, and We will respect this attribution when using Your Contribution.
	Copyright license back to You

	Upon such grant of rights to Us, We immediately grant to You a worldwide, royalty-free, non-exclusive, perpetual and irrevocable license, with the right to transfer an unlimited number of non-exclusive licenses or to grant sublicenses to third parties, under the Copyright covering the Contribution to use the Contribution by all means, including, but not limited to:
		publish the Contribution,
		modify the Contribution,
		prepare derivative works based upon or containing the Contribution and/or to combine the Contribution with other Materials,
		reproduce the Contribution in original or modified form,
		distribute, to make the Contribution available to the public, display and publicly perform the Contribution in original or modified form.

	This license back is limited to the Contribution and does not provide any rights to the Material.
	Patents
	Patent license

	Subject to the terms and conditions of this Agreement You hereby grant to Us and to recipients of Materials distributed by Us a worldwide, royalty-free, non-exclusive, perpetual and irrevocable (except as stated in Subsection "Revocation of patent license") patent license, with the right to transfer an unlimited number of non-exclusive licenses or to grant sublicenses to third parties, to make, have made, use, sell, offer for sale, import and otherwise transfer the Contribution and the Contribution in combination with any Material (and portions of such combination). This license applies to all patents owned or controlled by You, whether already acquired or hereafter acquired, that would be infringed by making, having made, using, selling, offering for sale, importing or otherwise transferring of Your Contribution(s) alone or by combination of Your Contribution(s) with any Material.
	Revocation of patent license

	You reserve the right to revoke the patent license stated in Subsection "Patent license" if We make any infringement claim that is targeted at your Contribution and not asserted for a Defensive Purpose. An assertion of claims of the Patents shall be considered for a "Defensive Purpose" if the claims are asserted against an entity that has filed, maintained, threatened, or voluntarily participated in a patent infringement lawsuit against Us or any of Our licensees.
	License obligations by Us

	We may, but are under no obligation to, include the Contribution You Submitted to Us into the Material.

	We agree to (sub)license the Contribution or any Materials containing, based on or derived from your Contribution under the terms of any licenses that qualify as [Free Software](https://www.gnu.org/philosophy/free-sw.html) as defined by the Free Software Foundation and at the same time qualify as [Open Source](https://opensource.org/osd) as defined by the Open Source Initiative. For clarification, should we make available any Material under a non-free or non-open license, we must make a version of such Material available under a free and open license too.

	More specifically and in strict accordance with the above paragraph, we agree to (sub)license the Contribution or any Materials containing, based on or derived from the Contribution only under the terms of the following license(s) GPL-3.0, MIT (including any right to adopt any future version of a license if permitted), whereby any non-free or non-open licenses need to be listed as well.

	We agree to license patents owned or controlled by You only to the extent necessary to (sub)license Your Contribution(s) and the combination of Your Contribution(s) with the Material under the terms of any licenses the Free Software Foundation classifies as Free Software licenses and which are approved by the Open Source Initiative as Open Source licenses..
	Disclaimer
	**We acknowledge that you provide the Contribution "as is".** **More particularly, You disclaim all express or implied warranties including, without limitation, any implied warranty of satisfactory quality, fitness for a particular purpose and non-infringement. To the extent that any such warranties cannot be disclaimed, such warranty is limited in duration and extent to the minimum period and extent permitted by law.**
	Consequential damage waiver

	**To the maximum extent permitted by applicable law, in no event will You or We be liable for any loss of profits, loss of anticipated savings, loss of data, indirect, special, incidental, consequential and exemplary damages arising out of this Agreement regardless of the legal or equitable theory (contract, tort or otherwise) upon which the claim is based.**
	Approximation of disclaimer and damage waiver

	**If the disclaimer and damage waiver mentioned in Subsection "Disclaimer of warranty" and Section "Consequential damage waiver" cannot be given legal effect under applicable local law, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil or contractual liability in connection with the Contribution.**
	Term

	This Agreement shall come into effect upon Your acceptance of the terms and conditions.

	This Agreement shall apply for the term of the copyright and patents licensed here. However, You shall have the right to terminate the Agreement if We do not fulfill the obligations as set forth in Section "License obligations by Us". Such termination must be made in writing.

	In the event of a termination of this Agreement Sections "Disclaimer", "Term" and "Miscellaneous" shall survive such termination and shall remain in full force thereafter. For the avoidance of doubt, Free and Open Source Software (sub)licenses that have already been granted for Contributions at the date of the termination shall remain in full force after the termination of this Agreement.
	Miscellaneous

	This Agreement and all disputes, claims, actions, suits or other proceedings arising out of this agreement or relating in any way to it shall be governed by the laws of Ecuador excluding its private international law provisions.

	This Agreement sets out the entire agreement between You and Us for Your Contributions to Us and overrides all other agreements or understandings.

	In case of Your death, this agreement shall continue with Your heirs. In case of more than one heir, all heirs must exercise their rights through a commonly authorized person.

	If any provision of this Agreement is found void and unenforceable, such provision will be replaced to the extent possible with a provision that comes closest to the meaning of the original provision and that is enforceable. The terms and conditions set forth in this Agreement shall apply notwithstanding any failure of essential purpose of this Agreement or any limited remedy to the maximum extent possible under law.

	You agree to notify Us of any facts or circumstances of which you become aware that would make Your representations under this Agreement inaccurate in any respect.
	You
	Date:	
	Name:	
	Title:	
	Address:	
	Us
	Date:	
	Name:	
	Title:	
	Address:	
	Fiduciary License Agreement 2.0
	based on the
	Entity Contributor Exclusive License Agreement
	(including the Traditional Patent License OPTION)

	Thank you for your interest in contributing to Eco-Libre's ____________________ ("We" or "Us").

	The purpose of this contributor agreement ("Agreement") is to clarify and document the rights granted by contributors to Us. To make this document effective, please follow the instructions at ____________________.
	Preamble

	Software is deeply embedded in all aspects of our lives and it is important that it empower, rather than restrict us. Free Software gives everybody the rights to use, understand, adapt and share software. These rights help support other fundamental freedoms like freedom of speech, press and privacy.

	Development of Free Software can follow many patterns. In some cases whole development is handled by a sole programmer or a small group of people. But usually, the creation and maintenance of software is a complex process that requires the contribution of many individuals. This also affects who owns the rights to the software. In the latter case, rights in software are owned jointly by a great number of individuals.

	To tackle this issue some projects require a full copyright assignment to be signed by all contributors. The problem with such assignments is that they often lack checks and balances that would protect the contributors from potential abuse of power from the new copyright holder.

	FSFE’s Fiduciary License Agreement (FLA) was created by the Free Software Foundation Europe e.V. with just that in mind – to concentrate all deciding power within one entity and prevent fragmentation of rights on one hand, while on the other preventing that single entity from abusing its power. The main aim is to ensure that the software covered under the FLA will forever remain Free Software.

	This process only serves for the transfer of economic rights. So-called moral rights (e.g. authors right to be identified as author) remain with the original author(s) and are inalienable.
	How to use this FLA

	If You are an employee and have created the Contribution as part of your employment, You need to have Your employer approve this Agreement. If You do not own the Copyright in Your Contribution, any other author of the Contribution should also sign this. In any event, please contact Us at https://www.eco-libre.org/contact.
	Definitions

	"You" means the individual Copyright owner who Submits a Contribution to Us; or

	if the Copyright in the Contribution is held by a Legal Entity and the Contribution is being Submitted to Us on behalf of such Legal Entity, "You" means such Legal Entity.

	"Contribution" means any original work of authorship, including any original modifications or additions to an existing work of authorship, Submitted for inclusion into Material by You to Us, in which you own the Copyright.

	"Copyright" means all rights protecting works of authorship, including copyright, moral and neighboring rights, as appropriate, for the full term of their existence.

	"Material" means the software and/or documentation of ____________________ that we make available to third parties.

	"Submit" means any act by which a Contribution is transferred to Us by You by means of tangible or intangible media, including but not limited to electronic mailing lists, source code control systems, and issue tracking systems, but excluding any transfer that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution."

	"Documentation" means any non-software portion of a Contribution.
	License grant
	Copyright license to Us

	Subject to the terms and conditions of this Agreement, You hereby grant to Us a worldwide, royalty-free, exclusive, perpetual and irrevocable (except as stated in Section "Term") license, with the right to transfer an unlimited number of non-exclusive licenses or to grant sublicenses to third parties, under the Copyright covering the Contribution to use the Contribution by all means, including, but not limited to:
		publish the Contribution,
		modify the Contribution,
		prepare derivative works based upon or containing the Contribution and/or to combine the Contribution with other Materials,
		reproduce the Contribution in original or modified form,
		distribute, to make the Contribution available to the public, display and publicly perform the Contribution in original or modified form.
	Moral rights

	Moral Rights remain unaffected to the extent they are recognized and not waivable by applicable law. Notwithstanding, You may add your name to the attribution mechanism customary used in the Materials you Contribute to, such as the header of the source code files of Your Contribution, and We will respect this attribution when using Your Contribution.
	Copyright license back to You

	Upon such grant of rights to Us, We immediately grant to You a worldwide, royalty-free, non-exclusive, perpetual and irrevocable license, with the right to transfer an unlimited number of non-exclusive licenses or to grant sublicenses to third parties, under the Copyright covering the Contribution to use the Contribution by all means, including, but not limited to:
		publish the Contribution,
		modify the Contribution,
		prepare derivative works based upon or containing the Contribution and/or to combine the Contribution with other Materials,
		reproduce the Contribution in original or modified form,
		distribute, to make the Contribution available to the public, display and publicly perform the Contribution in original or modified form.

	This license back is limited to the Contribution and does not provide any rights to the Material.
	Patents
	Patent license

	Subject to the terms and conditions of this Agreement You hereby grant to Us and to recipients of Materials distributed by Us a worldwide, royalty-free, non-exclusive, perpetual and irrevocable (except as stated in Subsection "Revocation of patent license") patent license, with the right to transfer an unlimited number of non-exclusive licenses or to grant sublicenses to third parties, to make, have made, use, sell, offer for sale, import and otherwise transfer the Contribution and the Contribution in combination with any Material (and portions of such combination). This license applies to all patents owned or controlled by You, whether already acquired or hereafter acquired, that would be infringed by making, having made, using, selling, offering for sale, importing or otherwise transferring of Your Contribution(s) alone or by combination of Your Contribution(s) with any Material.
	Revocation of patent license

	You reserve the right to revoke the patent license stated in Subsection "Patent license" if We make any infringement claim that is targeted at your Contribution and not asserted for a Defensive Purpose. An assertion of claims of the Patents shall be considered for a "Defensive Purpose" if the claims are asserted against an entity that has filed, maintained, threatened, or voluntarily participated in a patent infringement lawsuit against Us or any of Our licensees.
	License obligations by Us

	We may, but are under no obligation to, include the Contribution You Submitted to Us into the Material.

	We agree to (sub)license the Contribution or any Materials containing, based on or derived from your Contribution under the terms of any licenses that qualify as [Free Software](https://www.gnu.org/philosophy/free-sw.html) as defined by the Free Software Foundation and at the same time qualify as [Open Source](https://opensource.org/osd) as defined by the Open Source Initiative. For clarification, should we make available any Material under a non-free or non-open license, we must make a version of such Material available under a free and open license too.

	More specifically and in strict accordance with the above paragraph, we agree to (sub)license the Contribution or any Materials containing, based on or derived from the Contribution only under the terms of the following license(s) GPL-3.0, MIT (including any right to adopt any future version of a license if permitted), whereby any non-free or non-open licenses need to be listed as well.

	We agree to license patents owned or controlled by You only to the extent necessary to (sub)license Your Contribution(s) and the combination of Your Contribution(s) with the Material under the terms of any licenses the Free Software Foundation classifies as Free Software licenses and which are approved by the Open Source Initiative as Open Source licenses..
	Disclaimer
	**We acknowledge that you provide the Contribution "as is".** **More particularly, You disclaim all express or implied warranties including, without limitation, any implied warranty of satisfactory quality, fitness for a particular purpose and non-infringement. To the extent that any such warranties cannot be disclaimed, such warranty is limited in duration and extent to the minimum period and extent permitted by law.**
	Consequential damage waiver

	**To the maximum extent permitted by applicable law, in no event will You or We be liable for any loss of profits, loss of anticipated savings, loss of data, indirect, special, incidental, consequential and exemplary damages arising out of this Agreement regardless of the legal or equitable theory (contract, tort or otherwise) upon which the claim is based.**
	Approximation of disclaimer and damage waiver

	**If the disclaimer and damage waiver mentioned in Subsection "Disclaimer of warranty" and Section "Consequential damage waiver" cannot be given legal effect under applicable local law, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil or contractual liability in connection with the Contribution.**
	Term

	This Agreement shall come into effect upon Your acceptance of the terms and conditions.

	This Agreement shall apply for the term of the copyright and patents licensed here. However, You shall have the right to terminate the Agreement if We do not fulfill the obligations as set forth in Section "License obligations by Us". Such termination must be made in writing.

	In the event of a termination of this Agreement Sections "Disclaimer", "Term" and "Miscellaneous" shall survive such termination and shall remain in full force thereafter. For the avoidance of doubt, Free and Open Source Software (sub)licenses that have already been granted for Contributions at the date of the termination shall remain in full force after the termination of this Agreement.
	Miscellaneous

	This Agreement and all disputes, claims, actions, suits or other proceedings arising out of this agreement or relating in any way to it shall be governed by the laws of Ecuador excluding its private international law provisions.

	This Agreement sets out the entire agreement between You and Us for Your Contributions to Us and overrides all other agreements or understandings.

	In case of Your death, this agreement shall continue with Your heirs. In case of more than one heir, all heirs must exercise their rights through a commonly authorized person.

	If any provision of this Agreement is found void and unenforceable, such provision will be replaced to the extent possible with a provision that comes closest to the meaning of the original provision and that is enforceable. The terms and conditions set forth in this Agreement shall apply notwithstanding any failure of essential purpose of this Agreement or any limited remedy to the maximum extent possible under law.

	You agree to notify Us of any facts or circumstances of which you become aware that would make Your representations under this Agreement inaccurate in any respect.
	You
	Date:	
	Name:	
	Title:	
	Address:	
	Us
	Date:	
	Name:	
	Title:	
	Address:	
    1. the generator didn't let me choose "CC BY-SA" as one of the licnese, so I chose "MIT" so we could find/replace it later
  1. oh, if I change the first page's option to "let me do what I want" then the second page has an option to include CC BY-SA. that changed it to:

	Contributor Agreement
	Individual Contributor Exclusive License Agreement
	(including the Traditional Patent License OPTION)

	Thank you for your interest in contributing to Eco-Libre's ____________________ ("We" or "Us").

	The purpose of this contributor agreement ("Agreement") is to clarify and document the rights granted by contributors to Us. To make this document effective, please follow the instructions at ____________________.
	How to use this Contributor Agreement

	If You are an employee and have created the Contribution as part of your employment, You need to have Your employer approve this Agreement. If You do not own the Copyright in Your Contribution, any other author of the Contribution should also sign this. In any event, please contact Us at https://www.eco-libre.org/contact.
	Definitions

	"You" means the individual Copyright owner who Submits a Contribution to Us; or

	if the Copyright in the Contribution is held by a Legal Entity and the Contribution is being Submitted to Us on behalf of such Legal Entity, "You" means such Legal Entity.

	"Contribution" means any original work of authorship, including any original modifications or additions to an existing work of authorship, Submitted for inclusion into Material by You to Us, in which you own the Copyright.

	"Copyright" means all rights protecting works of authorship, including copyright, moral and neighboring rights, as appropriate, for the full term of their existence.

	"Material" means the software and/or documentation of ____________________ that we make available to third parties.

	"Submit" means any act by which a Contribution is transferred to Us by You by means of tangible or intangible media, including but not limited to electronic mailing lists, source code control systems, and issue tracking systems, but excluding any transfer that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution."

	"Documentation" means any non-software portion of a Contribution.
	License grant
	Copyright license to Us

	Subject to the terms and conditions of this Agreement, You hereby grant to Us a worldwide, royalty-free, exclusive, perpetual and irrevocable (except as stated in Section "Term") license, with the right to transfer an unlimited number of non-exclusive licenses or to grant sublicenses to third parties, under the Copyright covering the Contribution to use the Contribution by all means, including, but not limited to:
		publish the Contribution,
		modify the Contribution,
		prepare derivative works based upon or containing the Contribution and/or to combine the Contribution with other Materials,
		reproduce the Contribution in original or modified form,
		distribute, to make the Contribution available to the public, display and publicly perform the Contribution in original or modified form.
	Moral rights

	Moral Rights remain unaffected to the extent they are recognized and not waivable by applicable law. Notwithstanding, You may add your name to the attribution mechanism customary used in the Materials you Contribute to, such as the header of the source code files of Your Contribution, and We will respect this attribution when using Your Contribution.
	Copyright license back to You

	Upon such grant of rights to Us, We immediately grant to You a worldwide, royalty-free, non-exclusive, perpetual and irrevocable license, with the right to transfer an unlimited number of non-exclusive licenses or to grant sublicenses to third parties, under the Copyright covering the Contribution to use the Contribution by all means, including, but not limited to:
		publish the Contribution,
		modify the Contribution,
		prepare derivative works based upon or containing the Contribution and/or to combine the Contribution with other Materials,
		reproduce the Contribution in original or modified form,
		distribute, to make the Contribution available to the public, display and publicly perform the Contribution in original or modified form.

	This license back is limited to the Contribution and does not provide any rights to the Material.
	Patents
	Patent license

	Subject to the terms and conditions of this Agreement You hereby grant to Us and to recipients of Materials distributed by Us a worldwide, royalty-free, non-exclusive, perpetual and irrevocable (except as stated in Subsection "Revocation of patent license") patent license, with the right to transfer an unlimited number of non-exclusive licenses or to grant sublicenses to third parties, to make, have made, use, sell, offer for sale, import and otherwise transfer the Contribution and the Contribution in combination with any Material (and portions of such combination). This license applies to all patents owned or controlled by You, whether already acquired or hereafter acquired, that would be infringed by making, having made, using, selling, offering for sale, importing or otherwise transferring of Your Contribution(s) alone or by combination of Your Contribution(s) with any Material.
	Revocation of patent license

	You reserve the right to revoke the patent license stated in Subsection "Patent license" if We make any infringement claim that is targeted at your Contribution and not asserted for a Defensive Purpose. An assertion of claims of the Patents shall be considered for a "Defensive Purpose" if the claims are asserted against an entity that has filed, maintained, threatened, or voluntarily participated in a patent infringement lawsuit against Us or any of Our licensees.
	License obligations by Us

	We may, but are under no obligation to, include the Contribution You Submitted to Us into the Material.

	We agree to license the Contribution only under the terms of the following license(s) GPL-3.0 (including any right to adopt any future version of a license if permitted), whereby any non-free or non-open licenses need to be listed as well.

	In addition, We may use the following licenses for Documentation in the Contribution: CC-BY-SA-4.0 (including any right to adopt any future version of a license).

	We agree to license patents owned or controlled by You only to the extent necessary to (sub)license Your Contribution(s) and the combination of Your Contribution(s) with the Material under the terms of the following GPL-3.0 license(s).
	Disclaimer
	**We acknowledge that you provide the Contribution "as is".** **More particularly, You disclaim all express or implied warranties including, without limitation, any implied warranty of satisfactory quality, fitness for a particular purpose and non-infringement. To the extent that any such warranties cannot be disclaimed, such warranty is limited in duration and extent to the minimum period and extent permitted by law.**
	Consequential damage waiver

	**To the maximum extent permitted by applicable law, in no event will You or We be liable for any loss of profits, loss of anticipated savings, loss of data, indirect, special, incidental, consequential and exemplary damages arising out of this Agreement regardless of the legal or equitable theory (contract, tort or otherwise) upon which the claim is based.**
	Approximation of disclaimer and damage waiver

	**If the disclaimer and damage waiver mentioned in Subsection "Disclaimer of warranty" and Section "Consequential damage waiver" cannot be given legal effect under applicable local law, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil or contractual liability in connection with the Contribution.**
	Term

	This Agreement shall come into effect upon Your acceptance of the terms and conditions.

	This Agreement shall apply for the term of the copyright and patents licensed here. However, You shall have the right to terminate the Agreement if We do not fulfill the obligations as set forth in Section "License obligations by Us". Such termination must be made in writing.

	In the event of a termination of this Agreement Sections "Disclaimer", "Term" and "Miscellaneous" shall survive such termination and shall remain in full force thereafter. For the avoidance of doubt, Free and Open Source Software (sub)licenses that have already been granted for Contributions at the date of the termination shall remain in full force after the termination of this Agreement.
	Miscellaneous

	This Agreement and all disputes, claims, actions, suits or other proceedings arising out of this agreement or relating in any way to it shall be governed by the laws of Ecuador excluding its private international law provisions.

	This Agreement sets out the entire agreement between You and Us for Your Contributions to Us and overrides all other agreements or understandings.

	In case of Your death, this agreement shall continue with Your heirs. In case of more than one heir, all heirs must exercise their rights through a commonly authorized person.

	If any provision of this Agreement is found void and unenforceable, such provision will be replaced to the extent possible with a provision that comes closest to the meaning of the original provision and that is enforceable. The terms and conditions set forth in this Agreement shall apply notwithstanding any failure of essential purpose of this Agreement or any limited remedy to the maximum extent possible under law.

	You agree to notify Us of any facts or circumstances of which you become aware that would make Your representations under this Agreement inaccurate in any respect.
	You
	Date:	
	Name:	
	Title:	
	Address:	
	Us
	Date:	
	Name:	
	Title:	
	Address:	

Contributor Agreement Entity Contributor Exclusive License Agreement (including the Traditional Patent License OPTION)

Thank you for your interest in contributing to Eco-Libre's ____________________ ("We" or "Us").

The purpose of this contributor agreement ("Agreement") is to clarify and document the rights granted by contributors to Us. To make this document effective, please follow the instructions at ____________________. How to use this Contributor Agreement

If You are an employee and have created the Contribution as part of your employment, You need to have Your employer approve this Agreement. If You do not own the Copyright in Your Contribution, any other author of the Contribution should also sign this. In any event, please contact Us at https://www.eco-libre.org/contact. Definitions

"You" means the individual Copyright owner who Submits a Contribution to Us; or

if the Copyright in the Contribution is held by a Legal Entity and the Contribution is being Submitted to Us on behalf of such Legal Entity, "You" means such Legal Entity.

"Contribution" means any original work of authorship, including any original modifications or additions to an existing work of authorship, Submitted for inclusion into Material by You to Us, in which you own the Copyright.

"Copyright" means all rights protecting works of authorship, including copyright, moral and neighboring rights, as appropriate, for the full term of their existence.

"Material" means the software and/or documentation of ____________________ that we make available to third parties.

"Submit" means any act by which a Contribution is transferred to Us by You by means of tangible or intangible media, including but not limited to electronic mailing lists, source code control systems, and issue tracking systems, but excluding any transfer that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution."

"Documentation" means any non-software portion of a Contribution. License grant Copyright license to Us

Subject to the terms and conditions of this Agreement, You hereby grant to Us a worldwide, royalty-free, exclusive, perpetual and irrevocable (except as stated in Section "Term") license, with the right to transfer an unlimited number of non-exclusive licenses or to grant sublicenses to third parties, under the Copyright covering the Contribution to use the Contribution by all means, including, but not limited to: publish the Contribution, modify the Contribution, prepare derivative works based upon or containing the Contribution and/or to combine the Contribution with other Materials, reproduce the Contribution in original or modified form, distribute, to make the Contribution available to the public, display and publicly perform the Contribution in original or modified form. Moral rights

Moral Rights remain unaffected to the extent they are recognized and not waivable by applicable law. Notwithstanding, You may add your name to the attribution mechanism customary used in the Materials you Contribute to, such as the header of the source code files of Your Contribution, and We will respect this attribution when using Your Contribution. Copyright license back to You

Upon such grant of rights to Us, We immediately grant to You a worldwide, royalty-free, non-exclusive, perpetual and irrevocable license, with the right to transfer an unlimited number of non-exclusive licenses or to grant sublicenses to third parties, under the Copyright covering the Contribution to use the Contribution by all means, including, but not limited to: publish the Contribution, modify the Contribution, prepare derivative works based upon or containing the Contribution and/or to combine the Contribution with other Materials, reproduce the Contribution in original or modified form, distribute, to make the Contribution available to the public, display and publicly perform the Contribution in original or modified form.

This license back is limited to the Contribution and does not provide any rights to the Material. Patents Patent license

Subject to the terms and conditions of this Agreement You hereby grant to Us and to recipients of Materials distributed by Us a worldwide, royalty-free, non-exclusive, perpetual and irrevocable (except as stated in Subsection "Revocation of patent license") patent license, with the right to transfer an unlimited number of non-exclusive licenses or to grant sublicenses to third parties, to make, have made, use, sell, offer for sale, import and otherwise transfer the Contribution and the Contribution in combination with any Material (and portions of such combination). This license applies to all patents owned or controlled by You, whether already acquired or hereafter acquired, that would be infringed by making, having made, using, selling, offering for sale, importing or otherwise transferring of Your Contribution(s) alone or by combination of Your Contribution(s) with any Material. Revocation of patent license

You reserve the right to revoke the patent license stated in Subsection "Patent license" if We make any infringement claim that is targeted at your Contribution and not asserted for a Defensive Purpose. An assertion of claims of the Patents shall be considered for a "Defensive Purpose" if the claims are asserted against an entity that has filed, maintained, threatened, or voluntarily participated in a patent infringement lawsuit against Us or any of Our licensees. License obligations by Us

We may, but are under no obligation to, include the Contribution You Submitted to Us into the Material.

We agree to license the Contribution only under the terms of the following license(s) GPL-3.0 (including any right to adopt any future version of a license if permitted), whereby any non-free or non-open licenses need to be listed as well.

In addition, We may use the following licenses for Documentation in the Contribution: CC-BY-SA-4.0 (including any right to adopt any future version of a license).

We agree to license patents owned or controlled by You only to the extent necessary to (sub)license Your Contribution(s) and the combination of Your Contribution(s) with the Material under the terms of the following GPL-3.0 license(s). Disclaimer **We acknowledge that you provide the Contribution "as is".** **More particularly, You disclaim all express or implied warranties including, without limitation, any implied warranty of satisfactory quality, fitness for a particular purpose and non-infringement. To the extent that any such warranties cannot be disclaimed, such warranty is limited in duration and extent to the minimum period and extent permitted by law.** Consequential damage waiver

**To the maximum extent permitted by applicable law, in no event will You or We be liable for any loss of profits, loss of anticipated savings, loss of data, indirect, special, incidental, consequential and exemplary damages arising out of this Agreement regardless of the legal or equitable theory (contract, tort or otherwise) upon which the claim is based.** Approximation of disclaimer and damage waiver

**If the disclaimer and damage waiver mentioned in Subsection "Disclaimer of warranty" and Section "Consequential damage waiver" cannot be given legal effect under applicable local law, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil or contractual liability in connection with the Contribution.** Term

This Agreement shall come into effect upon Your acceptance of the terms and conditions.

This Agreement shall apply for the term of the copyright and patents licensed here. However, You shall have the right to terminate the Agreement if We do not fulfill the obligations as set forth in Section "License obligations by Us". Such termination must be made in writing.

In the event of a termination of this Agreement Sections "Disclaimer", "Term" and "Miscellaneous" shall survive such termination and shall remain in full force thereafter. For the avoidance of doubt, Free and Open Source Software (sub)licenses that have already been granted for Contributions at the date of the termination shall remain in full force after the termination of this Agreement. Miscellaneous

This Agreement and all disputes, claims, actions, suits or other proceedings arising out of this agreement or relating in any way to it shall be governed by the laws of Ecuador excluding its private international law provisions.

This Agreement sets out the entire agreement between You and Us for Your Contributions to Us and overrides all other agreements or understandings.

In case of Your death, this agreement shall continue with Your heirs. In case of more than one heir, all heirs must exercise their rights through a commonly authorized person.

If any provision of this Agreement is found void and unenforceable, such provision will be replaced to the extent possible with a provision that comes closest to the meaning of the original provision and that is enforceable. The terms and conditions set forth in this Agreement shall apply notwithstanding any failure of essential purpose of this Agreement or any limited remedy to the maximum extent possible under law.

You agree to notify Us of any facts or circumstances of which you become aware that would make Your representations under this Agreement inaccurate in any respect. You Date: Name: Title: Address: Us Date: Name: Title: Address:

  1. well, I'm still not sure what to use. In the meantime, I went ahead and updated the wiki ToS to include an unaltered version of the Linux Foundation's DCO https://wiki.eco-libre.org/wiki/Eco-Libre:Terms_of_Service
    1. I also added a section on the license, because the DCO (which I can't edit) referes to "the open source license indicated in the file"
    2. alright, that's a placeholder. I'll wait to see if we get a response from the home automation folks and/or the OSHWA.
  2. oh, TIL that OSE *does* use CERN OHL-S-2.0 for hardware files https://wiki.opensourceecology.org/wiki/OSE_License_for_Distributive_Economics
    1. but their wiki is a mess. it says dual-licensed under the GNU Free Documentation License and CC BY-SA on this page https://wiki.opensourceecology.org/wiki/Media-wiki:Copyright
    2. while this page says just CC BY-SA for wiki and design files, CERN OHL-S-2.0 for hardware files, and GPL v3 for code https://wiki.opensourceecology.org/wiki/OSE_License_for_Distributive_Economics
    3. there's a section on CAs, which just says that we need a paper with NAME OF PERSON and SPECIFIED DATE https://wiki.opensourceecology.org/wiki/OSE_License_for_Distributive_Economics
    4. looks like they started working on a "distributed enterprise license" – but I can't find anything but a sketch outline
      1. https://wiki.opensourceecology.org/wiki/OSE_License_for_Distributive_Enterprise
      2. https://wiki.opensourceecology.org/wiki/OSE_License_for_Distributive_Economics_-_Requirements
    5. ah ha! apparently Marcin's legal advisor volunteer person suggested https://contributoragreements.org per https://wiki.opensourceecology.org/wiki/Contributor_Agreement
  3. alright, I think I'll do one of the contributoragreements.org developed above. I'll draft it into a nice-looking odt -> pdf and upload it to opensign. then we'll be ready to accept volunteer contributions to our repos & wiki, like, very legally sound

2026-04-21

  1. I published and did the social media marketing for our announcement that we're accepting tax-deductable donations via raft today https://www.eco-libre.org/raft-2026/
  2. I, again, was unable to post to our X account.
    1. even though I enter the correct password, they demand an OTP sent to the email address used when the account was registered
    2. I guess they fired all the ex-twitter engineers with a brain, because they can't see that their emails are bouncing?
    3. I, maybe the 3rd or 4th time, told them that tutanota deleted our email address. And asked them to update the email address to one @eco-libre.org, which is pretty easy for a junior engineer to authenticate, since it's literally the domain assoaciated with our account. Auth done. QED. Here's their response:
Reply above this line.



Hello,

We=E2=80=99re writing to let you know that we=E2=80=99re unable to verify y=
ou as the account owner. We know this is disappointing to hear, but we can=
=E2=80=99t assist you further with accessing your account.

If you know which email address or phone number is associated with the acco=
unt, and you no longer have access to that email or connected phone number,=
 please contact your service provider for assistance.

For privacy reasons, we can=E2=80=99t provide any information about this ac=
count=E2=80=99s registered email address or phone number

We understand it=E2=80=99s frustrating to get locked out of an account, but=
 we have these policies to protect accounts and private data. We appreciate=
 your understanding.

You=E2=80=99re more than welcome to create a new account to get back onto X=
.

Please do not respond to this email as replies to this account are not moni=
tored.

Thanks,
X Support
    1. So, fuck X. This is why we shouldn't use corporate, non-federated social media.
    2. oh, and I was also unable to log into reddit. Similar issue. I get this, just for a GET on /login – before they even asked me for creds!
You've been blocked by network security.
If you think you've been blocked by mistake, file a ticket below and we'll look into it.
  1. again, this is why we use better non-corportate social media. Now on lemmy!
    1. https://chaos.social/@ecolibre/116443354810130299
    2. https://slrpnk.net/post/36851013
  2. woah, mastodon has a new link under the post that says "More from Eco-Libre Team" which links here https://mastodon.social/@eco-libre@www.eco-libre.org
    1. that's, uhh, our wordpress site's ActivityPub plugins' actor! The one that I couldn't finish setting-up due to the 5xx error (see previous log entries)
    2. so i guess it's working under defaults
    3. as I found before, it doesn't show previous content until after you subscribe, so the page on mastodon doesn't even show today's post :(
    4. I'm thinking the best way to use this is to not really advertise wordpress as an endpoint. But, rather, to just setup our other federated-service-x-native account to subscribe and auto-boost our wordpress posts. That way we don't even have to login to mastodon or lemmy or whatever else. We can just automate the distribution from wordpress via ActivityPub to all our other federated social media accounts.
    5. anyway, I subscribed to @eco-libre@www.eco-libre.org from my personal mastodon account and our eco-libre mastodon account. let's see what that looks like over time.
  3. I logged-into our raft (private) discourse to ask if they have a mastodon account https://raft.talk/t/following-raft-on-the-fediverse/45/1
    1. I also followd-up with a thread in which I asked about a vector logo. Nathan (founder) said they don't have one, so I spent about an hour generating a few different decent-looking vectors from the png using inkscape's Trace Bitmap tool, and shared it – so others can have it in the future https://raft.talk/t/raft-logo-vector-svg/31/3
    2. I also realized that I had started (but not finished) asking the community for advice on how to get volunteers from "volutneer social year" programs like the Freiwilliges Soziales Jahr in Germany or the European Solidarity Corps or the US Peace Corps. So I finished that https://raft.talk/t/getting-state-sponsored-volunteers-voluntary-social-year/46
Does anyone have experience here in getting volunteers via State-sponsored programs, like the US Peace Core, Germany's Voluntary Social Year (Freiwilliges Soziales Jahr), or the EU Solidarity Corps?

 * https://en.wikipedia.org/wiki/Voluntary_social_year
 * https://en.wikipedia.org/wiki/European_Solidarity_Corps

I've met a *lot* of Germans (and one person from Liechtenstein!) who took their [gap year](https://en.wikipedia.org/wiki/Gap_year) off to go abroad and help some cool non-profit.

Our project's mission is to develop and document [open-source appropriate technology](https://en.wikipedia.org/wiki/Open-source_appropriate_technology) to enfranchise sustainable communities' human rights. And we need volunteers!

I'm wondering if anyone else here has experience satisfying the requirements of such orgs, so that we can get listed in their "directory of cool nonprofits abroad" that their want-to-be-volunteers will see (and can apply-to).

I imagine that one key requirement is met by us being able to provide Raft's IRS Determination Letter. What else do we need to do? Where do we apply?

Can anyone with experience provide tips (or a link to a guide?) on how to get volunteers abroad doing a "voluntary social year"?
  1. ...
  2. back to Terms of Use, which is where we left-off on the wiki's config of ConfirmAccount extension
    1. honestly, we probably should write a ToS for all volunteers, which extends beyond just the wiki
    2. I have already drafted (not yet published) some agreements for volunteers, but we haven't had any in-person volunteers that required us to use it
    3. so, I guess, we need distinct agreements for people who volunteer remotely vs volunteer in-person
    4. in any case, even in-person volunteers are going to start remotely >99% of the time, so we should probably figure out some system for them to "sign a document" such that a copy gets sent to them and stored with us
    5. the first thing that comes to the top of my head is copyleft. We need folks to agree that all of their contributions to Eco-Libre will be copyleft under dual license of CC BY-SA and GNU GPL.
    6. can I find some libre service that's like docusign for this? https://alternativeto.net/software/docusign/
      1. DocuSeal https://www.docuseal.com
        1. + free cloud account (limited to 10 field types and 10 requests emails per month)
        2. + self-hostable https://github.com/docusealco/docuseal
        3. - docker https://www.docuseal.com/install
        4. - even self -hosted solution has usage limits without buying a license https://www.docuseal.com/pricing
      2. OpenSign https://www.opensignlabs.com
        1. + free cloud account (limited to 14 field types)
        2. + self hostable https://www.docuseal.com
        3. - docker https://docs.opensignlabs.com/docs/category/docker
        4. + self-hosted doesn't appear to have any restrictions
      3. Documenso https://docs.opensignlabs.com/docs/category/docker
        1. + free cloud account (limited to 5 documents per month) https://documenso.com/pricing
        2. + self-hostable https://github.com/documenso/documenso
        3. - docker https://docs.documenso.com/docs/self-hosting/deployment
        4. + baremetal (non-docker) installation is documented https://github.com/documenso/documenso
        5. - it's nodejs w/ npm
      4. LibreSign https://libresign.coop/
        1. - no free cloud plan https://libresign.coop/pricing/
        2. + self-hostable https://github.com/LibreSign/libresign
        3. - no docs for self-hosting? installtion guide?
        4. + github says it's a nextcloud app
    7. well, of thse, I think OpenSign or DDocumenso are the best options. my biggest concern is: can we export everything from the site, if they ever eliminate their free plan (or we outgrow them)?
    8. let's create accounts with both and get a feel for it
      1. well, shit, the signup page for documenso included their "sign here" digital field. It was so shitty, it nearly crashed my browser. so let's try open sign instead.
    9. ugh, OpenSign requires a phone number on sign-up
      1. ugh, password policy is dumb. it rejected a >50 char password because it requires a special symbol. makes me question their security. fortunately, these documents would need to be public, anyway.
      2. it accepted a bullshit phone number. good
      3. I immediately went to settings
        1. I changed the document download filename format to include the date. It always bothers me when documents aren't dated in the filename..
        2. I changed the date format to YYYY-MM-DD – iso format, sortable, and no ambiguity
        3. In the setting's "widgets" tab, I also set the date to YYYY-MM-DD
        4. In the settings' "security" tab, I setup TOTP 2FA
      4. I went to my "profile"
        1. It said my email wasn't verified. I never got an email *to* verify. I clicked the "Verify" button
          1. gross. it sent an email with an OTP. the email had text/plain, but the only contents was "otp email". I had to dig through some html to find the code.
  3. I clicked around in OpenSign. I expected there would be some place where I could type a document, but it only allows me to upload a pdf, jpg, png, jpeg, or docx. whey not OpenOffice (LibreOffice)? Hmm.
  4. not sure how this translates into being able to add input fields.
  5. using libreoffice, I created a test document with the contents
I agree not to act like an evil corporation.
  1. I exported it as a pdf, and uploaded it as a new "template" to opensign
    1. there's a lot of settings you can make
      1. you can change it so that everyone can sign at once, or (the default) has the intended party sign, then I sign. But I'm not sure if I will *want* Eco-Libre to sign these documents at all?
      2. you can set the number of days that the person has to sign. it defaults to 15.
      3. you can add a bcc
      4. you can make the "certification pdf" merged into the signed document. well, apparently only if you pay for an upgrade. whatever.
      5. ah man, there's a cool feature that requries an OTP from the email address, but it requires upgrade
      6. you can specify a "redirect url" which is blank by default. I guess that's where they get sent after signing. That's cool. I could have it redirect to a "thank you; here's the next steps" doc. I set it to 'https://eco-libre.github.io/volunteer-test/'
        1. I'm beginning to wonder if I shouldn't have made a repo named 'volunteer-test' but instead made one named 'volunteer-onboarding' in-which the volunteer test was only one section. hmm.
      7. the only other thing I could change was the pen ink colors. here in Ecuador, everything should be blue. so I disabled black and red.
    2. ok, after I click "next" I can decorate the page with a bunch of widgets. note that I cannot edit the text
      1. you can add a "role" for someone to sign. I just want one = the volunteer. So I added one named "Volunteer"
      2. I clicked the "Signature" widget, and a blue box popped-up on the bottom of the page
        1. I hovered over it with my mouse, and a "gear" "person" "copy" and "trash" icons appeared.
        2. I clicked the gear, and it let me choose the type of signatures accepted (draw, typed, upload, or default), and a "hint"
        3. I clicked the "person" and it let me choose someone from contacts. I'm creating a template, so that doesn't make sense (unless we had, like, *me* signing every document – which I don't think we'll do). So I left that empty
      3. there's a "text input widget", which I guess is how I would let someone enter their name. I can make it optional, required, or read-only (relavant for the other "default value" option). I can change the font size and font color. So, I guess, the idea is that I would have left a blank space in the pdf, and later decorated it with this widget. I'll do that for the next test.
      4. there's a "image" widget – as in, the user can upload an image (I guess useful for profile photos)
      5. there's also widgets for stamp, initials, number, name, job title, company, email, date, cells, checkbox, dropdown, and radio button
      6. I dropped the "name" widget randomly near the top. So now I have two: name & signature.
      7. I saved the template
      8. I went back and edited it. I realized there's an option "prefiil by owner" vs "volunteer". apparently I can add the name and stuff before I send it out. I left it at "volunteer"
    3. there was an option to make the template public, but I don't have a public profile. I went to edit my profile, but the box for entering my username for the public profile is grey-out. Unlike other places, it doesn't say "upgrade now" so idk wtf is going on
      1. after making it public, it gave me some js to embed the document. oh, so this is so that I can embed the docs on my own site. well, that's kinda cool. but I really don't want to embed a third party javascript.
    4. anyway, back to "manage templates"
      1. I tried to edit the template again, but it gave me an error
You cannot edit a public template directly. To make changes, the template will be set to private, and you'll need to make it public again afterward. Do you want to continue?
      1. so I unchecked "public" and edited it
      2. I added a "date" widget. I set it to "signing date" and "read only" and "required" and placed it just above the signature
    1. I went back to "manage templates" and clicked the "+ use" button.
      1. it gave me a drop down menu of our contacts, but it's empty. so I pressed the red "+" button to add a new contact
      2. I added a contact named "Michael Altfield" and my email address. then I selected this contact and clicked "next"
      3. It asked " Are you sure you want to send out this document for signatures?" and I clicked "Send"
      4. I immediately got an email. Again, the shitty email plaintext contetns was just "mail" and I had to read-through the html to find a encoding-broken link :/
        1. I created a bug report for them to fix the `text/plain` content type of emails here https://github.com/OpenSignLabs/OpenSign/issues/2156
      5. using some mutt scripting fuckery, I'm able to extract the URLs. But I can't figure out which one is to go to the document. Two of the four are both to "click.opensignlabs.com. the first one appears to go to a login page, and the second one doesn't. I tried the second one
        1. wtf, that link brought me to a single dark page with a single dead pixel in the center of the screen.
      6. ok, looks like the first link (with the login that I was trying to avoid) is a button that says "sign here"
      7. ohhh, and the other one is an image. I guess it's a tracking pixel. that explains it.
      8. back in my admin dashboard, under Documents -> In-Progress, I can see Michael Altfield has "Yet to sign"
      9. If I click on "sent" then there's a section "viewed on" and "signed on" that are both "-" – so I guess that tracking pixel didn't really work, huh..
      10. fine, I went to the first link
        1. oh, awesome, it didn't make me login! It redirected me to the document. perfect! It popped-up a modal that said
I confirm that I have read and understood the Electronic Record and Signature Disclosure and consent to use electronic records and signatures.
Note: Agreeing to this does not mean you are signing the document immediately. This only allows you to review the document electronically. You will have the opportunity to read it in full and decide whether to sign it afterward.
      1. I clicked "I confirm & agree to continue"
      2. it did the whole modal popup "guide" thing, which was an option I could have disabled. basically it said to type my name (which was, cool, auto-completed to "Michael Altfield"), listed the signers (just me), and then highlighted the widgets at the bottom (date and sig), then told me how to zoom-in, then highlighted the "you're done" buttons = "decline" "download" or "finish"
      3. it let me change my name, but I should probably make that read-only now that I know it auto-completes with the name from the contacts
      4. it wouldn't let me change the date, which it autocompletd to today
      5. it did let me click on the signature widget, which opened a modal with a box where I could draw my nanme. I did that. It was fast, wayy better than Documenso – no issues here with the browser crashing
      6. alternatively, I could click "type" and it displayed my name in some cursive fonts, which I could choose-from. and there was an option to upload image.
      7. I chose draw and did my signature and clicked next. very fast.
      8. it asked if I'm sure I want to finish the doc. I clicked "Review"
      9. then I clicked the "finish" button at the top
      10. it said this
Document signed
Congratulations! 🎉 This document has been successfully signed by all participants!
      1. and there was a countdown to redirect. in 3 seconds, the browser redirected to here. perfect! https://eco-libre.github.io/volunteer-test/en/main/
      2. back in the opensign admin dashboard, the row is absent from "Documents -> in progress". I found it in "documents -> completed"
      3. I clicked the "eye" next to the document, and it showed me the document, including the signature that I left in the other browser. I can also click "print" or "certifiacte" or "download"
        1. "print" does what you'd expect. I can print or use the browser's "save to pdf" of the document, which includes the signature
        2. "certifiacte" opens some legal-looking pdf (something similar to docusign) with a some metadata, including a sah256 hash, ip address of both document issuer (me) and the signer (also me, but different IP because Tor). And it includes an image of the drawn signature.
        3. "download" then lets me choose if i want the download pdf or downlaod pdf + certifiate. I chose both.
          1. lol that failed. the browser didn't let me download both
Something went wrong, refreshing this page may solve this issue
        1. I tried just "downlaod pdf"
          1. that gave me the document, plus the signature and other "widgets" filled-out, plus the following in the top-left
OpenSign™ DocumentId: pS5lEdCyIp
          1. I guess that's something like their observatory. they said I can turn it off only if I have a paid plan. But it's probably necessary for them as a thrid party to confirm the signature.
        1. anyway, I tested the hash on the file that I downloaded
[user@disp6411 Downloads]$ sha256sum Test\ Agreement\ -\ REDACTED@eco-libre.org\ -\ 21-Apr-2026\ 04_01\ PM.pdf 
569152424a49024297f4bb550291036896de3189e70efb1fee6a9e39333bbe77  Test Agreement - REDACTED@eco-libre.org - 21-Apr-2026 04_01 PM.pdf
[user@disp6411 Downloads]$ 
        1. I wanted to confirm that matches the certificate, but when I clicked "certificate" again, I got a permissions issue!
<Error>
<Code>AccessDenied</Code>
<Message>Request has expired.</Message>
<Resource>
legadratw3d/460246e423800b30c50c967ef6157248_certificate.pdf
</Resource>
<RequestId>not available</RequestId>
</Error>
      1. fortunately I still had it open in another tab, and I copied this from it

Generated On 2026-04-21, 15:56:29 GMT -05:00
Certificate of Completion
Summary
Document Id : pS5lEdCyIp
Document Name : Test Agreement
Document hash (sha256) : 569152424a49024297f4bb550291036896de3189e70efb1fee6a9e39333bbe77
Organization : Eco-Libre
Created on : 2026-04-21, 15:25:55 GMT -05:00
Completed on : 2026-04-21, 15:56:29 GMT -05:00
Signers : 1
Document originator
Name : Eco-Libre
Email : REDACTED@eco-libre.org
IP address : 94.185.80.231
Signer 1
Name : Michael Altfield
Email : REDACTED@eco-libre.org
Viewed on : 2026-04-21, 15:50:32 GMT -05:00
Signed on : 2026-04-21, 15:56:29 GMT -05:00
IP address : 2001:67c:e60:c0c:192:42:116:52
Signature :
      1. so the hashes do match; that's cool
      2. but will I be able to view the certificates in the future?!?
      3. I went back to the admin dashboard -> documents -> completed -> (eye icon) -> certificate
        1. ok, that worked. I can pull it up again.
      4. curiously it still says I've sent 0/15 emails this month
        1. oh, I refrehed the page. now it says 1/15.
      5. I also see that my admin email got an email with an attachment titled "Test Agreement -
REDACTED@eco-libre.org - 22-Apr-2026 02:26 AM.pdf" – so I guess it did email it to me
        1. oh, awesome, there's also an attachment named "certificate.pdf"
        2. the email is 83 KB + 139 KB for the two attachments, so that's reasonable. and that eliminates a lot of fear around exports. we'll have this data forever if we keep this email account's forever (or setup an automated backup process)
      1. there's also this "open sign drive" thing. I wasn't sure if this was an opt-in or pro feature
        1. looks like the signed document is there too. it's just called "Test Agreement" – which isn't very nice, but I can see the "Created date" – which should be good enough.
    1. ok, I think we have a solution! this definitely meets our needs – unless/until we get >=6 volunteers per month (if we have them sign two documents each)
  1. I spent some time designing a letterhead in LibreOffice
  2. looks like what we want is a Contributor License Agreement https://en.wikipedia.org/wiki/Contributor_license_agreement
  3. looks like a lot of projects just use the CLA assistant tool on gthub https://cla-assistant.io/
    1. that's kinda cool, but I honestly don't know how long we'll be on github. If it's tied to an issue (and not something actually in git), it'll be hard to move to codeberg in the future
    2. still, I like the tl;dr CLA; short & sweet (maybe too much so) https://gist.github.com/waldyrious/e50feec13683e565769fbd58ce503d4e
## tldr-pages contributor agreement

(1) I assert that any past, present and future contributions I make to the tldr-pages project are my own work, and that I have the right to license them.

(2) I agree to license all my contributions to the tldr-pages project under the terms of the license included in the tldr-pages repository I’m contributing to.

(3) I grant the tldr-pages organization a license to distribute my contributions under any open content license compliant with the Open Definition [a], or any open source software license approved by the Open Source Initiative [b], as applicable.

a. http://opendefinition.org/licenses

b. https://opensource.org/licenses/alphabetical
  1. apparently Connonical created a project called Harmony for the purpose of making contributor agreements https://www.harmonyagreements.org/
    1. apparently these things are more complicated between individuals vs other entities. it's possible we'll work with for-profit companies in the future, and for that it'd be good if we were setup to accept both
    2. ugh, there's also a distinction between a "license" and a "assignment"
      1. I skimmed their guide, but I couldn't understand the difference between these two https://www.harmonyagreements.org/guide
  2. fedora project also has one, with an emphasis on *not* taking the copyright away from the user (some controversy about copyright transfer in different CLAs – such as from for-profit companies that later fork & lock-up their user-contributed content under a different, less-permisive license (though I really don't understand how that's possible if we use a CC SA license) https://docs.fedoraproject.org/en-US/legal/fpca/
    1. oh, fedora uses MIT license --which is probably why they need to add all that
  3. apahce has one https://www.apache.org/licenses/contributor-agreements.html#clas
    1. cool, they accept signing with gpg :D
  4. Element (the matrix client) which uses AGPL has a pretty good document, which is 3 pages long https://static.element.io/legal/contributor-license-agreement.pdf
  5. a lot of these are kinda software heavy. I wonder if there's any good OSHW orgs that we can try?
    1. I checked OSHWA, but didn't see a boilerplate CLA that we could copy https://oshwa.org/
      1. they did have a CoC. Jesus, how many policies do we need to make? https://oshwa.org/resources/how-to-write-a-code-of-conduct/
      2. I publicy tooted @oshwassociation@mastodon.social if they had something to recommend https://chaos.social/@ecolibre/116444933464052302
      3. hmm...here they recommend CERN OHL v2 instead of CC BY-SA, if we're using something like STL files that are generated from CAD design https://oshwa.org/resources/sharing-best-practices/
    2. CERN does have some does on CLAs https://ospo.docs.cern.ch/howtos/signing-CLA-DCO/
    3. CERN links to this short one, from the Linux Foundation https://developercertificate.org/


Developer Certificate of Origin
Version 1.1

Copyright (C) 2004, 2006 The Linux Foundation and its contributors.

Everyone is permitted to copy and distribute verbatim copies of this
license document, but changing it is not allowed.


Developer's Certificate of Origin 1.1

By making a contribution to this project, I certify that:

(a) The contribution was created in whole or in part by me and I
	have the right to submit it under the open source license
	indicated in the file; or

(b) The contribution is based upon previous work that, to the best
	of my knowledge, is covered under an appropriate open source
	license and I have the right under that license to submit that
	work with modifications, whether created in whole or in part
	by me, under the same open source license (unless I am
	permitted to submit under a different license), as indicated
	in the file; or

(c) The contribution was provided directly to me by some other
	person who certified (a), (b) or (c) and I have not modified
	it.

(d) I understand and agree that this project and the contribution
	are public and that a record of the contribution (including all
	personal information I submit with it, including my sign-off) is
	maintained indefinitely and may be redistributed consistent with
	this project or the open source license(s) involved.
  1. ok, I think I'm muddling two things here
    1. I think the wiki's TOS should be simpler. If I require all wiki users to become volunteers first, and the volunteer onboarding requires the signing of documents, then the real legal stuff should be in the documents.
    2. for now, let's just do the bullet point thing on the wiki ToS. And I'll wait to hear back from OSHWA about the CLA for a *proper* leagl document later – maybe TODO when we actually get another volunteer application..
  2. I set the ToS to the DCO from the linux foundation https://wiki.eco-libre.org/wiki/Eco-Libre:Terms_of_Service
    1. ah crap, I just realized that it says "changing it is not allowed". I already changed it by removing the Linux Foundation from the name (I moved it to the bottom in an "attribution" section, which is another change! damn ND licenses! I'll have to find something else)
  3. I want to use the tl;dr gist, but it's not licensed! https://gist.github.com/waldyrious/e50feec13683e565769fbd58ce503d4e#file-tldr-pages-cla-md
    1. the profile of the author says they're a wikipedian and anarchist, so they'll probably be down to license it openly
    2. I asked here https://gist.github.com/waldyrious/e50feec13683e565769fbd58ce503d4e?permalink_comment_id=6112400#gistcomment-6112400
  4. another issue with a lot of these CLAs is that they're pretty old, and don't touch on AI.
    1. I'm thinking we should have a policy that forbids contributions from Eco-Libre volunteers that do any research or design work with AI, since it presents serious legal issues around copyrights. I really do want 100% of our work to be very CC BY-SA. With nothing to muddle the waters. We're doing this designs ourselves to build an open-source commons, built only individual human contributions and only other openly-licensed works
    2. clojure already addressed this in their CLA (they just call it CA = Contributor Agreement) https://clojure.org/dev/contributor_agreement
No Generated Code

Clojure’s code is written and reviewed by humans. Code generated by a large language model or similar technology, such as Anthropic’s Claude, GitHub/Microsoft’s Copilot, OpenAI’s ChatGPT, Facebook/Meta’s Code Llama et al, is not compliant with the covenants and representations of Clojure’s Contributor’s Agreement, and is thus not acceptable as code for Clojure.

An exception may be made for human written generators whose source code is contributed along with the patch
    1. I don't like that exception. The source code doesn't just need to be submitted along with the patch. the whole training set data needs to be submitted along with the patch, which is practically impossible.
    2. weird, they call it the "Rich Hickey Contributor Agreement" https://na1.documents.adobe.com/public/esignWidget?wid=CBFCIBAA3AAABLblqZhCSXRbJ7T5RGvmMvmpg3CzvkF_RcpWXMnGWW_W9340ztJ3-ChQ0m18hA-d06ufD8Yk*
      1. oh good, the document itself is CC BY-SA
    3. the source for it was oracle's OCA https://www.oracle.com/technetwork/oca-faq-405384.pdf
      1. yeah, the second-to-last FAQ question says that the OCA is CC BY-SA
      2. looks like neither of them mention AI in the document itself :/
      3. maybe I don't like the RHCA contents, but I do really like the header and footer and how clearly it's licened itself as CC BY-SA
  1. the linux foundation has a CLA generator, but it's authwalled :( https://easycla.lfx.linuxfoundation.org/#/
  2. cyanogenmod's is pretty nice; not too long. unfortunately the license isn't clear https://web.archive.org/web/20160308140334/http://review.cyanogenmod.org/static/cla_individual.html
  3. same for Discourse; it's about 7 paragraph bullet points long. unfortuantely the license isn't clear https://cla-assistant.io/discourse/discourse
    1. apparently it's an apache license https://github.com/cla-assistant/cla-assistant/blob/main/LICENSE
  4. django has two: indivdual and corproate. apparently adapted from apache's (so likely licensed under apache, but I should confirm
    1. https://media.djangoproject.com/foundation/icla.pdf
    2. https://media.djangoproject.com/foundation/icla.pdf
  5. evil corps like meta and google have CLAs, but I doubt they're licensed openly
    1. https://code.facebook.com/cla/individual
    2. https://cla.developers.google.com/about/google-individual?csw=1
  6. here's hashicorp's. I don't think it's licensed openly https://www.hashicorp.com/en/cla
  7. Here's Hoe Assistant https://www.home-assistant.io/blog/2017/01/21/home-assistant-governance/
    1. apparently Matthew Garret convinced them to change their CLA from GitHub's to this one https://www.home-assistant.io/blog/2017/01/21/home-assistant-governance/
By making a contribution to this project, I certify that:

(a) The contribution was created in whole or in part by me and I
	have the right to submit it under the Apache 2.0 license; or

(b) The contribution is based upon previous work that, to the best
	of my knowledge, is covered under an appropriate open source
	license and I have the right under that license to submit that
	work with modifications, whether created in whole or in part
	by me, under the Apache 2.0 license; or

(c) The contribution was provided directly to me by some other
	person who certified (a), (b) or (c) and I have not modified
	it.

(d) I understand and agree that this project and the contribution
	are public and that a record of the contribution (including all
	personal information I submit with it) is maintained indefinitely
	and may be redistributed consistent with this project or the open
	source license(s) involved.
    1. is it just me, or does that look like the one from the Linux Foundation, except it was modified to have the section saying "you can't modify this" removed. Hmm./.
    2. yeah, they say that in attribtuion
The text of this license is available under the Creative Commons Attribution-ShareAlike 3.0 Unported License. It is based on the Linux Developer Certificate Of Origin, but is modified to explicitly use the Apache 2.0 license and not mention sign-off.
    1. idk, maybe they got explicit permission from the Linux Foundation to modify it and re-license it CC BY-SA?
    2. I asked them if they got permission and to publish proof, so we could do the same https://github.com/home-assistant/home-assistant.io/issues/44892

2026-04-20

  1. I got a link from a friend from a pretty cool sounding similar project https://projectkamp.com/
    1. sounds like they have similar ideas as Eco-Libre, except they already bought land already
    2. They claim to use CC BY-SA to license all their works, but their videos are not marked as-such on YouTube. And, because YouTube is trash, I can't view their videos https://academy.projectkamp.com/start/intro/#open-source--license
    3. I wanted to email them to update the license on their YouTube videos (so, at least, they could be archived on archive.org and uploaded to PeerTube, etc), but I couldn't find their email https://projectkamp.com/faq.html
    4. Their footer says they're part of One Army (along with, eg Precious Plastic), so I emailed One Army asking for the email address of Project Kamp https://www.onearmy.earth/
Hello,

Can you please tell me the email address of Project Kamp?

I'm looking to get in contact with Project Kamp over email, but I couldn't find a way to email them from their website:

 * https://projectkamp.com/faq.html

Please send me the email address for Project Kamp.


Thank you,

Michael Altfield
https://www.michaelaltfield.net
PGP Fingerprint: 0465 E42F 7120 6785 E972  644C FE1B 8449 4E64 0D41
    1. TODO: add Project Kamp to our 'common-files' repo's docs as a "Similar Project"
  1. ...
  2. Tomorrow we're publishing our partnership with Raft Foundation, so we can accept tax-deductable donations https://www.eco-libre.org/raft-2026/
  3. Some weeks ago I did updates of wordpress, including adding new plugins. One of them was ActivityPub
  4. I enabled ActivityPub, but the Settings page gives me a "504 Gateway Time-out" error from nginx https://www.eco-libre.org/wp-admin/options-general.php?page=activitypub
<html>
<head><title>504 Gateway Time-out</title></head>
<body>
<center><h1>504 Gateway Time-out</h1></center>
<hr><center>nginx</center>
</body>
</html>
    1. here's the error.log entry for nginx
2026/04/20 17:37:36 [error] 1992101#1992101: *2507383 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 64.42.180.66, server: www.eco-libre.org, request: "GET /wp-admin/options-general.php?page=activitypub HTTP/1.1", upstream: "http://127.0.0.1:6081/wp-admin/options-general.php?page=activitypub", host: "www.eco-libre.org
    1. and here's the apache logs
==> www.eco-libre.org/access.log <==
64.42.180.66 - - [20/Apr/2026:17:54:54 +0000] "POST /wp-admin/admin-ajax.php HTTP/1.1" 200 792 "https://www.eco-libre.org/wp-admin/plugins.php?plugin_status=all&paged=1&s" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"

==> www.eco-libre.org/error.log <==
[Mon Apr 20 17:55:23.176842 2026] [proxy_fcgi:error] [pid 526343:tid 526374] (70007)The timeout specified has expired: [client 64.42.180.66:0] AH01075: Error dispatching request to : (polling)

==> www.eco-libre.org/access.log <==
64.42.180.66 - - [20/Apr/2026:17:54:23 +0000] "GET /wp-admin/options-general.php?page=activitypub HTTP/1.1" 504 467 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
    1. I don't know what's wrong, and that's not enough to debug it. I tested ActivityPub on another site, and the config page had no issues. But I ended-up not finishing its setup because I wanted the actor URL to use the naked domain, and I'm still waiting to hear back on that https://github.com/Automattic/wordpress-activitypub/issues/3164
  1. anyway, I wrote a newsletter, scheduled it to go out for tomorrow at 15:00 UTC
  2. I also wrote the update for Open Collective
  3. I put the "Donate" page in the menu bar
    1. on mobile, this made the top navbar spill over into a second row, so I moved "Contact" under "Join Us"
      1. to make up for this, I started creating footer areas
      2. the theme supports three footers. one on the left, center, and right
      3. I put copyright & copyleft info on the right footer
      4. I put social media icons in the middle footer
      5. I put a "Contact" link on the left footer
    2. As I was styling the left footer, I stopped being able to update it suddenly. I kept getting error
There was an error. Could not get a valid response from the server.
    1. closer inspection of the networking tab of the browsers debugger showed an error when doing an OPTIONS request
    2. well, that's probably because (for security) we block all but GET POST and HEAD
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
   # note: 444 is a meta code; it doesn't return anything, actually
   #       it just logs, drops, & closes the connection (useful
   #       against malware)
   return 444;
}
    1. well, fuck, our widgets are bricked
    2. I asked about this here https://wordpress.org/support/topic/configure-wordpress-to-never-use-options-requests/
    3. as a workaround, I found that I *can* edit these footer widgets from the theme -> customize -> widgets section of the site – which sends POST as expected https://www.eco-libre.org/wp-admin/customize.php?return=%2Fwp-admin%2Fwidgets.php
  1. I realized that I can't post to lemmy anymore, because our sdf instance has been down since 2026-04-07
  2. I went ahead and created an accout request on the solar punk instance https://slrpnk.net/
    1. if we're accepted, I'd also like to create a community specific to Eco-Libre
  3. I also created one on lemmy.vg

2026-04-19

  1. I failed to login to the wiki today. I got error
[REDACTED] 2026-04-19 20:34:48: Fatal exception of type "DomainException"
  1. exception.log seems to suggest that I set a bad config for the password policy yesterday
==> exception.log <==
2026-04-19 20:36:27 mail wiki_el_db-rHb3: [REDACTED] /index.php?title=Special:UserLogin&returnto=MediaWiki
%3ARequestaccount-agree   DomainException: Invalid password policy config. No check defined for 'PasswordCannotMatchUsername'
.
#0 /usr/share/mediawiki/includes/password/UserPasswordPolicy.php(88): MediaWiki\Password\UserPasswordPolicy->checkPolicies()
#1 /usr/share/mediawiki/includes/user/User.php(995): MediaWiki\Password\UserPasswordPolicy->checkUserPassword()
#2 /usr/share/mediawiki/includes/auth/AbstractPasswordPrimaryAuthenticationProvider.php(114): MediaWiki\User\User->checkPassw
ordValidity()
#3 /usr/share/mediawiki/includes/auth/AbstractTemporaryPasswordPrimaryAuthenticationProvider.php(155): MediaWiki\Auth\Abstrac
tPasswordPrimaryAuthenticationProvider->checkPasswordValidity()
#4 /usr/share/mediawiki/includes/auth/AuthManager.php(625): MediaWiki\Auth\AbstractTemporaryPasswordPrimaryAuthenticationProv
ider->beginPrimaryAuthentication()
#5 /usr/share/mediawiki/includes/auth/AuthManager.php(535): MediaWiki\Auth\AuthManager->continueAuthentication()
#6 /usr/share/mediawiki/includes/specialpage/AuthManagerSpecialPage.php(390): MediaWiki\Auth\AuthManager->beginAuthentication
()
#7 /usr/share/mediawiki/includes/specialpage/AuthManagerSpecialPage.php(524): MediaWiki\SpecialPage\AuthManagerSpecialPage->performAuthenticationStep()
#8 [internal function]: MediaWiki\SpecialPage\AuthManagerSpecialPage->handleFormSubmit()
#9 /usr/share/mediawiki/includes/htmlform/HTMLForm.php(822): call_user_func()
#10 /usr/share/mediawiki/includes/specialpage/AuthManagerSpecialPage.php(455): MediaWiki\HTMLForm\HTMLForm->trySubmit()
#11 /usr/share/mediawiki/includes/specialpage/LoginSignupSpecialPage.php(403): MediaWiki\SpecialPage\AuthManagerSpecialPage->trySubmit()
#12 /usr/share/mediawiki/includes/specialpage/SpecialPage.php(728): MediaWiki\SpecialPage\LoginSignupSpecialPage->execute()
#13 /usr/share/mediawiki/includes/specialpage/SpecialPageFactory.php(1717): MediaWiki\SpecialPage\SpecialPage->run()
#14 /usr/share/mediawiki/includes/actions/ActionEntryPoint.php(505): MediaWiki\SpecialPage\SpecialPageFactory->executePath()
#15 /usr/share/mediawiki/includes/actions/ActionEntryPoint.php(147): MediaWiki\Actions\ActionEntryPoint->performRequest()
#16 /usr/share/mediawiki/includes/MediaWikiEntryPoint.php(200): MediaWiki\Actions\ActionEntryPoint->execute()
#17 /usr/share/mediawiki/index.php(58): MediaWiki\MediaWikiEntryPoint->run()
#18 {main}
  1. here's what we have
$wgPasswordPolicy['policies']['default']['PasswordCannotMatchUsername'] = true;
  1. but the docs suggest there's an additioanl array needed for "value"
$wgPasswordPolicy['policies']['default']['PasswordCannotMatchUsername']['value'] = false;
  1. if I expand "Older Versions" then the 'PasswordCannotMatchUsername' disappears from mediawiki >1.37. The docs still say it's an option, but I didn't find it in our files https://www.mediawiki.org/wiki/Manual:$wgPasswordPolicy#Default
root@mail:/var/www/html/wiki.eco-libre.org# grep -irl PasswordCannotMatchUsername *
LocalSettings.20260419.php
LocalSettings.php
root@mail:/var/www/html/wiki.eco-libre.org# 
  1. it does appear that 'PasswordCannotBeSubstringInUsername' is available. let's use that instead.
  2. ugh, next attempt gives another failure
==> exception.log <==
2026-04-19 21:04:26 mail wiki_el_db-rHb3: [REDACTED] /index.php?title=Special:UserLogin&returnto=MediaWiki
%3ARequestaccount-agree   DomainException: Invalid password policy config. No check defined for 'PasswordCannotBePopular'
  1. I removed this; I guess we're supposed to use 'PasswordNotInCommonList', which we already use.
  2. ok, that worked. I'm able to login-in. here's the final
# PASSWORD POLICIES

$wgPasswordPolicy['policies']['default']['MinimalPasswordLength'] = 10;
$wgPasswordPolicy['policies']['default']['PasswordCannotBeSubstringInUsername']['value'] = true;
$wgPasswordPolicy['policies']['default']['PasswordNotInCommonList'] = true;

$wgPasswordPolicy['policies']['sysop']['MinimalPasswordLength'] = 20;
  1. now that I can login, I was going to change the text that appears on the Request Account page https://wiki.eco-libre.org/wiki/MediaWiki:Requestaccount-text
Complete and submit the following form to request a user account.

Make sure that you first read the Terms of Service before requesting an account.

Once the account is approved, you will be emailed a notification message and the account will be usable at login. 
    1. my intention was to add a notebox to highlight that the user would need to first complete the Eco-Libre Volunteer Test (https://eco-libre.github.io/volunteer-test/) before their new wiki account would be approve, and tell them to contact us (https://eco-libre.org/contact/)
    2. unforutnately, the notebox template doesn't exist!
    3. I found the docs on templates, and it says there's no way to import a bunch of standard templates https://www.mediawiki.org/wiki/Help:Templates
    4. this third-party guide says we can make the export/import (eg from Wikipedia) of a mass of templates easier with the Scribunto extension https://www.ryadel.com/en/how-to-add-wikipedia-mbox-templates-to-your-own-mediawiki/
    5. this extension ships with core mediawiki, it seems
root@mail:/var/www/html/wiki.eco-libre.org# ls htdocs/extensions/
AbuseFilter     ConfirmEdit      InputBox          Nuke             ReplaceText            TemplateData    Widgets
CategoryTree    DeleteBatch      Interwiki         OATHAuth         Scribunto              TextExtracts    WikiEditor
Cite            DiscussionTools  Linter            PageImages       SecureLinkFixer        Thanks
CiteThisPage    Echo             LoginNotify       ParserFunctions  SmiteSpam              TitleBlacklist
CodeEditor      Gadgets          Math              PdfHandler       SpamBlacklist          UserMerge
ConfirmAccount  ImageMap         MultimediaViewer  Poem             SyntaxHighlight_GeSHi  VisualEditor
root@mail:/var/www/html/wiki.eco-libre.org# 
  1. TODO: finish installing Scribunto, then do a mass-export & mass-import of common templates from Wikipedia. Then finish configuring ''MediaWiki:Requestaccount-text''
  2. I thought that, maybe, a lower hanging fruit would be to implement the Privacy Policy, but I realized that page actually requires the user to accept the Terms of Service, not the Privacy Policy
    1. OSE appears to have never set a ToS (And I created the Privacy Policy, largely based on the creative commons' privacy policy https://wiki.opensourceecology.org/wiki/Terms_of_Service
    2. The wikipedia Terms of Service is actually named Terms of Use, and it's pretty specific to Wikipedia (including their mission, etc). In it, it references the Privacy Policy https://foundation.wikimedia.org/wiki/Policy:Terms_of_Use/en
    3. Appropedia doesn't appear to have a page dedicated to ToS (or ToU) or Privacy Policy. Instead, it's just on one page named Policies https://www.appropedia.org/Appropedia:Policies

2026-04-18

  1. continuing where I left off yes terday to fix mediawiki after the unattended-upgrade deleted our LocalSettings.php file
  2. I need to push-out a new php.ini config (with ansible) to include /etc/mediawiki/ in the open_basedir setting
  3. ansible is broken suddenly; it says it can't find python
fatal: [michaelaltfield.net]: UNREACHABLE! => {"changed": false, "msg": "EOF on stream; last 100 lines received:\nbash: line 1: /usr/bin/python: No such file or directory", "unreachable": true}
  1. well, idk, did debian remove a symlink from python to python3?
root@mail:/var/lib/mediawiki# ls -lah /usr/bin/python
ls: cannot access '/usr/bin/python': No such file or directory
root@mail:/var/lib/mediawiki# ls -lah /usr/bin/python3
lrwxrwxrwx 1 root root 10 Jun 30  2025 /usr/bin/python3 -> python3.13
root@mail:/var/lib/mediawiki# 
  1. looks like there's a var I can set for this named ansible_python_interpreter, but it's only available in python >= 2.2.0 https://stackoverflow.com/a/41431540
  2. and we only have ansible v2.14.18, installed in apt on debian 12 on my client machine
$ dpkg -l | grep -i ansible
ii  ansible                                       7.7.0+dfsg-3+deb12u1                     all          Configuration management, deployment, and task execution system
ii  ansible-core                                  2.14.18-0+deb12u2                        all          Configuration management, deployment, and task execution system
ii  ansible-mitogen                               0.3.3-9+deb12u1                          all          Fast connection strategy for Ansible
$

$ cat /etc/issue
Debian GNU/Linux 12 \n \l

$ 
  1. looks like debian 13 only has ansible core v2.18, so that won't help https://packages.debian.org/trixie/ansible
  2. fuck it, I just created a symlink. maybe it'll get deleted a and I'll have to recreate it again. maybe not
root@mail:/var/lib/mediawiki# ln -s /usr/bin/python3 /usr/bin/python
root@mail:/var/lib/mediawiki# 
  1. ok, that fixed ansible, and I was able to push-out the udpdated php.ini file
  2. restarted php
root@mail:/var/lib/mediawiki# systemctl restart php8.4-fpm
root@mail:/var/lib/mediawiki# 
  1. ...aaaand the wiki is fixed
[user@disp3459 ~]$ curl -IL https://wiki.eco-libre.org/
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Sat, 18 Apr 2026 17:38:39 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 0
Connection: keep-alive
X-Content-Type-Options: nosniff
Vary: Accept-Encoding,Cookie
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Cache-Control: private, must-revalidate, max-age=0
X-Request-Id: REDACTED
X-Frame-Options: SAMEORIGIN
Last-Modified: Sat, 18 Apr 2026 17:38:06 GMT
Location: https://wiki.eco-libre.org/wiki/Main_Page
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
X-Frame-Options: deny
Referrer-Policy: strict-origin
X-Varnish: 6288299 13705059
Age: 33
Via: 1.1 mail (Varnish/7.7)
Strict-Transport-Security: max-age=86400;includeSubDomains

HTTP/1.1 200 OK
Server: nginx
Date: Sat, 18 Apr 2026 17:38:40 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 15926
Connection: keep-alive
X-Content-Type-Options: nosniff
Content-language: en
Vary: Accept-Encoding,Cookie
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Cache-Control: private, must-revalidate, max-age=0
X-Request-Id: REDACTED
X-Frame-Options: SAMEORIGIN
Last-Modified: Sat, 18 Apr 2026 01:16:13 GMT
X-Mod-Pagespeed: Powered By mod_pagespeed
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
X-Frame-Options: deny
Referrer-Policy: strict-origin
X-Varnish: 18702490 13705062
Age: 31
Via: 1.1 mail (Varnish/7.7)
Accept-Ranges: bytes
Strict-Transport-Security: max-age=86400;includeSubDomains

[user@disp3459 ~]$ 
  1. ...
  2. alright, now let's try to install & configure all the 3TOFU'd extensions
  3. we have 6 new extensions to install
root@mail:/var/tmp/mediawiki/extensions.2026-03-29# ls
ConfirmAccount-REL1_43-38c4602.tar.gz  extensions.txt  OATHAuth-REL1_43-015a49e.tar.gz   UserMerge-REL1_43-27425da.tar.gz
DeleteBatch-REL1_43-b3b052b.tar.gz     info.txt        SmiteSpam-REL1_43-483b81b.tar.gz  Widgets-REL1_43-60a09f0.tar.gz
root@mail:/var/tmp/mediawiki/extensions.2026-03-29# 
  1. I extracted them
root@mail:/var/tmp/mediawiki/extensions.2026-03-29# for file in $(ls *.tar.gz); do tar -xvf $file; done.
...
Widgets/vendor/smarty/smarty/CHANGELOG.md
Widgets/COPYING
root@mail:/var/tmp/mediawiki/extensions.2026-03-29#

root@mail:/var/tmp/mediawiki/extensions.2026-03-29# ls
ConfirmAccount                         info.txt                          UserMerge
ConfirmAccount-REL1_43-38c4602.tar.gz  OATHAuth                          UserMerge-REL1_43-27425da.tar.gz
DeleteBatch                            OATHAuth-REL1_43-015a49e.tar.gz   Widgets
DeleteBatch-REL1_43-b3b052b.tar.gz     SmiteSpam                         Widgets-REL1_43-60a09f0.tar.gz
extensions.txt                         SmiteSpam-REL1_43-483b81b.tar.gz
root@mail:/var/tmp/mediawiki/extensions.2026-03-29# 

  1. let's start with OATHAuth, which is probably the most important (for security)
  2. oh wait, we already have OATHAuth??
root@mail:/var/tmp/mediawiki/extensions.2026-03-29# ls /var/www/html/wiki.eco-libre.org/htdocs/extensions/
AbuseFilter   ConfirmEdit      InputBox     MultimediaViewer  PdfHandler       SpamBlacklist          TitleBlacklist
CategoryTree  DiscussionTools  Interwiki    Nuke              Poem             SyntaxHighlight_GeSHi  VisualEditor
Cite          Echo             Linter       OATHAuth          ReplaceText      TemplateData           WikiEditor
CiteThisPage  Gadgets          LoginNotify  PageImages        Scribunto        TextExtracts
CodeEditor    ImageMap         Math         ParserFunctions   SecureLinkFixer  Thanks
root@mail:/var/tmp/mediawiki/extensions.2026-03-29# 
  1. ugh, yeah, this syas it has been inclued in MediaWiki core since v1.31 https://www.mediawiki.org/wiki/Extension:OATHAuth
This extension comes with MediaWiki 1.31 and later, so you do not need to download it. The remaining configuration instructions must still be followed.
  1. well, maybe that's why it got updated so much. anyway, that's better; we get it directly from apt
root@mail:/var/tmp/mediawiki/extensions.2026-03-29# dpkg -l | grep -i mediawiki
ii  mediawiki                         1:1.43.8+dfsg-1~deb13u1                 all          website engine for collaborative work
ii  mediawiki-classes                 1:1.43.8+dfsg-1~deb13u1                 all          website engine for collaborative work - standalone classes
root@mail:/var/tmp/mediawiki/extensions.2026-03-29# 

root@mail:/var/tmp/mediawiki/extensions.2026-03-29# dpkg-query -L mediawiki | grep -i oathauth | head
/usr/share/mediawiki/extensions-core/OATHAuth
/usr/share/mediawiki/extensions-core/OATHAuth/COPYING
/usr/share/mediawiki/extensions-core/OATHAuth/OATHAuth.alias.php
/usr/share/mediawiki/extensions-core/OATHAuth/ServiceWiring.php
/usr/share/mediawiki/extensions-core/OATHAuth/composer.json
/usr/share/mediawiki/extensions-core/OATHAuth/extension.json
/usr/share/mediawiki/extensions-core/OATHAuth/i18n
/usr/share/mediawiki/extensions-core/OATHAuth/i18n/ang.json
/usr/share/mediawiki/extensions-core/OATHAuth/i18n/api
/usr/share/mediawiki/extensions-core/OATHAuth/i18n/api/ar.json
root@mail:/var/tmp/mediawiki/extensions.2026-03-29# 

root@mail:/var/tmp/mediawiki/extensions.2026-03-29# dpkg-query -L mediawiki | grep -i oathauth | tail
/usr/share/mediawiki/extensions-core/OATHAuth/src/OATHAuth.php
/usr/share/mediawiki/extensions-core/OATHAuth/src/OATHAuthModuleRegistry.php
/usr/share/mediawiki/extensions-core/OATHAuth/src/OATHAuthServices.php
/usr/share/mediawiki/extensions-core/OATHAuth/src/OATHUser.php
/usr/share/mediawiki/extensions-core/OATHAuth/src/OATHUserRepository.php
/usr/share/mediawiki/extensions-core/OATHAuth/src/Special
/usr/share/mediawiki/extensions-core/OATHAuth/src/Special/DisableOATHForUser.php
/usr/share/mediawiki/extensions-core/OATHAuth/src/Special/OATHManage.php
/usr/share/mediawiki/extensions-core/OATHAuth/src/Special/VerifyOATHForUser.php
/var/lib/mediawiki/extensions/OATHAuth
root@mail:/var/tmp/mediawiki/extensions.2026-03-29# 
  1. I wonder if there's any others we get? looks like it's only this one
root@mail:/var/tmp/mediawiki/extensions.2026-03-29# ls /usr/share/mediawiki/extensions-core | grep -iE 'ConfirmAccount|SmiteSpam|DeleteBatch|UserMerge|Widgets|OATHAuth'
OATHAuth
root@mail:/var/tmp/mediawiki/extensions.2026-03-29# 
  1. just another quick check – none of these are in apt either
root@mail:/var/tmp/mediawiki/extensions.2026-03-29# apt-cache search mediawiki | grep -i extension
libreoffice-wiki-publisher - LibreOffice extension for working with MediaWiki articles
mediawiki-extension-codemirror - Syntax highlighting in MediaWiki's wikitext editor
mediawiki-extension-youtube - Embed YouTube and other videos into MediaWiki pages
php-luasandbox - PHP extension that provides a sandboxed Lua environment
php-wmerrors - PHP extension that enhances and customizes handling of PHP errors
root@mail:/var/tmp/mediawiki/extensions.2026-03-29# 
  1. anyway, back to OATHAuth
    1. it says to enable caching
It is strongly recommended to setup caching when using OATHAuth.
  1. I confirmed that we already have cachign setup with APC
root@mail:/var/www/html/wiki.eco-libre.org# grep -ir cache LocalSettings.php 
$wgMainCacheType = CACHE_ACCEL;
$wgMemCachedServers = [];
## Set $wgCacheDirectory to a writable directory on the web server
#$wgCacheDirectory = "$IP/cache";
$wgCacheDirectory = "/var/www/html/wiki.eco-libre.org/cache";
root@mail:/var/www/html/wiki.eco-libre.org# 
      1. CACHE_ACCEL means APC, which is the recommended option for single-server wikis, per the official mediawiki docs on performance tuning https://www.mediawiki.org/wiki/Manual:Performance_tuning#Single_web_server
      2. it also says to ue varnish. check
      3. it also says to use php-fpm w/ event MPM (instead of mod_php with prefork MPM), which we changed-to last month. check.
    1. our notes from OSE had the following options https://wiki.opensourceecology.org/wiki/CHG-2025-XX-XX_migrate_wiki_to_hetzner3
wfLoadExtension( 'OATHAuth' );

# Relaxed mode with +/- 4 minutes time drift tolerance. This is important or users will complain and/or disable 2FA entirely
# The security consequences are small. The usability benefits are huge.
$wgOATHAuthWindowRadius = 8;

# make admins require 2FA
$wgOATHRequiredForGroups = ['sysop', 'interface-admin', 'bureaucrat', 'suppress', 'widgeteditor' ];

# make 'powerful' rights require 2FA
$wgOATHExclusiveRights =  [ 'apihighlimits', 'applychangetags', 'autoconfirmed', 'autopatrol', 'bigdelete', 'block', 'blockemail', 'bot', 'changetags', 'createaccount', 'createtalk', 'delete', 'deletechangetags', 'deletedhistory', 'deletedtext', 'deletelogentry', 'deleterevision', 'editcontentmodel', 'editinterface', 'editprotected', 'editsemiprotected', 'editsitecss', 'editsitejs', 'editsitejson', 'editusercss', 'edituserjs', 'edituserjson', 'hideuser', 'import', 'importupload', 'ipblock-exempt', 'managechangetags', 'markbotedits', 'mergehistory', 'move-categorypages', 'move-rootuserpages', 'move-subpages', 'nominornewtalk', 'noratelimit', 'patrol', 'protect', 'renameuser', 'reupload-shared', 'sendemail', 'suppressionlog', 'suppressredirect', 'suppressrevision', 'unblockself', 'unwatchedpages', 'userrights', ];

# full list for reference (taken from htdocs/includes/MainConfigSchema.php) https://www.mediawiki.org/wiki/Extension:OATHAuth#Configuration
#$wgOATHExclusiveRights =  [ 'apihighlimits', 'applychangetags', 'autoconfirmed', 'autopatrol', 'bigdelete', 'block', 'blockemail', 'bot', 'browsearchive', 'changetags', 'createaccount', 'createpage', 'createtalk', 'delete', 'deletechangetags', 'deletedhistory', 'deletedtext', 'deletelogentry', 'deleterevision', 'edit', 'editcontentmodel', 'editinterface', 'editmyoptions', 'editmyprivateinfo', 'editmyusercss', 'editmyuserjs', 'editmyuserjson', 'editmyuserjsredirect', 'editmywatchlist', 'editprotected', 'editsemiprotected', 'editsitecss', 'editsitejs', 'editsitejson', 'editusercss', 'edituserjs', 'edituserjson', 'hideuser', 'import', 'importupload', 'ipblock-exempt', 'managechangetags', 'markbotedits', 'mergehistory', 'minoredit', 'move', 'move-categorypages', 'movefile', 'move-rootuserpages', 'move-subpages', 'nominornewtalk', 'noratelimit', 'patrol', 'protect', 'read', 'renameuser', 'reupload', 'reupload-shared', 'rollback', 'sendemail', 'suppressionlog', 'suppressredirect', 'suppressrevision', 'unblockself', 'undelete', 'unwatchedpages', 'upload', 'userrights', 'viewmyprivateinfo', 'viewmywatchlist', 'viewsuppressed' ];
      1. I strongly agree with the relaxed window of codes
      2. I guess that list of requirements is good
      3. the other two are no longer listed on the wiki, but I guess they're good ?
    1. the docs show an additional option = $wgOATHSecretKey, used for encrypting the secret keys in the db. it suggests this command to generate it https://www.mediawiki.org/wiki/Extension:OATHAuth
hexdump -vn32 -e'8/8 "%08X" "\n"' /dev/urandom
      1. says it's only available since 1.45. I'm not sure if that's the mediawiki version or the extension version.
      2. oh, I guess it's mediawiki, since they ship together. We're running 1.43.8, so I guess we can't use it yet https://wiki.eco-libre.org/wiki/Special:Version
      3. well, I guess let's define it. then it'll automatically start to use it when we upgrade to the next LTS. I think.
    1. ok, here's what I added
root@mail:/var/www/html/wiki.eco-libre.org# diff LocalSettings.20260418.php LocalSettings.php 
220a221,240
> 
> # configure OATHAuth for MFA (2FA). See also:
> # * https://www.mediawiki.org/wiki/Extension:OATHAuth
> # * https://wiki.eco-libre.org/wiki/Maltfield_Log/2026
> wfLoadExtension( 'OATHAuth' );
> 
> # Relaxed mode with +/- 4 minutes time drift tolerance. This is important or users will complain and/or disable 2FA entirely
> # The security consequences are small. The usability benefits are huge.
> $wgOATHAuthWindowRadius = 8;
> 
> # make admins require 2FA
> $wgOATHRequiredForGroups = ['sysop', 'interface-admin', 'bureaucrat', 'suppress', 'widgeteditor' ];
> 
> # make 'powerful' rights require 2FA
> $wgOATHExclusiveRights =  [ 'apihighlimits', 'applychangetags', 'autoconfirmed', 'autopatrol', 'bigdelete', 'block', 'blockemail', 'bot', 'changetags', 'createaccount', 'createtalk', 'delete', 'deletechangetags', 'deletedhistory', 'deletedtext', 'deletelogentry', 'deleterevision', 'editcontentmodel', 'editinterface', 'editprotected', 'editsemiprotected', 'editsitecss', 'editsitejs', 'editsitejson', 'editusercss', 'edituserjs', 'edituserjson', 'hideuser', 'import', 'importupload', 'ipblock-exempt', 'managechangetags', 'markbotedits', 'mergehistory', 'move-categorypages', 'move-rootuserpages', 'move-subpages', 'nominornewtalk', 'noratelimit', 'patrol', 'protect', 'renameuser', 'reupload-shared', 'sendemail', 'suppressionlog', 'suppressredirect', 'suppressrevision', 'unblockself', 'unwatchedpages', 'userrights', ];
> 
> # full list for reference (taken from htdocs/includes/MainConfigSchema.php) https://www.mediawiki.org/wiki/Extension:OATHAuth#Configuration
> #$wgOATHExclusiveRights =  [ 'apihighlimits', 'applychangetags', 'autoconfirmed', 'autopatrol', 'bigdelete', 'block', 'blockemail', 'bot', 'browsearchive', 'changetags', 'createaccount', 'createpage', 'createtalk', 'delete', 'deletechangetags', 'deletedhistory', 'deletedtext', 'deletelogentry', 'deleterevision', 'edit', 'editcontentmodel', 'editinterface', 'editmyoptions', 'editmyprivateinfo', 'editmyusercss', 'editmyuserjs', 'editmyuserjson', 'editmyuserjsredirect', 'editmywatchlist', 'editprotected', 'editsemiprotected', 'editsitecss', 'editsitejs', 'editsitejson', 'editusercss', 'edituserjs', 'edituserjson', 'hideuser', 'import', 'importupload', 'ipblock-exempt', 'managechangetags', 'markbotedits', 'mergehistory', 'minoredit', 'move', 'move-categorypages', 'movefile', 'move-rootuserpages', 'move-subpages', 'nominornewtalk', 'noratelimit', 'patrol', 'protect', 'read', 'renameuser', 'reupload', 'reupload-shared', 'rollback', 'sendemail', 'suppressionlog', 'suppressredirect', 'suppressrevision', 'unblockself', 'undelete', 'unwatchedpages', 'upload', 'userrights', 'viewmyprivateinfo', 'viewmywatchlist', 'viewsuppressed' ];
> 
> $wgOATHSecretKey='REDACTED';
root@mail:/var/www/html/wiki.eco-libre.org# 
    1. ok, now let's update the db
      1. oh, this failed. we need to use the special privliged db user, since we hardened the normal db user
root@mail:/var/www/html/wiki.eco-libre.org# sudo -u www-data php /usr/share/mediawiki/maintenance/run.php update
MediaWiki 1.43.8 Updater

Your composer.lock file is up to date with current dependencies!
Going to run database updates for wiki_el_db-rHb3
Depending on the size of your database this may take a while!
Abort with control-c in the next five seconds (skip this countdown with --quick) ...0
Updating category collations...
Selecting next 100 pages from cl_from = 0... processing... 0 done.
0 rows processed
...done.
Modifying rd_title field of table redirect...Wikimedia\Rdbms\DBQueryError from line 1198 of /usr/share/mediawiki/includes/libs/rdbms/database/Database.php: Error 1142: ALTER command denied to user 'wiki_el_user'@'localhost' for table `wiki_el_db`.`rHb3redirect`
Function: Wikimedia\Rdbms\Database::sourceFile( /usr/share/mediawiki/maintenance/archives/patch-redirect-rd_title-varbinary.sql )
Query: ALTER TABLE `rHb3redirect` MODIFY rd_title VARBINARY(255) NOT NULL default '',
 MODIFY rd_fragment VARBINARY(255) default NULL


#0 /usr/share/mediawiki/includes/libs/rdbms/database/Database.php(1182): Wikimedia\Rdbms\Database->getQueryException()
#1 /usr/share/mediawiki/includes/libs/rdbms/database/Database.php(1156): Wikimedia\Rdbms\Database->getQueryExceptionAndLog()
#2 /usr/share/mediawiki/includes/libs/rdbms/database/Database.php(647): Wikimedia\Rdbms\Database->reportQueryError()
#3 /usr/share/mediawiki/includes/libs/rdbms/database/Database.php(2791): Wikimedia\Rdbms\Database->query()
#4 /usr/share/mediawiki/includes/libs/rdbms/database/Database.php(2729): Wikimedia\Rdbms\Database->sourceStream()
#5 /usr/share/mediawiki/includes/libs/rdbms/database/DBConnRef.php(127): Wikimedia\Rdbms\Database->sourceFile()
#6 /usr/share/mediawiki/includes/libs/rdbms/database/DBConnRef.php(799): Wikimedia\Rdbms\DBConnRef->__call()
#7 /usr/share/mediawiki/includes/installer/DatabaseUpdater.php(797): Wikimedia\Rdbms\DBConnRef->sourceFile()
#8 /usr/share/mediawiki/includes/installer/DatabaseUpdater.php(1074): MediaWiki\Installer\DatabaseUpdater->applyPatch()
#9 /usr/share/mediawiki/includes/installer/DatabaseUpdater.php(595): MediaWiki\Installer\DatabaseUpdater->modifyField()
#10 /usr/share/mediawiki/includes/installer/DatabaseUpdater.php(548): MediaWiki\Installer\DatabaseUpdater->runUpdates()
#11 /usr/share/mediawiki/maintenance/update.php(195): MediaWiki\Installer\DatabaseUpdater->doUpdates()
#12 /usr/share/mediawiki/maintenance/includes/MaintenanceRunner.php(703): UpdateMediaWiki->execute()
#13 /usr/share/mediawiki/maintenance/run.php(51): MediaWiki\Maintenance\MaintenanceRunner->run()
#14 {main}
root@mail:/var/www/html/wiki.eco-libre.org# 
  1. alright, this worked
root@mail:/var/www/html/wiki.eco-libre.org# sudo -u www-data php /usr/share/mediawiki/maintenance/run.php update --dbuser wiki_el_superuser --dbpass REDACTED
...
done.
Purging caches...done.

Done in 8.3 s.
root@mail:/var/www/html/wiki.eco-libre.org# 
    1. after that, I tried to login. it worked
    2. I expected to be sent to some 2fa registration page, but that didn't happen. it was just like any normal login
    3. I went to special pages to see if I could get it to yell at me to enable 2fa, but that didn't happen
      1. I only see the following bold options on /wiki/Special:SpecialPages (usually admin page). I wonder if this is a subset because the others are just hidden since I don't have 2FA setup? https://wiki.eco-libre.org/wiki/Special:SpecialPages
        1. Manage Two-Factor Authentication, Watchlist, Upload file, Change content model of a page
    4. anyway, I went to "Manage Two-factor authentication" https://wiki.eco-libre.org/wiki/Special:AccountSecurity
    5. I clicked the "Enable" button under TOTP
    6. I scanned the code. It entered it in my TOTP app as "Eco-Libre" – that's not ideal. It should say "Eco-Libre Wiki"
    7. So I updated the LocalSettings.php config with
# This is the name that the entry will have in the user's TOTP app
$wgOATHAuthAccountPrefix='Eco-Libre Wiki';
    1. anyway, I was able to finish the 2FA enrollment process
    2. I went back to SpecialPages, and already I see a *ton* more SpecialPages in bold. So it looks like that restriction worked. Currently I have access to
      1. Unwateched pages, Block user, Create account, Delete user contributions, Disable user's two-factor authentication, Rename user, Unblock user, Verify two-factor authentication status, Watchlist, Upload file, Replace text, Change content model of a page, Import pages, Mass delete, Merge page histories, and View deleted pages.
    3. I also have a notifcation "Two-factor authenication has been enabeld on your account. If you did not do this, your account may have been comprimised."
    4. I logged-out
    5. I logged-in.
      1. First I teted it with 6 zeros (bullshit code), and it rejected it
      2. next I entered the real OTP from my app; it worked
    6. ok, this extension is done.
  1. ...
  2. probably the next-most important one is ConfirmAccount.
    1. Honestly I don't know if I'll use this, as I decided it's better to raise the barrier of entry on the wiki to users that have passed the Eco-Libre test (which is itself very accessible, but it does allow for a onboarding & alignment process that should eliminate spam issues that most wikis have)
    2. perhaps if I can set it up to email the applicant a link to the "volunteer test" docs, that would be helpful to funnel wiki users into the proper volunteer join workflow..
  3. first let me copy the extensions; I ran these commands to put them in-place (yet still deactivated)
rsync -av --progress ./ConfirmAccount /var/www/html/wiki.eco-libre.org/htdocs/extensions/
rsync -av --progress ./SmiteSpam /var/www/html/wiki.eco-libre.org/htdocs/extensions/
rsync -av --progress ./DeleteBatch /var/www/html/wiki.eco-libre.org/htdocs/extensions/
rsync -av --progress ./UserMerge /var/www/html/wiki.eco-libre.org/htdocs/extensions/
rsync -av --progress ./Widgets /var/www/html/wiki.eco-libre.org/htdocs/extensions/
rsync -av --progress ./OATHAuth /var/www/html/wiki.eco-libre.org/htdocs/extensions/
fix_web_permissions.sh
    1. that finished
  1. ok, here's the ConfirmAccount https://www.mediawiki.org/wiki/Extension:ConfirmAccount
    1. hmmm...it says we should use cache type CACHE_DB https://www.mediawiki.org/wiki/Extension:ConfirmAccount#Installation
wfLoadExtension( 'ConfirmAccount' );
$wgSessionCacheType = CACHE_DB; // Avoids stale session state across requests.
$wgGroupPermissions['*']['createaccount'] = false; // REQUIRED to enforce account requests
$wgGroupPermissions['bureaucrat']['createaccount'] = true; // Optional to allow account creation by this trusted user group
        1. I can't find elsewhere that says this specific cache type is requried. We're using APC, which I think is supposed to be more preformant than
      1. I checked the OSE LocalSettings.php config, and it also uses ConfirmAccount *and* CACHE_ACCEL (APC), so surely it's fine
      2. but it also used a bunch of other optimiazations, some of which are necessary for varnish caching
#################
# VARNISH CACHE #
#################

# note that these are named "squid" for historical reasons: wikipedia used to
# use squid, now they use varnish. They say "squid," but also apply to varnish
# * https://www.mediawiki.org/wiki/Manual:Configuration_settings#Squid

# See this guide for more info:
#  * https://www.mediawiki.org/wiki/Manual:Varnish_caching

#$wgUseSquid = true;
#$wgSquidServers = array('opensourceecology.org');
#$wgSquidServersNoPurge = array('127.0.0.1');

$wgUseSquid = true;
$wgSquidServers = array( '127.0.0.1:6081' );
$wgUsePrivateIPs = true;

#################
# OPTIMIZATIONS #
#################

# See these links for more info:
#  * https://www.mediawiki.org/wiki/Manual:Performance_tuning
#  * https://www.mediawiki.org/wiki/Manual:Caching
#  * https://www.mediawiki.org/wiki/User:Aaron_Schulz/How_to_make_MediaWiki_fast

# INTERNAL MEDIAWIKI CACHE OPTIONS (DISTINCT FROM VARNISH)

# MainCache and MessageCache should use APCU per Aaron Schulz
$wgMainCacheType = CACHE_ACCEL;

# note that if message cache uses the db (per defaults), then it may make every
# page load include a db change, which causes mediawiki to emmit a set-cookie
# for cpPosTime. The cookie's presence coming from the backend causes varnish
# not to cache the page (rightfully so), and the result is that varnish (which
# is our most important cache) is rendered useless. For more info, see:
#  * https://www.mediawiki.org/wiki/Topic:U9fys4phj04a85vu
#  * https://wiki.opensourceecology.org/wiki/Maltfield_log_2018#Thr_Mar_15.2C_2018
$wgMessageCacheType = CACHE_ACCEL;
$wgUseLocalMessageCache = true;

# Parser Cache should still use the DB per Aaron Schulz
$wgParserCacheType = CACHE_DB;

# enable caching navigation sidebar per Aaron Schulz
$wgEnableSidebarCache = true;

# cache interface messages to files in this directory per Aaron Schulz
# note that this should be outside the docroot!
$wgCacheDirectory = "$IP/../cache";

# OTHER OPTIMIZATIONS

# decrease db-heavy features per Aaron Schulz
$wgMiserMode = true;

# Causes serious encoding problems
$wgUseGzip = false;
    1. I added this to our LocalSettings.php, except I hard-coded the wgCacheDirectory to '/var/www/html/wiki.eco-libre.org/cache'
    2. here's the ConfirmAccounts-related (and ConfirmEdit-related) config from OSE's LocalSettings.php
# ConfirmAccount
# This extension and directory requires an admin to confirm a user before their 
account is created

require_once "$IP/extensions/ConfirmAccount/ConfirmAccount.php";
$wgFileStore['accountreqs'] = "$IP/images/ConfirmAccount";
$wgFileStore['accountcreds'] = "$IP/images/ConfirmAccount";
$wgConfirmAccountContact = 'REDACTED@opensourceecology.org';


# ConfirmEdit
# reCaptcha settings and keys

wfLoadExtensions([ 'ConfirmEdit', 'ConfirmEdit/ReCaptcha' ]);
#$wgCaptchaClass = 'ReCaptcha';
$wgCaptchaClass = 'SimpleCaptcha';
#$wgCaptchaClass = 'QuestyCaptcha';

#$wgReCaptchaPublicKey = 'REDACTED';
#$wgReCaptchaPrivateKey = 'REDACTED';
$wgReCaptchaPublicKey = 'REDACTED';
$wgReCaptchaPrivateKey = 'REDACTED';

# https://www.google.com/recaptcha/admin/site?siteid=REDACTED - old style
#$recaptcha_public_key = 'REDACTED';
#$recaptcha_private_key = 'REDACTED';

$wgGroupPermissions['*'            ]['skipcaptcha'] = false;
$wgGroupPermissions['user'         ]['skipcaptcha'] = true;
$wgGroupPermissions['autoconfirmed']['skipcaptcha'] = true;
$wgGroupPermissions['bot'          ]['skipcaptcha'] = true; // registered bots
$wgGroupPermissions['sysop'        ]['skipcaptcha'] = true;

# Allow admins to approve (and unapprove) users via Special:UserRights
$wgAddGroups['sysop']['approved'] = true;
$wgRemoveGroups['sysop']['approved'] = true;
    1. of note is that I was planning on moving OSE from recaptcha to FancyCaptcha https://wiki.opensourceecology.org/wiki/CHG-2025-XX-XX_migrate_wiki_to_hetzner3
# re-enable ConfirmEdit and switch to FancyCaption
grep 'FancyCaptcha' ${vhostDir}/LocalSettings.php || perl -0777 -pi -e "s%\\\$wgCaptchaClass = 'SimpleCaptcha';%\#\\\$wgCaptchaClass = 'SimpleCaptcha';\n\nwfLoadExtensions([ 'ConfirmEdit', 'ConfirmEdit/FancyCaptcha' ]);\n\\\$wgCaptchaDirectory = '/var/www/html/wiki.opensourceecology.org/htdocs/images/captcha/';\n\\\$wgCaptchaSecret = '$wgCaptchaSecret';\n%igs" ${vhostDir}/LocalSettings.php
    1. oh shit, there's a known issue with ConfirmAccounts that it doesn't work at all on mediawiki v1.43. it was opened a year ago X_x https://www.mediawiki.org/wiki/Extension:ConfirmAccount#Known_issues
      1. well, hopefully that gets fixed before we upgrade to the latest LTS?
    2. ok, I'm just going to add this to LocalSettings.php
# configure ConfirmAccount. See also:
# * https://www.mediawiki.org/wiki/Extension:ConfirmAccount
# * https://wiki.eco-libre.org/wiki/Maltfield_Log/2026
wfLoadExtension( 'ConfirmAccount' );

# REQUIRED to enforce account requests
$wgGroupPermissions['*']['createaccount'] = false;
    1. and, per the wiki extensions' page, I ran the update script
root@mail:/var/www/html/wiki.eco-libre.org# sudo -u www-data php /usr/share/mediawiki/maintenance/run.php update --dbuser wiki_el_superuser --dbpass REDACTED
...
...Update 'MediaWiki\Maintenance\FixAutoblockLogTitles' already logged as completed. Use --force to run it again.
Purging caches...done.

Done in 2.2 s.
root@mail:/var/www/html/wiki.eco-libre.org# 
    1. I went to the SpecialPages, I now see "ConfirmAccounts Requests" https://wiki.eco-libre.org/wiki/Special:ConfirmAccounts
    2. Now, in a tor browser where I'm *not* logged-in, I can click on "Anonymous" in the top-right and click on "Request account" https://wiki.eco-libre.org/wiki/Special:RequestAccount
    3. there's this weird thing that people have to agree to the ToS *and* that their real name is real.
      1. that first one is reasonable (though we haven't written a ToS yet)
      2. that second one is dumb. why wouldn't we let users contribute anonymously?
        1. so I edited the LocalSettings.php with this
# we let folks contribute under pseudonyms 
$wgConfirmAccountRequestFormItems = [
   'UserName'        => [ 'enabled' => true ],
   'RealName'        => [ 'enabled' => false ],
   'Biography'       => [ 'enabled' => false, 'minWords' => 50 ],
   'AreasOfInterest' => [ 'enabled' => true ],
   'CV'              => [ 'enabled' => true ],
   'Notes'           => [ 'enabled' => true ],
   'Links'           => [ 'enabled' => true ],
   'TermsOfService'  => [ 'enabled' => true ],
 ];
    1. ugh, it still has the same text about the "Real Name" – even after we disabled it
    2. looks like I need to create a wiki arrticle with the text that I want here https://wiki.eco-libre.org/wiki/MediaWiki:Requestaccount-text
      1. so the default text for this article is
'Complete and submit the following form to request a user account'.

Make sure that you first read the Terms of Service before requesting an account.

Once the account is approved, you will be emailed a notification message and the account will be usable at login.
      1. what I want is the "accept" text, which replaces this
I have read and agree to abide by the Terms of Service of Eco-Libre. The name I have specified under "Real name" is in fact my own real name.
      1. here's a list of all the system messages, according to the extensions wiki page https://www.mediawiki.org/wiki/Extension:ConfirmAccount#Minimal
        1. requestaccount-text, requestaccount-notes, requestaccount-ext-text, requestaccount-acc-text
          1. this is not it https://wiki.eco-libre.org/wiki/MediaWiki:Requestaccount-acc-text
A confirmation message will be sent to your email address once you submit this request. The address will not be published. Please respond by clicking on the confirmation link provided by the email. Finally, your password will be emailed to you when your account is created. 
        1. nor this https://wiki.eco-libre.org/wiki/MediaWiki:Requestaccount-ext-text
The following information is kept private and will only be used for this request. You may want to list contacts such a phone number to aid in identify confirmation. 
      1. I just searched the string, and found this
root@mail:/var/www/html/wiki.eco-libre.org# grep -irl 'is in fact my own real name' *
cache/l10n_cache-en.cdb
htdocs/extensions/ConfirmAccount/i18n/requestaccount/en.json
root@mail:/var/www/html/wiki.eco-libre.org# 
        1. so it looks like we need to edit one of these
root@mail:/var/www/html/wiki.eco-libre.org# grep -i 'real name' htdocs/extensions/ConfirmAccount/i18n/requestaccount/en.json
		"requestaccount-real": "Real name (optional):",
		"requestaccount-real-i": "Real name is optional. If you choose to provide it, this will be used for giving the user attribution for their work.",
		"requestaccount-same": "(same as real name below)",
		"requestaccount-agree": "You must certify that your real name is correct and that you agree to our Terms of Service.",
		"requestaccount-tos": "I have read and agree to abide by the [[{{MediaWiki:Requestaccount-page}}|Terms of Service]] of {{SITENAME}}.\nThe name I have specified under \"Real name\" is in fact my own real name.",
root@mail:/var/www/html/wiki.eco-libre.org# 
        1. I edited these two pages
          1. https://wiki.eco-libre.org/wiki/MediaWiki:Requestaccount-tos
          2. https://wiki.eco-libre.org/wiki/MediaWiki:Requestaccount-agree
      1. that worked; the agree text changed when I refresh the RequsetAccount form in tor browser
      2. I entered the min inforamtion, and got this response
Your account request has been sent and is now pending review. A confirmation email has been sent to your email address.

Return to Main Page.
        1. curiously, that means it didn't force me to enter a CV, bio, or the list of websites
        2. I also got an email from noreply@eco-libre.org. It just basically asked me to click an email. Good GDPR compliance.
          1. wait, I refreshed the special page as admin. it shows-up for review. so I guess not GDPR compliant :(
          2. also the ip address listed is 127.0.0.1. Perhaps I need to configure MediaWiki to process X-Forwarded-For headers
      1. I changed 'false' to 'true' for the biography; now it appears again
$wgConfirmAccountRequestFormItems = [
   'UserName'        => [ 'enabled' => true ],
   'RealName'        => [ 'enabled' => false ],
   'Biography'       => [ 'enabled' => true, 'minWords' => 50 ],
   'AreasOfInterest' => [ 'enabled' => true ],
   'CV'              => [ 'enabled' => true ],
   'Notes'           => [ 'enabled' => true ],
   'Links'           => [ 'enabled' => true ],
   'TermsOfService'  => [ 'enabled' => true ],
 ];
    1. the workflow is for, after being approved, the system emails the passowrd. that's not very secure. we should, at least, make sure to require the user to change their password on first login
      1. I was looking for a way to force users to change their password on first login, but I first found this in the OSE config
#############
# HARDENING #
#############

$wgSecureLogin = true;
$wgSecretKey = 'REDACTED';

# PASSWORD POLICIES

$wgPasswordPolicy['policies']['default']['MinimalPasswordLength'] = 10;
$wgPasswordPolicy['policies']['default']['PasswordCannotBePopular'] = PHP_INT_MAX;
$wgPasswordPolicy['policies']['default']['PasswordCannotMatchUsername'] = true;

$wgPasswordPolicy['policies']['sysop']['MinimalPasswordLength'] = 20
      1. I added this to stack exchange https://webapps.stackexchange.com/questions/182290/how-to-force-new-users-to-reset-their-password-mediawiki
  1. TODO: figure-out how to force new users to change their password, if it was auto-generated by mediawiki
  2. TODO: create ToS page https://wiki.eco-libre.org/wiki/Eco-Libre:Terms_of_Service
  3. TODO: figure-out how to make mediawiki see the IP as X-Forwarded-For (to play nice with nginx->varnish->apache)
  4. TODO: finish activating & configuring the remaining "new" extensions

2026-04-17

  1. shit, we're getting a 500 error on the wiki today
[user@disp3459 ~]$ curl -iL https://wiki.eco-libre.org
HTTP/1.1 500 Internal Server Error
Server: nginx
Date: Sat, 18 Apr 2026 00:57:02 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 0
Connection: keep-alive
X-Content-Type-Options: nosniff
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
X-Request-Id: REDACTED
X-Frame-Options: SAMEORIGIN
Set-Cookie: mw_installer_session=REDACTED; path=/; secure; HttpOnly; SameSite=Strict;HttpOnly;Secure
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
X-Frame-Options: deny
Referrer-Policy: strict-origin
X-Varnish: 18804052
Age: 0
Via: 1.1 mail (Varnish/7.7)

[user@disp3459 ~]$ 
  1. looks like open_basedir?
[Sat Apr 18 00:59:28.202275 2026] [proxy_fcgi:error] [pid 3214280:tid 3214323] [client 127.0.0.1:0] AH01071: Got error 'PHP message: PHP Warning:  is_readable(): open_basedir restriction in effect. File(/usr/share/mediawiki/LocalSettings.php) is not within the allowed path(s): (...) in /usr/share/mediawiki/includes/Output/NoLocalSettings.php on line 59; PHP message: PHP Fatal error:  Uncaught Error: Call to undefined function Wikimedia\\ObjectCache\\ini_set() in /usr/share/mediawiki/includes/libs/objectcache/APCUBagOStuff.php:55\nStack trace:\n#0 /usr/share/mediawiki/includes/utils/FileContentsHasher.php(37): Wikimedia\\ObjectCache\\APCUBagOStuff->construct()\n#1 /usr/share/mediawiki/includes/utils/FileContentsHasher.php(47): FileContentsHasher->construct()\n#2 /usr/share/mediawiki/includes/utils/FileContentsHasher.php(93): FileContentsHasher::singleton()\n#3 /usr/share/mediawiki/includes/Html/TemplateParser.php(271): FileContentsHasher::getFileContentsHash()\n#4 /usr/share/mediawiki/includes/Html/TemplateParser.php(173): MediaWiki\\Html\\TemplateParser->compile()\n#5 /usr/share/mediawiki/includes/Html/TemplateParser.php(296): MediaWiki\\Html\\TemplateParser->getTemplate()\n#6 /usr/share/mediawiki/includes/Output/NoLocalSettings.php(54): MediaWiki\\Html\\TemplateParser->processTemplate()\n#7 /usr/share/mediawiki/includes/WebStart.php(51): require_once('...')\n#8...'
  1. it's just a symlink to a symlink to a non-existant file. is that the issue?
root@mail:/usr/share/mediawiki/includes/libs/rdbms/database# ls -lah /usr/share/mediawiki/LocalSettings.php
lrwxrwxrwx 1 root root 36 Apr 10 22:17 /usr/share/mediawiki/LocalSettings.php -> /var/lib/mediawiki/LocalSettings.php
root@mail:/usr/share/mediawiki/includes/libs/rdbms/database# ls -lah /var/lib/mediawiki/LocalSettings.php
lrwxrwxrwx 1 root root 32 Apr 10 22:17 /var/lib/mediawiki/LocalSettings.php -> /etc/mediawiki/LocalSettings.php
root@mail:/usr/share/mediawiki/includes/libs/rdbms/database# ls -lah /etc/mediawiki/LocalSettings.php
ls: cannot access '/etc/mediawiki/LocalSettings.php': No such file or directory
root@mail:/usr/share/mediawiki/includes/libs/rdbms/database# 
  1. wtf. the file is here, but it's not here?
root@mail:/var/lib/mediawiki# ls LocalSettings.php 
LocalSettings.php
root@mail:/var/lib/mediawiki# cat LocalSettings.php 
cat: LocalSettings.php: No such file or directory
root@mail:/var/lib/mediawiki# 
  1. oh, it's because it's a symlink
root@mail:/var/lib/mediawiki# ls -lah /var/www/html/wiki.eco-libre.org/htdocs/LocalSettings.php 
lrwxrwxrwx 1 root root 32 Apr 10 22:17 /var/www/html/wiki.eco-libre.org/htdocs/LocalSettings.php -> /etc/mediawiki/LocalSettings.php
root@mail:/var/lib/mediawiki# cat /var/www/html/wiki.eco-libre.org/htdocs/LocalSettings.php 
cat: /var/www/html/wiki.eco-libre.org/htdocs/LocalSettings.php: No such file or directory
root@mail:/var/lib/mediawiki# 
  1. that definitely was a file before. I set it to just require() the real file from one dir up (outside the docroot). but why is it gone now? could it have been deleted by a security upgrade in apt? unattended-upgrades perhaps?
    1. well, that's a match
root@mail:/var/log/unattended-upgrades# grep -irl mediawiki *
unattended-upgrades-dpkg.log
unattended-upgrades.log
root@mail:/var/log/unattended-upgrades# 
  1. yeah, it looks like we upgraded on 2026-04-13. That was Monday. Today is Friday.
root@mail:/var/log/unattended-upgrades# grep -ir mediawiki *
unattended-upgrades-dpkg.log:Preparing to unpack .../mediawiki_1%3a1.43.8+dfsg-1~deb13u1_all.deb ...
unattended-upgrades-dpkg.log:Unpacking mediawiki (1:1.43.8+dfsg-1~deb13u1) over (1:1.43.6+dfsg-1~deb13u1) ...
unattended-upgrades-dpkg.log:Preparing to unpack .../mediawiki-classes_1%3a1.43.8+dfsg-1~deb13u1_all.deb ...
unattended-upgrades-dpkg.log:Unpacking mediawiki-classes (1:1.43.8+dfsg-1~deb13u1) over (1:1.43.6+dfsg-1~deb13u1) ...
unattended-upgrades-dpkg.log:Setting up mediawiki-classes (1:1.43.8+dfsg-1~deb13u1) ...
unattended-upgrades-dpkg.log:Setting up mediawiki (1:1.43.8+dfsg-1~deb13u1) ...
unattended-upgrades-dpkg.log:apache2_invoke mediawiki: already enabled
unattended-upgrades-dpkg.log:mediawiki-jobrunner.service is a disabled or a static unit not running, not starting it.
unattended-upgrades.log:2026-04-13 06:07:02,546 INFO Packages that will be upgraded: mediawiki mediawiki-classes
root@mail:/var/log/unattended-upgrades# 
  1. mediawiki announced two releases on 2026-04-01. One was a normal maintenance release (1.43.8). One was a security release (1.43.7)
    1. https://lists.wikimedia.org/hyperkitty/list/mediawiki-announce@lists.wikimedia.org/thread/DIBLSBHISKX6NFRUFNOGZRVW42E7R2QP/
    2. https://lists.wikimedia.org/hyperkitty/list/mediawiki-announce@lists.wikimedia.org/thread/6VW6OGVSC7LO3QUMBEZOPQFYYOFDJ452/
  2. well, it's good that we confirmed that securty updates are getting automatically installed.
  3. ok, well, obviously we need to follow the debian-way and put the LocalSettings.php file in /etc/.\
    1. I did that
root@mail:/var/lib/mediawiki# cat /etc/mediawiki/LocalSettings.php
<?php
# including separate file that contains the database password so that it is not stored within the document root.
# For more info see:
#  * https://tech.michaelaltfield.net/2020/02/14/phplist-hardening-security/
#  * https://www.mediawiki.org/wiki/Manual:Security
#  * https://wiki.r00tedvw.com/index.php/Mediawiki/Hardening
 
#$docRoot = dirname( $_SERVER['DOCUMENT_ROOT'] );
#require_once "$docRoot/LocalSettings.php";

# docRoot didn't work for all of:
#  1. php-fpm (the normal website)
#  2. cli
#  3. the fact that we're in /var/lib/mediawiki due to debian's install symlink
#
# ...so I'm just hardcoding the path to LocalSettings.php, so it always works!

require_once( "/var/www/html/wiki.eco-libre.org/LocalSettings.php" );
?>
root@mail:/var/lib/mediawiki# 
  1. I tried the site; it's still broken
  2. I cleared varnish cache; it's still broken
root@mail:/var/lib/mediawiki# varnishadm 'ban req.url ~ "."'

root@mail:/var/lib/mediawiki# 
  1. yeah, I think the problem is that I never added /etc/mediawiki into the basedir, because I wasn't using it there. Ugh.
  2. I don't like doing this, but there's nothing else there. should be fine
root@mail:/var/lib/mediawiki# ls -lah /etc/mediawiki/
total 20K
drwxr-xr-x   2 root root 4,0K Apr 18 01:16 .
drwxr-xr-x 120 root root  12K Apr 17 20:30 ..
-rw-r--r--   1 root root  741 Apr 18 01:16 LocalSettings.php
root@mail:/var/lib/mediawiki# 

2026-04-14

  1. Appropedia responded to me, indicating that they use Vector 2022 skin, with these config options https://wordpress.org/support/topic/support-for-automatic-exchange-rates-wp_http_block_external-2/#
:wfLoadSkin( 'Vector' );
:$wgDefaultSkin = 'vector-2022';
:$wgSkipSkins[] = 'vector'; // Disable old Vector
:$wgVectorResponsive = true;
:$wgVectorMaxWidthOptions['exclude']['mainpage'] = false;
:$wgVectorNightMode['logged_out'] = true;
:$wgDefaultUserOptions['vector-main-menu-pinned'] = 0;
:$wgDefaultUserOptions['vector-page-tools-pinned'] = 0;
:$wgDefaultUserOptions['vector-appearance-pinned'] = 0;
:$wgDefaultUserOptions['vector-toc-pinned'] = 0;
:$wgDefaultUserOptions['vector-font-size'] = 1;
  1. they said they use this extension for "read mode" which they developed themselves https://www.mediawiki.org/wiki/Extension:ReadMode

2026-04-13

  1. Here's TOFU 3/3 (Tor, exit in The Netherlands)
The Netherlands
	  Congratulations. This browser is configured to use Tor.
2026-04-13
######################################################################### 100.0%
2026-04-13
14M	OATHAuth-REL1_43-015a49e.tar.gz
9ee56e843931edd87b631b264d680e9f8d77f18b5ffdbc18b9a4f5b15330878e  OATHAuth-REL1_43-015a49e.tar.gz
user@host:/tmp/user/1000/tmp.eIvrMPff3B$ 

2026-04-10

  1. Here's TOFU 2/3 (VPN, exit in US)
United States
2026-04-10
######################################################################### 100.0%
2026-04-10
14M	OATHAuth-REL1_43-015a49e.tar.gz
9ee56e843931edd87b631b264d680e9f8d77f18b5ffdbc18b9a4f5b15330878e  OATHAuth-REL1_43-015a49e.tar.gz
user@disp5712:/tmp/tmp.oTeGPpTCzP$ 
  1. finally, they all match! great, that's our last extension

2026-04-09

  1. Here's TOFU 3/3 (ISP, exit in Ecuador)
Ecuador
2026-04-09
######################################################################### 100.0%
2026-04-09
4.0K	OATHAuth-REL1_43-967ccd4.tar.gz
8351c0267c2cd7866ff04c04261f06cd75af9a7130aac848ca43fd047404e229  OATHAuth-REL1_43-967ccd4.tar.gz
user@disp7124:/tmp/tmp.wlx3U02c6r$ 
  1. fuck, it's already unavailable; says 'libraryupgrader' from 3 hours ago >:0
  2. let's try again
REMOTE_FILES="https://extdist.wmflabs.org/dist/extensions/OATHAuth-REL1_43-015a49e.tar.gz"

CURL="/usr/bin/curl --retry 5 --retry-all-errors"
PYTHON="/usr/bin/python3"

# in tails, we must torify
if [[ "`whoami`" == "amnesia" ]] ; then
	CURL="/usr/bin/torify ${CURL}"
	PYTHON="/usr/bin/torify ${PYTHON}"
fi

tmpDir=`mktemp -d`
pushd "${tmpDir}"

# first get some info about our internet connection
${CURL} -s https://ifconfig.co/country | head -n1
${CURL} -s https://check.torproject.org | grep Congratulations | head -n1

# and today's date
date -u +"%Y-%m-%d"

# get the file
for file in ${REMOTE_FILES}; do
	${CURL} --progress-bar -O ${file}
done

# checksum
date -u +"%Y-%m-%d"
du -sh *
sha256sum *
  1. Here's TOFU 1/3 (ISP, exit in Ecuador)
Ecuador
2026-04-09
######################################################################### 100.0%
2026-04-09
14M	OATHAuth-REL1_43-015a49e.tar.gz
9ee56e843931edd87b631b264d680e9f8d77f18b5ffdbc18b9a4f5b15330878e  OATHAuth-REL1_43-015a49e.tar.gz
user@disp7124:/tmp/tmp.rGKb4qtHLX$ 


2026-04-08

  1. Here's TOFU 2/3 (VPN, exit in UK)
United Kingdom
2026-04-08
############################################################################## 100.0%
2026-04-08
14M	OATHAuth-REL1_43-967ccd4.tar.gz
5992bf6044ba5bd6404d51ec5bef936e6eb724576a2003fc176648c7fcf9c6b7  OATHAuth-REL1_43-967ccd4.tar.gz
user@disp6902:/tmp/tmp.KDMVCsn1cU$ 

2026-04-07

  1. here's TOFU 3/3 (Tor, exit in The Netherlands)
The Netherlands
	  Congratulations. This browser is configured to use Tor.
2026-04-07
####################################################################### 100.0%
####################################################################### 100.0%
####################################################################### 100.0%
2026-04-07
448K	ConfirmAccount-REL1_43-38c4602.tar.gz
124K	DeleteBatch-REL1_43-b3b052b.tar.gz
4.0K	OATHAuth-REL1_43-2cdbefb.tar.gz
95b2bc67977c22d069867a7225aa1a9720b7593ed5ab49aa27cc293f01b2e2bb  ConfirmAccount-REL1_43-38c4602.tar.gz
d1e7c01cf709f2b57137bb3d76f73b4e8fd36ce57c12b750b04fe20ffce9be61  DeleteBatch-REL1_43-b3b052b.tar.gz
8351c0267c2cd7866ff04c04261f06cd75af9a7130aac848ca43fd047404e229  OATHAuth-REL1_43-2cdbefb.tar.gz
user@host:/tmp/user/1000/tmp.qw9hrOvh3l$ 
  1. ok, well, we're 2/3 for that one. ConfirmAccount and DeleteBatch both have the same on all 3 TOFUs.
    1. But OATHAuth must have had a new release, because it's now 404
user@host:/tmp/user/1000/tmp.qw9hrOvh3l$ cat OATHAuth-REL1_43-2cdbefb.tar.gz 
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>
user@host:/tmp/user/1000/tmp.qw9hrOvh3l$ 
  1. I checked the changelog. looks like this extension is getting updated almost every 1-2 days from "Translation updater bot" – that's terrible. We need three consecutive days of no changes for 3TOFU https://www.mediawiki.org/wiki/Extension:OATHAuth
    1. hmm, well, if I look back further, there was a gap of 2 months before the update 6 days ago. So there certainly is *some* stability.
    2. also, that was *all* commits. This one limits to just the 1.43 branch, which is what we want https://gerrit.wikimedia.org/r/plugins/gitiles/mediawiki/extensions/OATHAuth/+log/refs/heads/REL1_43
      1. hmm, that one shows the last update was 10 hours ago, and the one before that was 2 months ago (Jan 22). That would be fine, but didn't we have two consecutive 3TOFUs fail on us?
      2. oh, wait, woah. the commits are out of order! First it shows "10 hours ago" and then "2 months ago" and then "7 days ago" wtf!
gerrit.wikimedia.org / mediawiki / extensions / OATHAuth / refs/heads/REL1_43

	967ccd4 Localisation updates from https://translatewiki.net. by Translation updater bot · 10 hours ago REL1_43
	2cdbefb SECURITY: Don't leak user's lack of 2FA to other users by Roan Kattouw · 2 months ago
	bfcd5cf Localisation updates from https://translatewiki.net. by Translation updater bot · 7 days ago
	d8e7578 build: Updating npm dependencies by libraryupgrader · 12 days ago
	be14e83 Localisation updates from https://translatewiki.net. by Translation updater bot · 2 weeks ago
	77c70f5 build: Updating flatted to 3.4.2 by libraryupgrader · 3 weeks ago
	87d04d4 Localisation updates from https://translatewiki.net. by Translation updater bot · 3 weeks ago
	8e176b2 Localisation updates from https://translatewiki.net. by Translation updater bot · 4 weeks ago
	14596de Localisation updates from https://translatewiki.net. by Translation updater bot · 5 weeks ago
	8c7891a build: Updating ajv to 6.14.0, 8.18.0 by libraryupgrader · 6 weeks ago
	0406194 Localisation updates from https://translatewiki.net. by Translation updater bot · 6 weeks ago
	4c94235 Localisation updates from https://translatewiki.net. by Translation updater bot · 7 weeks ago
	7d0b2d7 Localisation updates from https://translatewiki.net. by Translation updater bot · 8 weeks ago
	a896cff Localisation updates from https://translatewiki.net. by Translation updater bot · 9 weeks ago
	b8e8afa Localisation updates from https://translatewiki.net. by Translation updater bot · 2 months ago
	4b3cb73 build: Updating lodash to 4.17.23 by libraryupgrader · 2 months ago
  1. well, it looks like the translator bot runs once per week. so we should have 6 days before that one changes again..
  2. anyway, here's our (hopefully last) 3TOFU script, just for OATHAuth
REMOTE_FILES="https://extdist.wmflabs.org/dist/extensions/OATHAuth-REL1_43-967ccd4.tar.gz"

CURL="/usr/bin/curl --retry 5 --retry-all-errors"
PYTHON="/usr/bin/python3"

# in tails, we must torify
if [[ "`whoami`" == "amnesia" ]] ; then
	CURL="/usr/bin/torify ${CURL}"
	PYTHON="/usr/bin/torify ${PYTHON}"
fi

tmpDir=`mktemp -d`
pushd "${tmpDir}"

# first get some info about our internet connection
${CURL} -s https://ifconfig.co/country | head -n1
${CURL} -s https://check.torproject.org | grep Congratulations | head -n1

# and today's date
date -u +"%Y-%m-%d"

# get the file
for file in ${REMOTE_FILES}; do
	${CURL} --progress-bar -O ${file}
done

# checksum
date -u +"%Y-%m-%d"
du -sh *
sha256sum *
  1. and TOFU 1/3 (Tor, exit in The Netherlands)
The Netherlands
	  Congratulations. This browser is configured to use Tor.
2026-04-07
####################################################################### 100.0%
2026-04-07
14M	OATHAuth-REL1_43-967ccd4.tar.gz
5992bf6044ba5bd6404d51ec5bef936e6eb724576a2003fc176648c7fcf9c6b7  OATHAuth-REL1_43-967ccd4.tar.gz
user@host:/tmp/user/1000/tmp.RBxv6XdjXd$ 

2026-04-06

  1. here's TOFU 2/3 (VPN, exit in Germany)
Germany
2026-04-06
#################################################################################### 100.0%
#################################################################################### 100.0%
#################################################################################### 100.0%
2026-04-06
448K	ConfirmAccount-REL1_43-38c4602.tar.gz
124K	DeleteBatch-REL1_43-b3b052b.tar.gz
14M	OATHAuth-REL1_43-2cdbefb.tar.gz
95b2bc67977c22d069867a7225aa1a9720b7593ed5ab49aa27cc293f01b2e2bb  ConfirmAccount-REL1_43-38c4602.tar.gz
d1e7c01cf709f2b57137bb3d76f73b4e8fd36ce57c12b750b04fe20ffce9be61  DeleteBatch-REL1_43-b3b052b.tar.gz
f71115af96a1ed5297d8d56f56683635b7c9e0b8b32151b184feea1fbec3350a  OATHAuth-REL1_43-2cdbefb.tar.gz
user@disp8963:/tmp/tmp.JNwdKPbQIW$ 

2026-04-01

  1. continuing with the wiki setup today
  2. I saw our db partition reached 90%. It's been growing slowly, but adding mediawiki to the server didn't help, so I spent some time expanding the disks. Now we're down to 48% usage on the db partition, and everything else is hovering around 60% used, +/- 5%
  3. here's our last TOFU on the mediawiki extensions
    1. TOFU 3/3 (ISP, exit in Ecuador)
Ecuador
2026-04-01
######################################################################### 100.0%
######################################################################### 100.0%
######################################################################### 100.0%
######################################################################### 100.0%
######################################################################### 100.0%
######################################################################### 100.0%
2026-04-01
4.0K	ConfirmAccount-REL1_43-9cc1a82.tar.gz
4.0K	DeleteBatch-REL1_43-24a81e4.tar.gz
4.0K	OATHAuth-REL1_43-d8e7578.tar.gz
108K	SmiteSpam-REL1_43-483b81b.tar.gz
140K	UserMerge-REL1_43-27425da.tar.gz
492K	Widgets-REL1_43-60a09f0.tar.gz
8351c0267c2cd7866ff04c04261f06cd75af9a7130aac848ca43fd047404e229  ConfirmAccount-REL1_43-9cc1a82.tar.gz
8351c0267c2cd7866ff04c04261f06cd75af9a7130aac848ca43fd047404e229  DeleteBatch-REL1_43-24a81e4.tar.gz
8351c0267c2cd7866ff04c04261f06cd75af9a7130aac848ca43fd047404e229  OATHAuth-REL1_43-d8e7578.tar.gz
997c9edfe7ab78d6e1f1268d48ec19f13d036f584ad54c4281e210940a59f7c9  SmiteSpam-REL1_43-483b81b.tar.gz
5f28fdf7c0b727d699d42f14073359e13c8db1b2d389d78219845b5912cc0ccc  UserMerge-REL1_43-27425da.tar.gz
bed64d3c98842f7ec3675e17a24c21fb4720862084857e6834fb7813d14ab865  Widgets-REL1_43-60a09f0.tar.gz
user@disp7799:/tmp/tmp.YkN2s6MgT6$ 

  1. huh, 3TOFU failed for 3/5 of the extensions
    1. SmiteSpam, UserMerge, and Widgets matched on all three
    2. but ConfirmAccount, DeleteBatch, and OATHAuthOATHAuth diff'd
  2. I see that the file size of the three that failed is "4.0K". that suggests that it didn't actually download
  3. sure enough, they're 404'd
user@disp7799:/tmp/tmp.YkN2s6MgT6$ cat ConfirmAccount-REL1_43-9cc1a82.tar.gz
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>
user@disp7799:/tmp/tmp.YkN2s6MgT6$ 
user@disp7799:/tmp/tmp.YkN2s6MgT6$ cat DeleteBatch-REL1_43-24a81e4.tar.gz
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>
user@disp7799:/tmp/tmp.YkN2s6MgT6$ 
user@disp7799:/tmp/tmp.YkN2s6MgT6$ cat OATHAuth-REL1_43-d8e7578.tar.gz
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>
user@disp7799:/tmp/tmp.YkN2s6MgT6$ 
  1. if I go to download these plugins again, here's the URLs I get
    1. ConfirmAccount https://www.mediawiki.org/wiki/Extension:ConfirmAccount
      1. https://extdist.wmflabs.org/dist/extensions/ConfirmAccount-REL1_43-38c4602.tar.gz
    2. DeleteBatch https://www.mediawiki.org/wiki/Extension:ConfirmAccount
      1. https://extdist.wmflabs.org/dist/extensions/DeleteBatch-REL1_43-b3b052b.tar.gz
    3. OATHAuth https://www.mediawiki.org/wiki/Extension:OATHAuth
      1. https://extdist.wmflabs.org/dist/extensions/OATHAuth-REL1_43-2cdbefb.tar.gz
  2. here's our old 3TOFU script, for comparison
REMOTE_FILES="https://extdist.wmflabs.org/dist/extensions/ConfirmAccount-REL1_43-9cc1a82.tar.gz https://extdist.wmflabs.org/dist/extensions/DeleteBatch-REL1_43-24a81e4.tar.gz https://extdist.wmflabs.org/dist/extensions/OATHAuth-REL1_43-d8e7578.tar.gz https://extdist.wmflabs.org/dist/extensions/SmiteSpam-REL1_43-483b81b.tar.gz https://extdist.wmflabs.org/dist/extensions/UserMerge-REL1_43-27425da.tar.gz https://extdist.wmflabs.org/dist/extensions/Widgets-REL1_43-60a09f0.tar.gz"

CURL="/usr/bin/curl --retry 5 --retry-all-errors"
PYTHON="/usr/bin/python3"

# in tails, we must torify
if [[ "`whoami`" == "amnesia" ]] ; then
	CURL="/usr/bin/torify ${CURL}"
	PYTHON="/usr/bin/torify ${PYTHON}"
fi

tmpDir=`mktemp -d`
pushd "${tmpDir}"

# first get some info about our internet connection
${CURL} -s https://ifconfig.co/country | head -n1
${CURL} -s https://check.torproject.org | grep Congratulations | head -n1

# and today's date
date -u +"%Y-%m-%d"

# get the file
for file in ${REMOTE_FILES}; do
	${CURL} --progress-bar -O ${file}
done

# checksum
date -u +"%Y-%m-%d"
du -sh *
sha256sum *
  1. so, yeah, I guess they delete the old releases when the push a new one? that's pretty annoying
https://extdist.wmflabs.org/dist/extensions/ConfirmAccount-REL1_43-9cc1a82.tar.gz
https://extdist.wmflabs.org/dist/extensions/ConfirmAccount-REL1_43-38c4602.tar.gz

https://extdist.wmflabs.org/dist/extensions/DeleteBatch-REL1_43-24a81e4.tar.gz
https://extdist.wmflabs.org/dist/extensions/DeleteBatch-REL1_43-b3b052b.tar.gz

https://extdist.wmflabs.org/dist/extensions/OATHAuth-REL1_43-d8e7578.tar.gz
https://extdist.wmflabs.org/dist/extensions/OATHAuth-REL1_43-2cdbefb.tar.gz
  1. anyway, let's try it again, and hope we get all three before they push another release in the next ~1 week
  2. here's a new 3TOFU script
REMOTE_FILES="https://extdist.wmflabs.org/dist/extensions/ConfirmAccount-REL1_43-38c4602.tar.gz https://extdist.wmflabs.org/dist/extensions/DeleteBatch-REL1_43-b3b052b.tar.gz https://extdist.wmflabs.org/dist/extensions/OATHAuth-REL1_43-2cdbefb.tar.gz"

CURL="/usr/bin/curl --retry 5 --retry-all-errors"
PYTHON="/usr/bin/python3"

# in tails, we must torify
if [[ "`whoami`" == "amnesia" ]] ; then
	CURL="/usr/bin/torify ${CURL}"
	PYTHON="/usr/bin/torify ${PYTHON}"
fi

tmpDir=`mktemp -d`
pushd "${tmpDir}"

# first get some info about our internet connection
${CURL} -s https://ifconfig.co/country | head -n1
${CURL} -s https://check.torproject.org | grep Congratulations | head -n1

# and today's date
date -u +"%Y-%m-%d"

# get the file
for file in ${REMOTE_FILES}; do
	${CURL} --progress-bar -O ${file}
done

# checksum
date -u +"%Y-%m-%d"
du -sh *
sha256sum *
  1. And TOFU 1/3 (ISP, exit in Ecuador)
Ecuador
2026-04-01
######################################################################### 100.0%
######################################################################### 100.0%
######################################################################### 100.0%
2026-04-01
448K	ConfirmAccount-REL1_43-38c4602.tar.gz
124K	DeleteBatch-REL1_43-b3b052b.tar.gz
14M	OATHAuth-REL1_43-2cdbefb.tar.gz
95b2bc67977c22d069867a7225aa1a9720b7593ed5ab49aa27cc293f01b2e2bb  ConfirmAccount-REL1_43-38c4602.tar.gz
d1e7c01cf709f2b57137bb3d76f73b4e8fd36ce57c12b750b04fe20ffce9be61  DeleteBatch-REL1_43-b3b052b.tar.gz
f71115af96a1ed5297d8d56f56683635b7c9e0b8b32151b184feea1fbec3350a  OATHAuth-REL1_43-2cdbefb.tar.gz
user@disp7799:/tmp/tmp.oWTEqi2mpP$ 
  1. and all the files are >4K, so that's promising.
  2. TODO: finish 3TOFU, install & configure extensions
  3. ...
  4. I also edited some wiki articles, namely
    1. this Maltfield_Log and Maltfield_Log/2026
    2. the Main_Page
    3. the Eco-Libre:About page (from the footer)
    4. a Documentation page, which describes what the wiki is for and what it's not for
  5. TOOO: write Eco-Libre:Privacy_policy

2026-03-31

Hello World!

  1. I installed this wiki last week on 2026-03-27
  2. since then, I did some hardening and basic setup (skin, logos)
  3. today I continued through the process of configuring its built-in plugins
  4. I'm still in the process of a 3TOFU on the desired extensions.
  5. now I'm finally editing some pages
  6. TODO: download, activate, and configure additional extensions