diff options
-rw-r--r-- | backend/auth/freesitemgr/.config (renamed from backend/freesitemgr/.config) | 0 | ||||
-rw-r--r-- | backend/auth/freesitemgr/.gitignore (renamed from backend/freesitemgr/.gitignore) | 0 | ||||
-rw-r--r-- | backend/auth/freesitemgr/Standing With Resilience Public (renamed from backend/freesitemgr/Standing With Resilience Public) | 137 | ||||
-rw-r--r-- | backend/resilient/__init__.py | 107 | ||||
-rw-r--r-- | backend/resilient/freenet.py | 30 | ||||
-rwxr-xr-x | backend/update.py | 148 | ||||
-rw-r--r-- | wiki/TODO.mdwn | 31 | ||||
-rw-r--r-- | wiki/index.mdwn | 2 |
8 files changed, 325 insertions, 130 deletions
diff --git a/backend/freesitemgr/.config b/backend/auth/freesitemgr/.config index 23242e6..23242e6 100644 --- a/backend/freesitemgr/.config +++ b/backend/auth/freesitemgr/.config diff --git a/backend/freesitemgr/.gitignore b/backend/auth/freesitemgr/.gitignore index 31d13b9..31d13b9 100644 --- a/backend/freesitemgr/.gitignore +++ b/backend/auth/freesitemgr/.gitignore diff --git a/backend/freesitemgr/Standing With Resilience Public b/backend/auth/freesitemgr/Standing With Resilience Public index 92c4c7f..bd065c5 100644 --- a/backend/freesitemgr/Standing With Resilience Public +++ b/backend/auth/freesitemgr/Standing With Resilience Public @@ -5,11 +5,11 @@ name = "Standing With Resilience Public" dir = "../html" -uriPriv = "USK@AKL0griFs7T25yw6-JR3Wk7vocvNBelOLg3RwtIL6aTp,jjuBPGO~oCByVoZ5f4Bny0Gp-l3kuDOtf3m-QBT4ekA,AQECAAE/Standing With Resilience Public/5" -uriPub = "USK@hCLgfaINNSNAl4do-PapEincQP5Lxa72d8mFrzHqzqU,jjuBPGO~oCByVoZ5f4Bny0Gp-l3kuDOtf3m-QBT4ekA,AQACAAE/Standing With Resilience Public/5/" -updateInProgress = True -insertingManifest = True -insertingIndex = False +uriPriv = "USK@AKL0griFs7T25yw6-JR3Wk7vocvNBelOLg3RwtIL6aTp,jjuBPGO~oCByVoZ5f4Bny0Gp-l3kuDOtf3m-QBT4ekA,AQECAAE/Standing With Resilience Public/6" +uriPub = "USK@hCLgfaINNSNAl4do-PapEincQP5Lxa72d8mFrzHqzqU,jjuBPGO~oCByVoZ5f4Bny0Gp-l3kuDOtf3m-QBT4ekA,AQACAAE/Standing With Resilience Public/6/" +updateInProgress = False +insertingManifest = False +insertingIndex = True index = "index.html" sitemap = "sitemap.html" mtype = "text/html" @@ -17,12 +17,100 @@ mtype = "text/html" # Detailed site contents files = [ { + "mimetype": "application/octet-stream", + "hash": "acbaef275e46a7f14c1ef456fff2c8bbe8c84724", + "name": ".git/HEAD", + "uri": "", + "sizebytes": 23, + "state": "changed", + "path": "../html/.git/HEAD", + "id": "", + "target": "manifest" + }, + { + "mimetype": "application/octet-stream", + "hash": "c879df015d97615050afa7b9641e3352a1e701ac", + "name": ".git/info/exclude", + "uri": "", + "sizebytes": 240, + "state": "changed", + "path": "../html/.git/info/exclude", + "id": "", + "target": "manifest" + }, + { + "mimetype": "application/octet-stream", + "hash": "25d587813b49215224a7a793a45ef3ef943acfbb", + "name": ".git/info/refs", + "uri": "", + "sizebytes": 830, + "state": "changed", + "path": "../html/.git/info/refs", + "id": "", + "target": "manifest" + }, + { + "mimetype": "application/octet-stream", + "hash": "12d50a68f3e96240f0dfad5c80e1bb06477756e4", + "name": ".git/objects/info/packs", + "uri": "", + "sizebytes": 54, + "state": "changed", + "path": "../html/.git/objects/info/packs", + "id": "", + "target": "manifest" + }, + { + "mimetype": "application/octet-stream", + "hash": "0d323ed855a92cd783861198b724421fd4acdbb0", + "name": ".git/objects/pack/pack-be2270dfe9596c7f6afe3bd427ada432616f9f78.idx", + "uri": "", + "sizebytes": 5804, + "state": "changed", + "path": "../html/.git/objects/pack/pack-be2270dfe9596c7f6afe3bd427ada432616f9f78.idx", + "id": "", + "target": "manifest" + }, + { + "mimetype": "application/octet-stream", + "hash": "88225bedcbc17d9984ee27e07e059d1863fd1f23", + "name": ".git/objects/pack/pack-be2270dfe9596c7f6afe3bd427ada432616f9f78.pack", + "uri": "", + "sizebytes": 39150, + "state": "changed", + "path": "../html/.git/objects/pack/pack-be2270dfe9596c7f6afe3bd427ada432616f9f78.pack", + "id": "", + "target": "manifest" + }, + { + "mimetype": "application/octet-stream", + "hash": "4e39a3bdfc4b9c16e239ba29448f00e5a4fabc2a", + "name": ".git/packed-refs", + "uri": "", + "sizebytes": 803, + "state": "changed", + "path": "../html/.git/packed-refs", + "id": "", + "target": "manifest" + }, + { + "mimetype": "application/octet-stream", + "hash": "d9427cda09aba1cdde5c69c2b13c905bddb0bc51", + "name": ".git/refs/remotes/origin/HEAD", + "uri": "", + "sizebytes": 32, + "state": "changed", + "path": "../html/.git/refs/remotes/origin/HEAD", + "id": "", + "target": "manifest" + }, + { "mimetype": "text/html", - "hash": "5cdfef47f51c5342ac4ad6f40750ce68073feac7", + "hash": "5cac9ddc5e3a5e68678fe42a42f9cbe96450ce00", "name": "Freenet/index.html", "uri": "", "sizebytes": 2528, - "state": "idle", + "state": "changed", "path": "/home/gentoo/src/standingwithresilience.branchable.com/html/Freenet/index.html", "dda": true, "id": "freesitemgr|Standing With Resilience Public|Freenet/index.html", @@ -30,11 +118,11 @@ files = [ }, { "mimetype": "text/html", - "hash": "2e95c9e421f2f02724d7dc1b11a79bcd9dc6553a", + "hash": "5f1c62841949ce0b84c55963e3e2dc7e7c9834af", "name": "Shielding/index.html", "uri": "", "sizebytes": 6115, - "state": "idle", + "state": "changed", "path": "/home/gentoo/src/standingwithresilience.branchable.com/html/Shielding/index.html", "dda": true, "id": "freesitemgr|Standing With Resilience Public|Shielding/index.html", @@ -42,11 +130,11 @@ files = [ }, { "mimetype": "text/html", - "hash": "787ae2089bf98addf7bae3bfda86adb0f5fc5c20", + "hash": "67391e3ea6615bca459dfdc7a03ce66729fd02bf", "name": "TODO/index.html", "uri": "", - "sizebytes": 1385, - "state": "idle", + "sizebytes": 2142, + "state": "changed", "path": "/home/gentoo/src/standingwithresilience.branchable.com/html/TODO/index.html", "dda": true, "id": "freesitemgr|Standing With Resilience Public|TODO/index.html", @@ -54,11 +142,11 @@ files = [ }, { "mimetype": "text/html", - "hash": "bc4c198b805f15403fe4680f768942e578952552", + "hash": "c5e4668d9c81b8019ef95a2603b210fb965f32b3", "name": "Tech_Savvy/index.html", "uri": "", "sizebytes": 1351, - "state": "idle", + "state": "changed", "path": "/home/gentoo/src/standingwithresilience.branchable.com/html/Tech_Savvy/index.html", "dda": true, "id": "freesitemgr|Standing With Resilience Public|Tech_Savvy/index.html", @@ -66,17 +154,28 @@ files = [ }, { "mimetype": "text/html", - "hash": "4f430ff6ba065b308eedd854e68202d39e6b4cce", + "hash": "a6e409ad8eb6fefd8a5da89fd3ee567437e860d2", "name": "Technical_Resources/index.html", "uri": "", "sizebytes": 1301, - "state": "idle", + "state": "changed", "path": "/home/gentoo/src/standingwithresilience.branchable.com/html/Technical_Resources/index.html", "dda": true, "id": "freesitemgr|Standing With Resilience Public|Technical_Resources/index.html", "target": "manifest" }, { + "mimetype": "text/html", + "hash": "5fd73c3c1c927d5467767e2a5dc74498a1d9a1f0", + "name": "ZeroNet/index.html", + "uri": "", + "sizebytes": 2034, + "state": "changed", + "path": "../html/ZeroNet/index.html", + "id": "freesitemgr|Standing With Resilience Public|ZeroNet/index.html", + "target": "manifest" + }, + { "mimetype": "image/x-icon", "hash": "8d06e9596fe48d7afd629fb4dca33f77deaa3454", "name": "favicon.ico", @@ -354,11 +453,11 @@ files = [ }, { "mimetype": "text/html", - "hash": "049b8e88e0037e2daee08f01ee7739f909dca955", + "hash": "b7683c45f40bf214c0a63022ca70e2b18914651d", "name": "index.html", "uri": "CHK@Df82KVE2jZFntgB~bLWgSpZPqvbf1cyYZyHqWlwWryY,mJshNq8d-2L6J9yG0P3bJgU~6vBVeoxg-bZLbk1v~tU,AAMC--8/index.html", - "sizebytes": 1817, - "state": "idle", + "sizebytes": 1893, + "state": "changed", "path": "/home/gentoo/src/standingwithresilience.branchable.com/html/index.html", "dda": true, "id": "freesitemgr|Standing With Resilience Public|index.html", diff --git a/backend/resilient/__init__.py b/backend/resilient/__init__.py new file mode 100644 index 0000000..490ff3f --- /dev/null +++ b/backend/resilient/__init__.py @@ -0,0 +1,107 @@ +import os, urllib + +__all__ = ["freenet"] + +name = 'A Wiki for Targeted Individuals' + +backend_path = os.path.normpath(os.path.join(os.path.dirname(__file__), '..')) + +auth_path = os.path.join(backend_path, 'auth') +html_path = os.path.normpath(os.path.join(backend_path, '../html')) +wiki_src_path = os.path.normpath(os.path.join(backend_path, '../wiki')) +git_path = os.path.normpath(os.path.join(backend_path, '../.git')) + + +ssh_config_path = os.path.join(auth_path, "ssh-config") + +def url200(url): + try: + return urllib.urlopen(url).getcode() == 200 + except IOError: + return False + +class git: + found = (os.system("git status --porcelain") == 0) + if not found: + print("ERROR: git not found") + exit(1) + + def __init__(self, remote, push_remote = None): + self.remote = remote + if push_remote == None: + push_remote = remote + self.push_remote = push_remote + + def pull(self): + if self.remote == None: + return False + os.environ["GIT_SSH_COMMAND"] = "ssh -F %s" % ssh_config_path + status = os.system("git pull %s master" % self.remote) + del os.environ["GIT_SSH_COMMAND"] + return status == 0 + + def push(self): + if self.push_remote == None: + return False + os.environ["GIT_SSH_COMMAND"] = "ssh -F %s" % ssh_config_path + status = os.system("git push %s master" % self.push_remote) + del os.environ["GIT_SSH_COMMAND"] + return status == 0 + + +class ikiwiki: + found = (os.system("ikiwiki --version") == 0) + if not found: + print("WARNING: ikiwiki not found, pages will not be built") + + synced = False + + def push(self): + if not ikiwiki.found: + return False + + if ikiwiki.synced: + return True + + html_git_path = os.path.join(html_path, '.git') + os.system("rm -rf '%s'" % html_path) + os.system("mkdir -p '%s'" % html_git_path) + + status = os.system("ikiwiki --wikiname '%s' --rebuild '%s' '%s'" % (name.replace("'","'\"'\"'"), wiki_src_path, html_path)) + + ikiwiki.synced = status == 0 + if ikiwiki.synced: + os.system('git gc') + os.system('git update-server-info') + for path in ['objects', 'refs', 'HEAD', 'info', 'packed-refs']: + os.system("cp -r '%s' '%s'" % (os.path.join(git_path, path), html_git_path)) + return ikiwiki.synced + + +class zeronet(): + running = url200('http://127.0.0.1:43110/1HeLLo4uzjaLetFx6NH3PMwFP3qbRbTf3D') + if not running: + print("WARNING: ZeroNet not running, won't be used") + + found = 'ZERONETDIR' in os.environ + if found: + zn_datadir = os.path.join(os.environ['ZERONETDIR'], 'ZeroNet/data') + zn_script = os.path.join(os.environ['ZERONETDIR'], 'ZeroNet.sh') + found = (os.system("'%s' --version" % zn_script) == 0) + if not found: + print("WARNING: ZeroNet bundle not found in ZERONETDIR, public zeronet site won't be updated") + + def __init__(self, addr, key): + self.addr = addr + self.key = key + + def push(self): + if not ikiwiki.synced: + return False + zitedir = os.path.join(zeronet.zn_datadir, self.addr) + status = os.system('cp -r %s %s' % (os.path.join(html_path, '.'), os.path.join(zitedir, '.'))) + if status != 0: + return False + status = os.system('%s siteSign %s %s' % (zeronet.zn_script, self.addr, self.key)) + return status == 0 + diff --git a/backend/resilient/freenet.py b/backend/resilient/freenet.py new file mode 100644 index 0000000..ea72760 --- /dev/null +++ b/backend/resilient/freenet.py @@ -0,0 +1,30 @@ +from resilient import auth_path, git, ikiwiki, url200 +import os + +running = url200('http://127.0.0.1:8888/') +if not running: + print("WARNING: freenet not running, changes won't be synced with freenet") + +class gitocalypse(git): + found = (os.system("git-remote-freenet") == 256) + if not found: + print("WARNING: gitocalypse not found, changes won't be synced with freenet") + + def __init__(self, pull_remote, push_remote = None): + self.remote = pull_remote + self.push_remote = push_remote + +class freesitemgr(): + found = (os.system("freesitemgr --version") == 0) + if not found: + print("WARNING: freesitemgr/pyFreenet not found, public freesite won't be updated") + + def __init__(self): + pass + + def push(self): + if not ikiwiki.synced: + return False + config_path = os.path.join(auth_path, 'freesitemgr') + status = os.system("freesitemgr -c '%s' -v -r 1 update" % config_path) + return status == 0 diff --git a/backend/update.py b/backend/update.py index ebf82bf..47b05c4 100755 --- a/backend/update.py +++ b/backend/update.py @@ -1,128 +1,80 @@ #!/usr/bin/env python2 -import os -import sys +import resilient +import resilient.freenet -############### Enumerate dependencies +##################### Instantiate remotes -found_git = (os.system("git status --porcelain") == 0) +git_repos = [ + resilient.git('git://standingwithresilience.branchable.com/'), + resilient.git('fairlystable-guest:/srv/git/standingwithresilience') +] -if not found_git: - print("ERROR: git not found") - exit(1) +if resilient.freenet.gitocalypse.found and resilient.freenet.running: + git_repos.extend([ + #### public freenet #### + resilient.freenet.gitocalypse('freenet://USK@hCLgfaINNSNAl4do-PapEincQP5Lxa72d8mFrzHqzqU,jjuBPGO~oCByVoZ5f4Bny0Gp-l3kuDOtf3m-QBT4ekA,AQACAAE/Standing%20With%20Resilience%20Public.git.R1/0', 'freenet://USK@AKL0griFs7T25yw6-JR3Wk7vocvNBelOLg3RwtIL6aTp,jjuBPGO~oCByVoZ5f4Bny0Gp-l3kuDOtf3m-QBT4ekA,AQECAAE/Standing%20With%20Resilience%20Public.git.R1/0'), + #### private freenet #### + resilient.freenet.gitocalypse('freenet://USK@PSY0YngeDtGbj60hjEoilQiY9oKzVrptRC0rG4BEVPg,e6ZEjT4KvbsltPBJOeKNpIdty2oGzbLCdk4fsDA5Vdk,AQACAAE/Standing%20With%20Resilience.git.R1/0') + ]) -found_ikiwiki = (os.system("ikiwiki --version") == 0) -found_gitocalypse = (os.system("git-remote-freenet") == 256) -found_freesitemgr = (os.system("freesitemgr --version") == 0) -found_zeronet = 'ZERONETDIR' in os.environ -if found_zeronet: - zn_datadir = os.path.join(os.environ['ZERONETDIR'], 'ZeroNet/data') - zn_script = os.path.join(os.environ['ZERONETDIR'], 'ZeroNet.sh') - found_zeronet = (os.system("'%s' --version" % zn_script) == 0) - -if not found_ikiwiki: - print("WARNING: ikiwiki not found, pages will not be built") -if not found_gitocalypse: - print("WARNING: gitocalypse not found, changes won't be synced with freenet") -if not found_freesitemgr: - print("WARNING: freesitemgr/pyFreenet not found, public freesite won't be updated") -if not found_zeronet: - print("WARNING: ZeroNet not found in ZERONETDIR, public zeronet site won't be updated") - -if not (found_ikiwiki or found_gitocalypse or found_freesitemgr): - print("Changes will still be propagated if branchable is working.") +zeronet_urls = ['http://bit.no.com:43110'] +if resilient.zeronet.running: + zeronet_urls.append('http://127.0.0.1:43110') +for host in zeronet_urls: + git_repos.extend([ + #### public zeronet #### + resilient.git('%s/1GtQ8bkFkhYtKerSdXHKe1z4j9VTmFR5d4/.git' % host), + #### private zeronet #### + resilient.git('%s/1L363bqJnCG63SnV83kfV7izZXbmentctD/.git' % host) + ]) ####################### Download from all -print(":: Pulling from simple repos ...") -os.environ["GIT_SSH_COMMAND"] = "ssh -F backend/auth/ssh-config" - -status = 0 -status += os.system("git pull git://standingwithresilience.branchable.com/ master") - -if status != 0: - print("WARNING: failed to pull changes from branchable") - #exit(status) - -status += os.system("git pull fairlystable-guest:/srv/git/standingwithresilience master") +print(":: Pulling from git repos ...") -if status != 0: - print("WARNING: failed to pull changes from fairlystable") - #exit(status) +for repo in git_repos: + repo.pull() -del os.environ["GIT_SSH_COMMAND"] +########################### Upload to all +print(":: Pushing to git repos ...") -# Pull from zeronet repos -print(":: Pulling from zeronet repos ...") -# public zeronet -os.system("git pull http://127.0.0.1:43110/1GtQ8bkFkhYtKerSdXHKe1z4j9VTmFR5d4/.git master") -# private zeronet -os.system("git pull http://127.0.0.1:43110/1L363bqJnCG63SnV83kfV7izZXbmentctD/.git master") +for repo in git_repos: + repo.push() -# Pull from freenet repos -if found_gitocalypse: - print(":: Pulling from freenet repos ...") - # public freenet - os.system("git pull freenet://USK@hCLgfaINNSNAl4do-PapEincQP5Lxa72d8mFrzHqzqU,jjuBPGO~oCByVoZ5f4Bny0Gp-l3kuDOtf3m-QBT4ekA,AQACAAE/Standing%20With%20Resilience%20Public.git.R1/0 master") - # private freenet - os.system("git pull freenet://USK@PSY0YngeDtGbj60hjEoilQiY9oKzVrptRC0rG4BEVPg,e6ZEjT4KvbsltPBJOeKNpIdty2oGzbLCdk4fsDA5Vdk,AQACAAE/Standing%20With%20Resilience.git.R1/0 master") +############################## Build wiki +if not resilient.ikiwiki.found: + print (":: Not building wiki; missing ikiwiki") + exit(0) +print (":: Building wiki ...") -######################### Upload to all - -print(":: Pushing to simple repos ...") -os.environ["GIT_SSH_COMMAND"] = "ssh -F backend/auth/ssh-config" - -status += os.system("git push git://standingwithresilience.branchable.com/") -status += os.system("git push fairlystable-guest:/srv/git/standingwithresilience") - -del os.environ["GIT_SSH_COMMAND"] - +if not resilient.ikiwiki().push(): + print (":: Exiting due to failure") + exit(-1) -# Push to freenet repos -if found_gitocalypse: - print (":: Pushing to freenet repos ...") - # public freenet - os.system("git push freenet://USK@AKL0griFs7T25yw6-JR3Wk7vocvNBelOLg3RwtIL6aTp,jjuBPGO~oCByVoZ5f4Bny0Gp-l3kuDOtf3m-QBT4ekA,AQECAAE/Standing%20With%20Resilience%20Public.git.R1/0") +####################### Instantiate hosts +hosts = [] -# Build wiki +if resilient.zeronet.found: + hosts.append(resilient.zeronet('1GtQ8bkFkhYtKerSdXHKe1z4j9VTmFR5d4', '5JzZACCELsT4bx66qmV9JDaWhEQ6Sx6j7LzeucsxJGA9H7nuoRr')) -if status != 0: - print (":: Exiting due to failure") - exit(status) +if resilient.freenet.freesitemgr.found and resilient.freenet.running: + hosts.append(resilient.freenet.freesitemgr()) # keys for freesitemgr are in auth/freesitemgr -if not found_ikiwiki: - print (":: Not building wiki; missing ikiwiki") - exit(0) +########################### Upload to all -print (":: Building wiki ...") +print (":: Publishing site ...") -status += os.system("ikiwiki --wikiname 'A Wiki for Targeted Individuals' --rebuild ../wiki ../html") +for host in hosts: + host.push() -if status != 0: - print (":: Exiting due to failure") - exit(status) - -if found_zeronet: - os.system('git update-server-info') - print (":: Publishing ZeroNet site ...") - zn_datadir = os.path.join(zn_datadir, '1GtQ8bkFkhYtKerSdXHKe1z4j9VTmFR5d4') - os.system('cp -r ../html/. %s/.' % zn_datadir) - os.system('mkdir -p %s/.git' % zn_datadir) - for file in ('objects', 'refs', 'HEAD', 'info', 'packed-refs'): - os.system('cp -a ../.git/%s %s/.git' % (file, zn_datadir)) - os.system('%s siteSign 1GtQ8bkFkhYtKerSdXHKe1z4j9VTmFR5d4 5JzZACCELsT4bx66qmV9JDaWhEQ6Sx6j7LzeucsxJGA9H7nuoRr' % zn_script) - -if found_freesitemgr: - print (":: Publishing freesite ...") - status += os.system("freesitemgr -c freesitemgr -v -l freesitemgr.log -r 1 update") +######################################### print "Done." - -exit(status) diff --git a/wiki/TODO.mdwn b/wiki/TODO.mdwn index 7fd724f..c39575e 100644 --- a/wiki/TODO.mdwn +++ b/wiki/TODO.mdwn @@ -1,17 +1,24 @@ -[ ] Link mirrors on branchable, to propogate changes -[ ] Ensure branchable is pulling from other web mirror as well as pushing [ ] Make a space for blogging in the wiki -[ ] Upload site to zeronet - [x] Upload private site - [x] Upload public site - [x] Add git syncing to update.py - [x] Add public upload to update.py - [ ] Add sites to public list, will need to register an id, perhaps via bitmessage - [ ] Add page in wiki regarding ZeroNet -[ ] Upload site to qora +[ ] Upload site to qora, even though it is not currently developed + [ ] Add qora inproxy remote to normal git pull [ ] Upload site to ipfs + [ ] Provide for public name with public key in custom config dir ?? + [ ] Can use ipns-pub to update public name ?? + https://github.com/whyrusleeping/ipns-pub + [ ] Final ipfs url is spewed out by ipfs on stdout, must capture or use alternative (python api) + [ ] Add ipfs inproxy remote to normal git pull +[ ] Upload site to gnunet +[ ] Add a page on how to edit the wiki +[ ] Add a nicer looking stylesheet +[ ] Use ikiwiki's mirror plugin +[ ] Ensure branchable is pulling from other web mirrors as well as pushing [ ] Upload site to project maelstrom? -[ ] Provide .bit domain name for ZeroNet -[ ] Implement CGI in ZeroNet ?? [x] Link mirrors on index [x] Upload site to freenet +[x] Upload site to zeronet +[ ] ZeroNet refining + ==> [ ] Ensure site is in search engines and add it to an index or public page + [ ] Implement wiki editing + -> ZeroWiki already exists, open source +[ ] Freenet refining + [ ] Implement wiki editing ??? diff --git a/wiki/index.mdwn b/wiki/index.mdwn index 0d10632..7c63e70 100644 --- a/wiki/index.mdwn +++ b/wiki/index.mdwn @@ -13,4 +13,4 @@ This is a wiki, which anybody is free to [[edit, copy, or store|Editing]]. Plea These networks can help with isolation: [[Freenet]] [[ZeroNet]] -On the normal internet, this site is found at [branchable.com](https://standingwithresilience.branchable.com/) and [fairlystable.org](https://fairlystable.org/standingwithresilience/) +On the normal internet, this site is found at [branchable.com](https://standingwithresilience.branchable.com/) and [fairlystable.org](https://fairlystable.org/standingwithresilience/wiki/index/) |