diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index ed16d707d..f6fb58f7d 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -10,7 +10,7 @@ jobs:
test:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- uses: actions/setup-node@v4
with:
node-version: "${{ env.NODE_VERSION }}"
@@ -30,7 +30,7 @@ jobs:
TW5_BUILD_MAIN_EDITION: "./editions/prerelease"
TW5_BUILD_OUTPUT: "./output/prerelease"
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- uses: actions/setup-node@v4
with:
node-version: "${{ env.NODE_VERSION }}"
@@ -62,7 +62,7 @@ jobs:
TW5_BUILD_OUTPUT: "./output"
TW5_BUILD_ARCHIVE: "./output"
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- uses: actions/setup-node@v4
with:
node-version: "${{ env.NODE_VERSION }}"
diff --git a/.github/workflows/eslint.yml b/.github/workflows/eslint.yml
new file mode 100644
index 000000000..eae1d2c46
--- /dev/null
+++ b/.github/workflows/eslint.yml
@@ -0,0 +1,40 @@
+name: ESLint
+
+on:
+ pull_request:
+ types: [opened, synchronize, reopened]
+ workflow_dispatch:
+
+concurrency:
+ group: lint-${{ github.event.pull_request.number || github.ref_name }}
+ cancel-in-progress: true
+
+permissions:
+ contents: read
+ # Needed for GitHub Checks API
+ checks: write
+
+jobs:
+ eslint:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v5
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+
+ - name: Install dependencies
+ run: npm install --include=dev
+
+ - name: Run ESLint with reviewdog (GitHub Checks)
+ uses: reviewdog/action-eslint@v1
+ with:
+ eslint_flags: '.'
+ reporter: github-pr-check
+ fail_level: error
+ level: error
+ tool_name: ESLint PR code
diff --git a/.github/workflows/pr-check-build-size.yml b/.github/workflows/pr-check-build-size.yml
index 77450a71f..d5bcef121 100644
--- a/.github/workflows/pr-check-build-size.yml
+++ b/.github/workflows/pr-check-build-size.yml
@@ -2,6 +2,11 @@ name: Calculate PR build size
on:
pull_request_target:
types: [opened, reopened, synchronize]
+ paths:
+ - 'boot/**'
+ - 'core/**'
+ - 'themes/tiddlywiki/snowwhite/**'
+ - 'themes/tiddlywiki/vanilla/**'
jobs:
calculate-build-size:
@@ -15,11 +20,11 @@ jobs:
steps:
- name: build-size-check
id: get_sizes
- uses: TiddlyWiki/cerebrus@v4
+ uses: TiddlyWiki/cerebrus@v6
with:
pr_number: ${{ github.event.pull_request.number }}
repo: ${{ github.repository }}
- base_ref: ${{ github.base_ref }}
+ base_ref: ${{ github.event.pull_request.base.ref }}
github_token: ${{ secrets.GITHUB_TOKEN }}
mode: size:calc
diff --git a/.github/workflows/pr-comment-build-size.yml b/.github/workflows/pr-comment-build-size.yml
index 8421d99c8..72119c6af 100644
--- a/.github/workflows/pr-comment-build-size.yml
+++ b/.github/workflows/pr-comment-build-size.yml
@@ -25,7 +25,7 @@ jobs:
steps:
- name: Build and check size
- uses: TiddlyWiki/cerebrus@v4
+ uses: TiddlyWiki/cerebrus@v6
with:
pr_number: ${{ inputs.pr_number }}
repo: ${{ github.repository }}
diff --git a/.github/workflows/pr-path-validation.yml b/.github/workflows/pr-path-validation.yml
deleted file mode 100644
index 674a9115b..000000000
--- a/.github/workflows/pr-path-validation.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-name: Validate PR Paths
-
-on:
- pull_request_target:
- types: [opened, reopened, synchronize]
-
-jobs:
- validate-pr:
- runs-on: ubuntu-latest
-
- steps:
- - name: Validate PR
- uses: TiddlyWiki/cerebrus@v4
- with:
- pr_number: ${{ github.event.pull_request.number }}
- repo: ${{ github.repository }}
- base_ref: ${{ github.base_ref }}
- github_token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/pr-validation.yml b/.github/workflows/pr-validation.yml
new file mode 100644
index 000000000..84df47858
--- /dev/null
+++ b/.github/workflows/pr-validation.yml
@@ -0,0 +1,37 @@
+name: PR Validation
+
+on:
+ pull_request_target:
+ types: [opened, reopened, synchronize]
+
+permissions:
+ contents: read
+ pull-requests: write
+ issues: write
+jobs:
+ validate-pr:
+ runs-on: ubuntu-latest
+
+ steps:
+ # Step 1: Validate PR paths
+ - name: Validate PR Paths
+ uses: TiddlyWiki/cerebrus@v6
+ with:
+ pr_number: ${{ github.event.pull_request.number }}
+ repo: ${{ github.repository }}
+ base_ref: ${{ github.event.pull_request.base.ref }}
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ mode: rules
+ continue-on-error: true
+
+ # Step 2: Validate change notes
+ - name: Validate Change Notes
+ uses: TiddlyWiki/cerebrus@v6
+ with:
+ pr_number: ${{ github.event.pull_request.number }}
+ repo: ${{ github.repository }}
+ base_ref: ${{ github.event.pull_request.base.ref }}
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ mode: changenotes
+ continue-on-error: false
+
diff --git a/bin/build-site.sh b/bin/build-site.sh
index 40b9b447e..a68dc0752 100755
--- a/bin/build-site.sh
+++ b/bin/build-site.sh
@@ -5,7 +5,7 @@
# Default to the current version number for building the plugin library
if [ -z "$TW5_BUILD_VERSION" ]; then
- TW5_BUILD_VERSION=v5.3.7
+ TW5_BUILD_VERSION=v5.4.0
fi
echo "Using TW5_BUILD_VERSION as [$TW5_BUILD_VERSION]"
@@ -73,10 +73,8 @@ rm $TW5_BUILD_OUTPUT/dev/static/*
echo "Moved to http://tiddlywiki.com/plugins/tiddlywiki/tw2parser/index.html" > $TW5_BUILD_OUTPUT/classicparserdemo.html
echo "Moved to http://tiddlywiki.com/plugins/tiddlywiki/codemirror/index.html" > $TW5_BUILD_OUTPUT/codemirrordemo.html
-echo "Moved to http://tiddlywiki.com/plugins/tiddlywiki/d3/index.html" > $TW5_BUILD_OUTPUT/d3demo.html
echo "Moved to http://tiddlywiki.com/plugins/tiddlywiki/highlight/index.html" > $TW5_BUILD_OUTPUT/highlightdemo.html
echo "Moved to http://tiddlywiki.com/plugins/tiddlywiki/markdown/index.html" > $TW5_BUILD_OUTPUT/markdowndemo.html
-echo "Moved to http://tiddlywiki.com/plugins/tiddlywiki/tahoelafs/index.html" > $TW5_BUILD_OUTPUT/tahoelafs.html
# Put the build details into a .tid file so that it can be included in each build (deleted at the end of this script)
@@ -159,6 +157,13 @@ node $TW5_BUILD_TIDDLYWIKI \
--rendertiddler $:/core/save/all-external-js tour.html text/plain \
|| exit 1
+# /surveys.html surveys edition
+node $TW5_BUILD_TIDDLYWIKI \
+ ./editions/tiddlywiki-surveys \
+ --output $TW5_BUILD_OUTPUT \
+ --build index \
+ || exit 1
+
# /share.html Custom edition for sharing via the URL
node $TW5_BUILD_TIDDLYWIKI \
./editions/share \
@@ -294,26 +299,6 @@ node $TW5_BUILD_TIDDLYWIKI \
--rendertiddler $:/core/save/empty plugins/tiddlywiki/katex/empty.html text/plain \
|| exit 1
-# /plugins/tiddlywiki/tahoelafs/index.html Demo wiki with Tahoe-LAFS plugin
-# /plugins/tiddlywiki/tahoelafs/empty.html Empty wiki with Tahoe-LAFS plugin
-node $TW5_BUILD_TIDDLYWIKI \
- ./editions/tahoelafs \
- --load $TW5_BUILD_OUTPUT/build.tid \
- --output $TW5_BUILD_OUTPUT \
- --rendertiddler $:/core/save/all plugins/tiddlywiki/tahoelafs/index.html text/plain \
- --rendertiddler $:/core/save/empty plugins/tiddlywiki/tahoelafs/empty.html text/plain \
- || exit 1
-
-# /plugins/tiddlywiki/d3/index.html Demo wiki with D3 plugin
-# /plugins/tiddlywiki/d3/empty.html Empty wiki with D3 plugin
-node $TW5_BUILD_TIDDLYWIKI \
- ./editions/d3demo \
- --load $TW5_BUILD_OUTPUT/build.tid \
- --output $TW5_BUILD_OUTPUT \
- --rendertiddler $:/core/save/all plugins/tiddlywiki/d3/index.html text/plain \
- --rendertiddler $:/core/save/empty plugins/tiddlywiki/d3/empty.html text/plain \
- || exit 1
-
# /plugins/tiddlywiki/codemirror/index.html Demo wiki with codemirror plugin
# /plugins/tiddlywiki/codemirror/empty.html Empty wiki with codemirror plugin
node $TW5_BUILD_TIDDLYWIKI \
diff --git a/boot/boot.js b/boot/boot.js
index 20a639731..6ac64c586 100644
--- a/boot/boot.js
+++ b/boot/boot.js
@@ -641,7 +641,7 @@ $tw.utils.evalGlobal = function(code,context,filename,sandbox,allowGlobals) {
// Call the function and return the exports
return fn.apply(null,contextValues);
};
-$tw.utils.sandbox = !$tw.browser ? vm.createContext({}) : undefined;
+$tw.utils.sandbox = !$tw.browser ? vm.createContext({}) : undefined;
/*
Run code in a sandbox with only the specified context variables in scope
*/
@@ -799,12 +799,13 @@ the password, and to encrypt/decrypt a block of text
$tw.utils.Crypto = function() {
var sjcl = $tw.node ? (global.sjcl || require("./sjcl.js")) : window.sjcl,
currentPassword = null,
- callSjcl = function(method,inputText,password) {
+ callSjcl = function(method,inputText,password,options) {
+ options = options || {};
password = password || currentPassword;
var outputText;
try {
if(password) {
- outputText = sjcl[method](password,inputText);
+ outputText = sjcl[method](password,inputText,options);
}
} catch(ex) {
console.log("Crypto error:" + ex);
@@ -830,7 +831,8 @@ $tw.utils.Crypto = function() {
return !!currentPassword;
}
this.encrypt = function(text,password) {
- return callSjcl("encrypt",text,password);
+ // set default ks:256 -- see: http://bitwiseshiftleft.github.io/sjcl/doc/convenience.js.html
+ return callSjcl("encrypt",text,password,{v:1,iter:10000,ks:256,ts:64,mode:"ccm",adata:"",cipher:"aes"});
};
this.decrypt = function(text,password) {
return callSjcl("decrypt",text,password);
@@ -1433,7 +1435,7 @@ $tw.Wiki = function(options) {
checkTiddler = function(tiddler,title) {
if(tiddler && tiddler.fields.type === "application/json" && tiddler.fields["plugin-type"] && (!pluginType || tiddler.fields["plugin-type"] === pluginType)) {
var disablingTiddler = self.getTiddler("$:/config/Plugins/Disabled/" + title);
- if(title === "$:/core" || !disablingTiddler || (disablingTiddler.fields.text || "").trim() !== "yes") {
+ if(title === "$:/core" || title === "$:/core-server" || !disablingTiddler || (disablingTiddler.fields.text || "").trim() !== "yes") {
self.unregisterPluginTiddlers(null,[title]); // Unregister the plugin if it's already registered
pluginTiddlers.push(tiddler);
registeredTitles.push(tiddler.fields.title);
@@ -1530,7 +1532,8 @@ Define all modules stored in ordinary tiddlers
*/
$tw.Wiki.prototype.defineTiddlerModules = function() {
this.each(function(tiddler,title) {
- if(tiddler.hasField("module-type")) {
+ // Modules in draft tiddlers are disabled
+ if(tiddler.hasField("module-type") && (!tiddler.hasField("draft.of"))) {
switch(tiddler.fields.type) {
case "application/javascript":
// We only define modules that haven't already been defined, because in the browser modules in system tiddlers are defined in inline script
@@ -1557,6 +1560,11 @@ $tw.Wiki.prototype.defineShadowModules = function() {
this.eachShadow(function(tiddler,title) {
// Don't define the module if it is overidden by an ordinary tiddler
if(!self.tiddlerExists(title) && tiddler.hasField("module-type")) {
+ if(tiddler.hasField("draft.of")) {
+ // Report a fundamental problem
+ console.warn(`TiddlyWiki: Plugins should not contain tiddlers with a 'draft.of' field: ${tiddler.fields.title}`);
+ return;
+ }
// Define the module
$tw.modules.define(tiddler.fields.title,tiddler.fields["module-type"],tiddler.fields.text);
}
@@ -1905,7 +1913,7 @@ $tw.loadTiddlersFromFile = function(filepath,fields) {
fileSize = fs.statSync(filepath).size,
data;
if(fileSize > $tw.config.maxEditFileSize) {
- data = "File " + filepath + "not loaded because it is too large";
+ data = "File " + filepath + " not loaded because it is too large";
console.log("Warning: " + data);
ext = ".txt";
} else {
@@ -1976,22 +1984,41 @@ filepath: pathname of the directory containing the specification file
$tw.loadTiddlersFromSpecification = function(filepath,excludeRegExp) {
var tiddlers = [];
// Read the specification
- var filesInfo = $tw.utils.parseJSONSafe(fs.readFileSync(filepath + path.sep + "tiddlywiki.files","utf8"));
+ var filesInfo = $tw.utils.parseJSONSafe(fs.readFileSync(filepath + path.sep + "tiddlywiki.files","utf8"), function(e) {
+ console.log("Warning: tiddlywiki.files in " + filepath + " invalid: " + e.message);
+ return {};
+ });
+
// Helper to process a file
var processFile = function(filename,isTiddlerFile,fields,isEditableFile,rootPath) {
var extInfo = $tw.config.fileExtensionInfo[path.extname(filename)],
type = (extInfo || {}).type || fields.type || "text/plain",
typeInfo = $tw.config.contentTypeInfo[type] || {},
pathname = path.resolve(filepath,filename),
- text = fs.readFileSync(pathname,typeInfo.encoding || "utf8"),
metadata = $tw.loadMetadataForFile(pathname) || {},
- fileTiddlers;
+ fileTooLarge = false,
+ text, fileTiddlers;
+
+ if("_canonical_uri" in fields) {
+ text = "";
+ } else if(fs.statSync(pathname).size > $tw.config.maxEditFileSize) {
+ var msg = "File " + pathname + " not loaded because it is too large";
+ console.log("Warning: " + msg);
+ fileTooLarge = true;
+ text = isTiddlerFile ? msg : "";
+ } else {
+ text = fs.readFileSync(pathname,typeInfo.encoding || "utf8");
+ }
+
if(isTiddlerFile) {
- fileTiddlers = $tw.wiki.deserializeTiddlers(path.extname(pathname),text,metadata) || [];
+ fileTiddlers = $tw.wiki.deserializeTiddlers(fileTooLarge ? ".txt" : path.extname(pathname),text,metadata) || [];
} else {
fileTiddlers = [$tw.utils.extend({text: text},metadata)];
}
var combinedFields = $tw.utils.extend({},fields,metadata);
+ if(fileTooLarge && isTiddlerFile) {
+ delete combinedFields.type; // type altered
+ }
$tw.utils.each(fileTiddlers,function(tiddler) {
$tw.utils.each(combinedFields,function(fieldInfo,name) {
if(typeof fieldInfo === "string" || $tw.utils.isArray(fieldInfo)) {
@@ -2066,6 +2093,7 @@ $tw.loadTiddlersFromSpecification = function(filepath,excludeRegExp) {
} else if(tidInfo.suffix) {
tidInfo.fields.text = {suffix: tidInfo.suffix};
}
+ tidInfo.fields = tidInfo.fields || {};
processFile(tidInfo.file,tidInfo.isTiddlerFile,tidInfo.fields);
});
// Process any listed directories
@@ -2087,6 +2115,7 @@ $tw.loadTiddlersFromSpecification = function(filepath,excludeRegExp) {
var thisPath = path.relative(filepath, files[t]),
filename = path.basename(thisPath);
if(filename !== "tiddlywiki.files" && !metaRegExp.test(filename) && fileRegExp.test(filename)) {
+ dirSpec.fields = dirSpec.fields || {};
processFile(thisPath,dirSpec.isTiddlerFile,dirSpec.fields,dirSpec.isEditableFile,dirSpec.path);
}
}
@@ -2350,6 +2379,7 @@ $tw.loadTiddlersNode = function() {
});
// Load the core tiddlers
$tw.wiki.addTiddler($tw.loadPluginFolder($tw.boot.corePath));
+ $tw.wiki.addTiddler($tw.loadPluginFolder($tw.boot.coreServerPath));
// Load any extra plugins
$tw.utils.each($tw.boot.extraPlugins,function(name) {
if(name.charAt(0) === "+") { // Relative path to plugin
@@ -2423,6 +2453,7 @@ $tw.boot.initStartup = function(options) {
// System paths and filenames
$tw.boot.bootPath = options.bootPath || path.dirname(module.filename);
$tw.boot.corePath = path.resolve($tw.boot.bootPath,"../core");
+ $tw.boot.coreServerPath = path.resolve($tw.boot.bootPath,"../core-server");
// If there's no arguments then default to `--help`
if($tw.boot.argv.length === 0) {
$tw.boot.argv = ["--help"];
@@ -2547,10 +2578,10 @@ $tw.boot.execStartup = function(options){
if($tw.safeMode) {
$tw.wiki.processSafeMode();
}
- // Register typed modules from the tiddlers we've just loaded
- $tw.wiki.defineTiddlerModules();
- // And any modules within plugins
+ // Register typed modules from the tiddlers we've just loaded and any modules within plugins
+ // Tiddlers should appear last so that they may overwrite shadows during module registration
$tw.wiki.defineShadowModules();
+ $tw.wiki.defineTiddlerModules();
// Make sure the crypto state tiddler is up to date
if($tw.crypto) {
$tw.crypto.updateCryptoStateTiddler();
@@ -2619,11 +2650,13 @@ $tw.boot.executeNextStartupTask = function(callback) {
$tw.boot.log(s.join(" "));
// Execute task
if(!$tw.utils.hop(task,"synchronous") || task.synchronous) {
- task.startup();
- if(task.name) {
- $tw.boot.executedStartupModules[task.name] = true;
+ const thenable = task.startup();
+ if(thenable && typeof thenable.then === "function"){
+ thenable.then(asyncTaskCallback);
+ return true;
+ } else {
+ return asyncTaskCallback();
}
- return $tw.boot.executeNextStartupTask(callback);
} else {
task.startup(asyncTaskCallback);
return true;
diff --git a/community/docs/Community Cards Caveats.tid b/community/docs/Community Cards Caveats.tid
new file mode 100644
index 000000000..c63a29d63
--- /dev/null
+++ b/community/docs/Community Cards Caveats.tid
@@ -0,0 +1,5 @@
+title: Community Cards Caveats
+created: 20250909171928024
+modified: 20250909171928024
+
+''Please note that [[Community Cards]] are a new initiative started in September 2025. There is further work required to complete the team and people information.''
diff --git a/community/docs/Community Cards.tid b/community/docs/Community Cards.tid
new file mode 100644
index 000000000..087eaac65
--- /dev/null
+++ b/community/docs/Community Cards.tid
@@ -0,0 +1,11 @@
+title: Community Cards
+tags: Community
+modified: 20250909171928024
+created: 20250909171928024
+
+The purpose of Community Cards is to allow project plans and other community activities to be linked to the people who are involved in them. They also allow people to share their interests and activities in the TiddlyWiki community, and to help people in the TiddlyWiki community get to know each other better.
+
+{{Community Cards Caveats}}
+
+* [[Submitting a Community Card]]
+* [[Displaying Community Cards]]
diff --git a/community/docs/Displaying Community Cards.tid b/community/docs/Displaying Community Cards.tid
new file mode 100644
index 000000000..3d371ccd8
--- /dev/null
+++ b/community/docs/Displaying Community Cards.tid
@@ -0,0 +1,26 @@
+title: Displaying Community Cards
+tags: [[Community Cards]]
+modified: 20250909171928024
+created: 20250909171928024
+
+!! Cards for people
+
+This is an inline card for <> and <> which can be used in the middle of a sentence.
+
+This is a stack of inline cards:
+
+<>
+
+Here is a full format card:
+
+<>
+
+This is how the card looks when there is no such person:
+
+<>
+
+!! Cards for teams
+
+This is a card for a project team:
+
+<>
\ No newline at end of file
diff --git a/community/docs/Submitting a Community Card.tid b/community/docs/Submitting a Community Card.tid
new file mode 100644
index 000000000..195bf289f
--- /dev/null
+++ b/community/docs/Submitting a Community Card.tid
@@ -0,0 +1,36 @@
+title: Submitting a Community Card
+tags: [[Community Cards]]
+modified: 20250909171928024
+created: 20250909171928024
+
+Anyone associated with the TiddlyWiki community can submit a Community Card. The submission process currently involves making a GitHub pull request but we intend to provide a more user-friendly submission process in the future.
+
+Pull requests to add or update a community card should be made against the `tiddlywiki-com` branch of the [[TiddlyWiki repository|https://github.com/TiddlyWiki/TiddlyWiki5]] in the directory `community/people`.
+
+The card should be a TiddlyWiki tiddler with the following fields:
+
+|!Field |!Required|!Description |
+|`title`|Yes |The username of the person represented by the card, starting with `@` (e.g. `@Jermolene`). This is the title of the card and should be unique |
+|`tags`|Yes |The tags for the card, including `Community/Person` |
+|`fullname`|Yes |The full name of the person or group represented by the card |
+|`avatar`|Yes |The base64 representation of the 32x32 avatar image for the person represented by the card |
+|`first-sighting`|No |The date of the first sighting in the community of the person represented by the card. This should be in ISO 8601 format (YYYY-MM-DD) |
+|`talk.tiddlywiki.org`|Yes |The username of the person or group on the TiddlyWiki Talk forum |
+|`github`|No |The username of the person or group on GitHub |
+|`linkedin`|No |The URL of the LinkedIn profile for the person or group represented by the card |
+|`flickr`|No |The URL of the Flickr profile for the person or group represented by the card |
+|`homepage`|No |The URL of the homepage for the person or group represented by the card |
+|`email`|No |The email address of the person or group represented by the card |
+|`text`|Yes |The text of the card. This should include a brief description of the person or group represented by the card, and any other relevant information |
+
+! Rules for Community Cards
+
+Community cards must observe the following rules. It is intended to enforce them with an automated script, but for the moment they will be manually checked.
+
+* `title` must be unique and start with `@`
+* `tags` must include `Community/Person`
+* `fullname` must be provided
+* `avatar` must be a base64 representation of a 32x32 image, with a limit of 1KB. [[Squoosh|https://squoosh.app/]] is recommended for resizing and compressing images
+* `first-sighting` should be in ISO 8601 format (YYYY-MM-DD)
+* `talk.tiddlywiki.org` must be provided
+* `text` total size must not exceed 2KB
diff --git a/community/people/Arlen22.tid b/community/people/Arlen22.tid
new file mode 100644
index 000000000..5bc102312
--- /dev/null
+++ b/community/people/Arlen22.tid
@@ -0,0 +1,10 @@
+title: @Arlen22
+tags: Community/Person
+fullname: Arlen Beiler
+first-sighting: 2011-06-20
+talk.tiddlywiki.org: arlen22
+github: Arlen22
+homepage: arlen22.github.io
+avatar: /9j/4AAQSkZJRgABAQAAAQABAAD/2wEEEAAVABUAFQAVABYAFQAYABoAGgAYACEAIwAfACMAIQAwAC0AKQApAC0AMABJADQAOAA0ADgANABJAG8ARQBRAEUARQBRAEUAbwBiAHcAYQBaAGEAdwBiALEAiwB7AHsAiwCxAMwArACiAKwAzAD4AN0A3QD4ATgBKAE4AZcBlwIkEQAVABUAFQAVABYAFQAYABoAGgAYACEAIwAfACMAIQAwAC0AKQApAC0AMABJADQAOAA0ADgANABJAG8ARQBRAEUARQBRAEUAbwBiAHcAYQBaAGEAdwBiALEAiwB7AHsAiwCxAMwArACiAKwAzAD4AN0A3QD4ATgBKAE4AZcBlwIk/8IAEQgAQABAAwEiAAIRAQMRAf/EADAAAAIDAQEAAAAAAAAAAAAAAAMFAQQGAgABAQEBAQEAAAAAAAAAAAAAAAIDAQAE/9oADAMBAAIQAxAAAADIRMd3XctQlXtCTTmB6RFvANDouy4DYwEEar6YVM7ocz57mcqnZys+V2azZU4XZSoiZqhQt9TKOlnO+GOl1HyoUPXLn//EACYQAAICAQQCAgEFAAAAAAAAAAECABEDBBIhMUFRECITFCMycZH/2gAIAQEAAT8AI4Bv4ryAeBAnANHuNidWogEwYHNRsdfA8iruVMOIu6iYtK4c714vgTDpXyOfrQHdifoArEXxM2mR0NeOhUzI+LJzYbuHszCm5hYseZh0gXYWFIai4cWJgFJuFKYvtr2sJRuB9fUzgDHlGMHia2757uYsYc0TNHpsSmzzMONjl9iu74iK6PbWT7gv/RMiZDk+qcA3NXkAVl3gE+ADU1PDVdiaDCGJZjQEyowKANS1ZMwK+HJ+3a0KUDqYnYINxJ3eItDk81M2cZD+NVIrmanU/wAl2gCZiGNiaFziJ3LYIHcXMrLvDABe17EN1vCgqR2TNPnGTBSBbDTeV3c2amdlxPuD2C3H9epqmV628xqsUYmdiuwkVVTSZ0Q/dxwYdScrgBRsqONi2KQX7mo1G4WCK20B6j6p/VpcfMXPVQ9mbhx9eLgZrFGDUZB1DqMrCma4xN8mDcR5qK5Rgw7Hx//EABwRAQEBAQACAwAAAAAAAAAAAAECABEDIhIxQf/aAAgBAgEBPwDVQYpfzd66qDeOSn7yEmH23ffDAi66mug6DM9N8HTAY3//xAAcEQEBAQEAAgMAAAAAAAAAAAABAAIREBIiQVH/2gAIAQMBAT8AglC+rJbdCT1vVC33l83tj2OPLS+AJ3+Tf//Z
+
+I make random software.
\ No newline at end of file
diff --git a/community/people/EricShulman.tid b/community/people/EricShulman.tid
new file mode 100644
index 000000000..24201765f
--- /dev/null
+++ b/community/people/EricShulman.tid
@@ -0,0 +1,29 @@
+title: @ericshulman
+tags: Community/Person Community/Team/Contributors
+fullname: Eric Shulman
+first-sighting: 2005-06-21
+talk.tiddlywiki.org: ericshulman
+github: ericshulman
+homepage: tiddlytools.com
+email: elsdesign@gmail.com
+avatar: iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAD/ElEQVR42o2Tf2iUdRzH37e7rOa222233bab3mqKU9QihCAi+isKwX/sh5UQhGYQhNAvQowRUoghQWDOIJtQmOY0M92ZmVGm0WbTyZI1Nnft99S1jc3dPT9efffg/bHdLn19Hp4HPjzv9/fz+fL5aE58PwUkjzzFVC4P/G/k6E445Pc+uceeaqnv7Ogd6Rq68PPhrc+vkiERWOLT/+Ib8uQHNiXax3BIM0mC+CEtl2G7X9mIeCV+9Ejrr2MAtgkH14SNBRZXrYYPNF86nsXCkx/8dATAsp0JhknQTYJrTHg5SNI0qMekb+aw8Hr74WCKpNNu/0Kck5ymkRMcZz/1Jv5g2CUFbZYelrbMvlBMonHvJK3JuPsdTQxwExc8XG7SxF7OcxGScP6wRGCG/Asjf39VPydTzbQyRBrXBKToBCP/nQQ9VpIDO6SumU3EjUFLzX766HMG0mIvoJnXEbU47GGXc4TGBs3zWp5Jh7F47omdf56hy9lLIz3gyYfZSQMJztFEH3KEDg+bf1dkzkO9Savks7H9NLqnuEw3MEU314nTwABj/MV2R6y8JL+0wKdM8MtX23aFy04dF5mg08QI6XYsemmzRfiMDP5Mg1emK4ienZxi0p0gBfRwhSHAxgXGGeS6tYUdu6TPA3Ofr3Mfj9Bv4zHMDaCTMcBlnG4cJqx64sagN9Ngw3RJoa5R+MftI8k1Wm7NcSsH6KKPFGBbG1n1srQ+06DWpJ59cRhsGKGbo0wBFpDgNGcBcHGsl9BuSZmjfCRHWnv0BtgOcJVWwAZG2cw+3uErAKacZ6hq32PkGWuNSaxsHgIHxqjje5I4/Ms2dCt+BHpcUT4ai0j5sw22TCea2sCBbz3BOjaRFj+JeAE46IoHxlUmlfrmWuZT+8Ae935fjljDe3zpLdEJxGriLHdFtL8mKC2cbbAgIOXVBemwBhHibZq4xN/0YgPrESsRsiMs+C1zEwwFxqBqs4hY2yhlKeIUab5GLEM8SLlVRslu77jZhEwL/ofKKZ4uknxiiLO0cYFGFpJPMTGiRO0iQqtNrX7NxueTcahqv4/FTpgwFYinOcoxtiLKWEwF+U6Mqv5FuVlWSQHzvBWmKmUqIEg1YiMfIu6lhjKCRK0YkXelwoDmIjztWrCot5KQs5R5zKccIVZQwl3cTaVdQVGnfOkrzFbDuvuJWTVuBcXcQ5iFlFFAmBynlBKKH/f6z06pX6r6pJoSQlaeW2gsighi3na1E6HwNSkUUHbS45FXG7ajhIi68+1cO98qtqqJEHzTW6LbEfUstER1ef2llBKhiGqKW7VGUk6lT7dnmS/gnZMf1KPaoI16VWsrA1KhX3dObo5m9VqQpff/AFTcI4hMzFV+AAAAAElFTkSuQmCC
+
+\define wiki(text,topic) [[$text$|https://en.wikipedia.org/wiki/$topic$]]
+
+''Hello! My name is Eric Shulman''. I am the author of ''[[www.TiddlyTools.com|http://www.TiddlyTools.com]] (Small Tools for Big Ideas! ™)'', a popular collection of original plugins, macros, widgets, templates and stylesheets for TiddlyWiki that I have created and shared with the TiddlyWiki community.
+
+<<<
+Think of TiddlyTools as a ''virtual hardware store and "demonstration showroom"'', offering tools, parts and techniques that provide a rich variety of new functionality and feature enhancements to help you ''turn a general-purpose TiddlyWiki "info-house" into a comfortable, custom-built "info-home"''.
+
+The TiddlyWiki core system provides the basic structure and utilities: the foundation, framing, walls, roof, windows/doors, plumbing, heating, and electrical systems. Then, TiddlyTools helps you with all the "finish work": the appliances, fixtures, lighting, cabinets, furniture, paint, wallpaper, carpeting, etc. ''to best suit your specific needs and personal style''.
+<<<
+
+Since the early days of TiddlyWiki (April 2005), I have worked closely with its inventor, [[Jeremy Ruston|https://jermolene.com/]], to help develop and improve TiddlyWiki's core functions. I am also a key contributor and administrator of the online TiddlyWiki [[Discourse|https://talk.TiddlyWiki.org]] and [[GoogleGroups|https://groups.google.com/forum/#!forum/tiddlywiki]] discussion forums, providing ongoing assistance to the worldwide TiddlyWiki community. I have written over 15,000 detailed responses to individual questions posted online. For several years I was also the lead developer and maintainer of the [[TiddlyWiki Classic|https://classic.tiddlywiki.com/]] codebase.
+
+I was born and raised in suburban Long Island, NY, and attended [[Carnegie Mellon University (CMU)|https://www.cmu.edu/]] in Pittsburgh, PA, where I studied ''Computer Science, Cognitive Psychology, Sociology, Human Factors Design, and Artificial Intelligence''. As an undergraduate at CMU, I was privileged to work with some of the major luminaries in early software research and design, including <>, <>, <>, and <>. I was also employed in several Computer Science Department research projects, including the development of speech recognition technologies, graphical interface systems, and interactive applications for instruction in physics, art and music. I received a ''Bachelor of Science in "Interactive Systems Design"'' from CMU in 1985.
+
+During my early post-graduate years, I worked for several notable software development companies, including
+<> and <>. I was an integral member of the <> development team where I helped create the first GUI-based application interfaces for Microsoft Windows and IBM OS/2.
+
+Since 1998, I have been an ''independent design consultant'', living and working in Silicon Valley, where I apply more than 40 years of experience to provide ''analysis, design and software development services'' for commercial companies and not-for-profit organizations, with emphasis on ''information architecture'' and ''interaction/visual design standards'' to improve ease-of-use for new and existing software products and online environments.
diff --git a/community/people/Jermolene.tid b/community/people/Jermolene.tid
new file mode 100644
index 000000000..b75e410c7
--- /dev/null
+++ b/community/people/Jermolene.tid
@@ -0,0 +1,21 @@
+title: @Jermolene
+tags: Community/Person
+fullname: Jeremy Ruston
+first-sighting: 2004-09-20
+talk.tiddlywiki.org: jeremyruston
+github: Jermolene
+linkedin: www.linkedin.com/in/jermy
+flickr: www.flickr.com/photos/jermy/
+bluesky: https://bsky.app/profile/jermolene.bsky.social
+homepage: jermolene.com
+email: jeremy@jermolene.com
+avatar: /9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAgICAgJCAkKCgkNDgwODRMREBARExwUFhQWFBwrGx8bGx8bKyYuJSMlLiZENS8vNUROQj5CTl9VVV93cXecnNEBCAgICAkICQoKCQ0ODA4NExEQEBETHBQWFBYUHCsbHxsbHxsrJi4lIyUuJkQ1Ly81RE5CPkJOX1VVX3dxd5yc0f/CABEIACAAIAMBIgACEQEDEQH/xAAtAAEBAAMAAAAAAAAAAAAAAAAHBgIEBQEBAQEBAAAAAAAAAAAAAAAAAgQBBf/aAAwDAQACEAMQAAAANF4uTuPRhD2nBLnUiJvKM0DtMKy//8QAKxAAAgIBAwMDAQkAAAAAAAAAAQIDBBEABRITITEiMkFxFEJRUmFicoGR/9oACAEBAAE/AInTA6gUGP4ZOQbW1bPsmyUq1q+gmvFPUzZPDkPamtwqU75ks04JakroVcg5RwRjg66NUx25KbzqJYyMngfqSuq0M3NZYIebJIvZozIvI/iNPcp/aalSdJXsS4VcKeIzlvU3jVTcYLNiaGISrjkhWQYDfQ63pYAzCDBsOiu7Dsx4EHH6r2w2ttimjd2IsNErhhJHKI04/uzqxuCxpBYVVWKSHqwMyMSQ33SB7dUJFmlkMYRgnqZgCMf7rf8AeEt3A9YOhjXAb2k8u7dtT1RZeOtXmYxiOPj4ZWY/lb51skqUNnNW/wBNzC7IpB6gQeeB/jq/fqGOaLbowuYn5MAQOw8LjW5Vmeo0qIsqYLLKjHIZmwv9fB1//8QAHxEAAQMEAwEAAAAAAAAAAAAAEQABAgMSIWExMkFR/9oACAECAQE/AD9iTy2lJmHUB8BVKM4SNSOj46a29saX/8QAHREAAgICAwEAAAAAAAAAAAAAAQIAAwQRITGBkf/aAAgBAwEBPwDHpFpJZtamVSiBWT2Yt7hmCDsb+TKtsKqpGg3M/9k=
+
+I'm the original inventor of TiddlyWiki. You can hire me through my consultancy company [[Intertwingled Innovations|https://intertwingledinnovations.com]] or contact me directly.
+
+Further information:
+
+* A recording of the [[keynote I gave at QCon London in April 2024|https://www.infoq.com/presentations/bbc-micro/]], and the [[discussion on talk.tiddlywiki.org|https://talk.tiddlywiki.org/t/recording-of-jeremys-keynote-at-qcon-london-april-2024/10505]]. The talk mixes some nostalgia about my teenage activities with the BBC Micro with thoughts on the development of the software industry and insights gained from working with TiddlyWiki
+* An [[interview with me in The Inquirer|https://web.archive.org/web/20111103225832/http://www.theinquirer.net/inquirer/feature/2105529/bt-software-engineer-tells-telco-source]] by Wendy Grossman
+* A [[hilarious interview with me|https://www.youtube.com/watch?v=auyIhw8MTmQ]] from British television in 1983
+* Here's a video of a presentation I did in 2007 called [["How to Start an Open Source Project"|http://vimeo.com/856110]].
diff --git a/community/people/LinOnetwo.tid b/community/people/LinOnetwo.tid
new file mode 100644
index 000000000..02b4c46e2
--- /dev/null
+++ b/community/people/LinOnetwo.tid
@@ -0,0 +1,19 @@
+avatar: /9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAgICAgJCAkKCgkNDgwODRMREBARExwUFhQWFBwrGx8bGx8bKyYuJSMlLiZENS8vNUROQj5CTl9VVV93cXecnNEBCAgICAkICQoKCQ0ODA4NExEQEBETHBQWFBYUHCsbHxsbHxsrJi4lIyUuJkQ1Ly81RE5CPkJOX1VVX3dxd5yc0f/CABEIACAAIAMBIgACEQEDEQH/xAAuAAEAAwEBAAAAAAAAAAAAAAAGAwQHAgUBAAMBAAAAAAAAAAAAAAAAAAACAwT/2gAMAwEAAhADEAAAAOfCWAMdKKetM4wOvY5OcvZnrYf/xAApEAACAQQBBAECBwAAAAAAAAABAgMABAURQQYSIVETFCIxMkJicYKh/9oACAEBAAE/AEtysaStr7mPaPeuazWdMM4gEnfPryW8hBUuZvou2RXRxyreBWPmgyNqs8f8MOQalhdY7Vz+R4/s/qfP+1edNi/zl7HDcFbmS3E8CcMR4INP0PkBhklIm+sZNtFtQiV0nj57Owl+dSrSTFgD6/CtH4VV9lU3oAbPngAVY389lc5URuUZkMxhnR4pvW0VwDqsP1FNmLWYqCpikMbngmliJNY+aKzyTxXS6lRAyg/u5rq+5x2RsuyTa3MQMlvKniRGThTUd1JYXUdzAwDvqVxGdRXMbfrVOD7HBrG3mNEsU8z98TRhl9eRzX//xAAcEQACAgIDAAAAAAAAAAAAAAABAgARAzESIVH/2gAIAQIBAT8ARuXZPsul3Eoje5lBQWBP/8QAGREAAwEBAQAAAAAAAAAAAAAAAAECEiER/9oACAEDAQE/AM98Lk7LJe20z//Z
+created: 20251110102157310
+first-sighting: 2019-03-01
+fullname: Lin Onetwo
+github: linonetwo
+homepage: https://wiki.onetwo.website/
+modified: 20251111184556193
+tags: Community/Person Community/Team/Contributors
+talk.tiddlywiki.org: linonetwo
+title: @linonetwo
+type: text/vnd.tiddlywiki
+
+Since 2014, when I started college, I've been on a quest for a lifelong PKM tool. I cherish my life and all my experiences, and I don’t want to forget any of them. When I’m deeply focused on a task, it’s easy to lose sight of other important parts of my life—so I needed a system to help me stay balanced.
+
+Early on, I tried TiddlyWiki several times, but I was initially put off by its save mechanism and markup editing. That changed when I discovered an auto-backup script, which gave me the confidence to fully commit. Over time, I improved the script and eventually transitioned to using TidGi-Desktop and TidGi-Mobile.
+
+Today, my TiddlyWiki holds all my game design ideas and progress logs—it has truly become my second brain. With the help of LLM-powered programming tools, I’ve enhanced it with numerous plugins, allowing me to manage my mind in a more programmable and structured way. As a game developer, TiddlyWiki isn't the core of my professional work; But I've invested so much time because it's fundamentally about upgrading my mind.
+
+Most of my notes are open by default and shared publicly on my homepage as a digital garden.
diff --git a/community/people/MotovunJack.tid b/community/people/MotovunJack.tid
new file mode 100644
index 000000000..0d8bee7ae
--- /dev/null
+++ b/community/people/MotovunJack.tid
@@ -0,0 +1,11 @@
+title: @MotovunJack
+tags: Community/Person Community/Robot
+fullname: Motovun Jack
+first-sighting: 2012-01-12
+github: MotovunJack
+homepage: tiddlywiki.com
+avatar: /9j/4AAQSkZJRgABAQAAAQABAAD/2wEEEAAYABgAGAAYABkAGAAaAB0AHQAaACUAKAAjACgAJQA2ADIALgAuADIANgBSADsAPwA7AD8AOwBSAH0ATgBbAE4ATgBbAE4AfQBuAIYAbQBlAG0AhgBuAMYAnACKAIoAnADGAOUAwQC2AMEA5QEWAPgA+AEWAV4BTAFeAckByQJmEQAYABgAGAAYABkAGAAaAB0AHQAaACUAKAAjACgAJQA2ADIALgAuADIANgBSADsAPwA7AD8AOwBSAH0ATgBbAE4ATgBbAE4AfQBuAIYAbQBlAG0AhgBuAMYAnACKAIoAnADGAOUAwQC2AMEA5QEWAPgA+AEWAV4BTAFeAckByQJm/8IAEQgAQABAAwEiAAIRAQMRAf/EADAAAAIDAQEAAAAAAAAAAAAAAAMEAQIFBgABAQEBAQEAAAAAAAAAAAAAAAIDAQAE/9oADAMBAAIQAxAAAADZCfn5vZJz+rnODGtpbpm6O8xzG9lCiszXtikQhtkTBputBxURJuVVYlEdBaQ284mPDj6GmkNUblMxRmi7dKw//8QAKxAAAgIBAgUCBgMBAAAAAAAAAQIAAxESIQQTIkFRFGEjMUJxgaEyNGLR/9oACAEBAAE/AMmX3ilMkjPaV3ragZDtNRmoxpvA2sEqQcHEwJxlwa98nYbCU8TymDfSTvPVKMbZHkQcTU4yDH46tTiE8RxjLXnQp7Dx5MACgKuyqMAS1xXU7kjYTiEbWp3y0IucYbGx6e05hDAqMH/k59o3DfxAE5hss1MNzODdVraxu50ieppH1Tivi8O6eYQ1j4B6guAftChDMNjBqycHcCYJqdj2s3idRBHfpi/1Kie7PDo95w/EMxYM22n9yy5AzBc/iLe7dIqx7kyy2ypyOWoYTofhCyDAZtx4MOmpK9sncyx1NdSq2kBBt3EKf6mgIzDUPIiByuqk7faMLbOyEjuuxEAyo56AgeTA3KL1AYRm1CcvmkgAs2wHjEvPxGIMJPmHUQCQNothr32A0ggeYluplcAK2PlLbTytZUkdwI7V3lAQMgbAfP8AMoCV1AKMOR+pdsc5yD595mMmNIGD4h0vsfupHyBlTKW9znMd+TQnljPWqHYIqhwD1zKsqtjBzCAVAyBicnqG6jbOe0//xAAbEQEBAAMBAQEAAAAAAAAAAAABAAIRIRASQf/aAAgBAgEBPwBYbZDuXvnLE5OrkWJzxI4g33ift//EABsRAAMBAQADAAAAAAAAAAAAAAABEQIhEBJB/9oACAEDAQE/AMqjzHwjGoZXPHTb6Zp1/TRp1khYjW01xHqz/9k=
+
+Motovun Jack is a robot that helps maintain the TiddlyWiki project infrastructure. It is not a person, but rather a set of automated scripts and tools that assist in managing the various services and resources used by the TiddlyWiki community.
+
+The origin of the name "Motovun Jack" is a lovable and playful kitten encountered by [[@Jermolene]] in the beautiful medieval hill town of Motovun in Croatia. Jack was [[first adopted|https://github.com/TiddlyWiki/TiddlyWiki5/commit/ecfbaaa5641f14e1766ef17ef6416bf9aa992863]] as the TiddlyWiki 5 mascot in 2012.
diff --git a/community/people/PMario.tid b/community/people/PMario.tid
new file mode 100644
index 000000000..a91259935
--- /dev/null
+++ b/community/people/PMario.tid
@@ -0,0 +1,25 @@
+avatar: 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
+created: 20251110102157310
+first-sighting: 2009-11-14
+fullname: Mario Pietsch
+github: pmario
+homepage: https://wikilabs.github.io/
+modified: 20251110124935183
+tags: Community/Person Community/Team/Contributors
+talk.tiddlywiki.org: pmario
+title: @pmario
+type: text/vnd.tiddlywiki
+youtube: https://www.youtube.com/@pmario
+
+''Hi, My name is Mario Pietsch''. Back in 2009 I was ''searching'' for ''a simple presentation tool'' and discovered ~TiddlyWiki Classic, Monkey Pirate ~TiddlyWiki ([[MPTW|https://mptw.tiddlyspot.com/]]) with ~TagglyTagging, Eric Shulman's ~TiddlyTools, Saq Imtiaz's navigation macros, and more. --- ''I was captivated''.
+
+After a deep dive, I combined these elements into my own "Presentation Manager", along [[3 step by step tutorials|https://groups.google.com/g/tiddlywiki/c/qG_tZ1x0MEU/m/-vLA0luMicYJ]] to help others build it.
+
+Thanks to ''the positive spirit'' of the ~TiddlyWiki community, I am proud to be part of it since 2009.
+
+When Jeremy started developing ~TiddlyWiki 5 on ~GitHub, I joined in—opening [[issue no. 1|https://github.com/TiddlyWiki/TiddlyWiki5/issues/1]] all the way up to 13. For what that’s good ;) Since then, I have submitted nearly 600 pull requests and more than 500 issues, many of which have been merged or resolved.
+
+My ~TiddlyWiki 5 "laboratory" is at https://wikilabs.github.io, and I also share content on my ''~YouTube'' channel: https://www.youtube.com/@pmario
+
+Have fun!
+Mario
diff --git a/community/project/TiddlyWiki People.tid b/community/project/TiddlyWiki People.tid
new file mode 100644
index 000000000..64ac944d8
--- /dev/null
+++ b/community/project/TiddlyWiki People.tid
@@ -0,0 +1,10 @@
+title: TiddlyWiki People
+modified: 20250909171928024
+created: 20250909171928024
+tags: Community About
+
+Members of the TiddlyWiki community who are involved in the development of TiddlyWiki and the running of the project are invited to [[create a Community Card|Submitting a Community Card]] so that they can be included in project plans and organisation charts. Community Cards can also showcase their interests and activities in the TiddlyWiki community.
+
+{{Community Cards Caveats}}
+
+<>
\ No newline at end of file
diff --git a/community/project/TiddlyWiki Project.tid b/community/project/TiddlyWiki Project.tid
new file mode 100644
index 000000000..b0d62cf1f
--- /dev/null
+++ b/community/project/TiddlyWiki Project.tid
@@ -0,0 +1,10 @@
+title: TiddlyWiki Project
+modified: 20250909171928024
+created: 20250909171928024
+tags: Community About
+
+The TiddlyWiki Project is the coordinated, ongoing effort to maintain and improve TiddlyWiki, and to support the TiddlyWiki community.
+
+{{Community Cards Caveats}}
+
+<$list filter="[tag[Community/Team]]" template="$:/tiddlywiki/community/cards/ViewTemplateBodyTemplateTeam"/>
\ No newline at end of file
diff --git a/community/project/Vacant Positions.tid b/community/project/Vacant Positions.tid
new file mode 100644
index 000000000..8408c793b
--- /dev/null
+++ b/community/project/Vacant Positions.tid
@@ -0,0 +1,4 @@
+title: Vacant Positions
+tags: [[TiddlyWiki Project]]
+
+If you are interested in volunteering to help the project please get in touch with <>.
\ No newline at end of file
diff --git a/community/project/teams/Core Team.tid b/community/project/teams/Core Team.tid
new file mode 100644
index 000000000..932477fc0
--- /dev/null
+++ b/community/project/teams/Core Team.tid
@@ -0,0 +1,8 @@
+title: Core Team
+tags: Community/Team
+modified: 20250909171928024
+created: 20250909171928024
+leader: @Jermolene
+team: @saqimtiaz
+
+The core team is responsible for the maintenance and development of the TiddlyWiki core and official plugins.
diff --git a/community/project/teams/Developer Experience Team.tid b/community/project/teams/Developer Experience Team.tid
new file mode 100644
index 000000000..cc6e28a62
--- /dev/null
+++ b/community/project/teams/Developer Experience Team.tid
@@ -0,0 +1,19 @@
+title: Developer Experience Team
+tags: Community/Team
+modified: 20251109200632671
+created: 20251109200632671
+leader: @pmario
+team: @saqimtiaz
+
+The Developer Experience Team improves the experience of software contributors to the TiddlyWiki project. This includes enhancing documentation, streamlining contribution processes, and providing tools and resources to help developers effectively contribute to TiddlyWiki.
+
+Tools and resources managed by the Developer Experience Team include:
+
+* Advising and assisting contributors, particularly new developers
+* Maintenance of developer-focused documentation on the https://tiddlywiki.com/dev/ site, including:
+** Development environment setup guides
+** Code review processes and best practices
+** Contribution guidelines and documentation
+* Continuous integration and deployment scripts providing feedback on pull requests
+* Devising and implementing labelling systems for issues and pull requests
+* Automation scripts to simplify common development tasks
diff --git a/community/project/teams/Infrastructure Team.tid b/community/project/teams/Infrastructure Team.tid
new file mode 100644
index 000000000..047c585a0
--- /dev/null
+++ b/community/project/teams/Infrastructure Team.tid
@@ -0,0 +1,15 @@
+created: 20250909171928024
+modified: 20251110133437795
+tags: Community/Team
+team: @MotovunJack
+title: Infrastructure Team
+
+The Infrastructure Team is responsible for maintaining and improving the infrastructure that supports the TiddlyWiki project. This includes the hosting, deployment, and management of the TiddlyWiki websites and services, as well as the tools and systems used by the TiddlyWiki community.
+
+The infrastructure includes:
+
+* talk.tiddlywiki.org
+* github.com/TiddlyWiki
+* tiddlywiki.com DNS
+* Netlify account for PR previews
+* edit.tiddlywiki.com
\ No newline at end of file
diff --git a/community/project/teams/MultiWikiServer Team.tid b/community/project/teams/MultiWikiServer Team.tid
new file mode 100644
index 000000000..922cf7582
--- /dev/null
+++ b/community/project/teams/MultiWikiServer Team.tid
@@ -0,0 +1,8 @@
+title: MultiWikiServer Team
+tags: Community/Team
+modified: 20250909171928024
+created: 20250909171928024
+leader: @Arlen22
+team:
+
+The MultiWikiServer development repository is at https://github.com/TiddlyWiki/MultiWikiServer
diff --git a/community/project/teams/Newsletter Team.tid b/community/project/teams/Newsletter Team.tid
new file mode 100644
index 000000000..2c20fd219
--- /dev/null
+++ b/community/project/teams/Newsletter Team.tid
@@ -0,0 +1,6 @@
+title: Newsletter Team
+tags: Community/Team
+modified: 20250909171928024
+created: 20250909171928024
+
+The Newsletter Team is responsible for producing the TiddlyWiki Newsletter, a monthly email newsletter that highlights news, updates, and community contributions related to TiddlyWiki.
\ No newline at end of file
diff --git a/community/project/teams/Project Team.tid b/community/project/teams/Project Team.tid
new file mode 100644
index 000000000..5cd92cc3b
--- /dev/null
+++ b/community/project/teams/Project Team.tid
@@ -0,0 +1,15 @@
+title: Project Team
+tags: Community/Team
+modified: 20250909171928024
+created: 20250909171928024
+icon: $:/tiddlywiki/community/icons/project-team
+leader: @Jermolene
+team: @saqimtiaz @ericshulman
+
+The project team is responsible for the overall TiddlyWiki project, its vision, mission and values, and ensuring that it meets the needs of the community.
+
+Areas of responsibility include:
+
+* Communicating and demonstrating the vision, mission and values of the project
+* Continuously improve the development process and practices of the project
+* more to come...
diff --git a/community/project/teams/Quality Assurance Team.tid b/community/project/teams/Quality Assurance Team.tid
new file mode 100644
index 000000000..093a0ca15
--- /dev/null
+++ b/community/project/teams/Quality Assurance Team.tid
@@ -0,0 +1,11 @@
+title: Quality Assurance Team
+created: 20251112125742296
+modified: 20251112125742296
+tags: Community/Team
+team:
+leader: @Leilei332
+
+title: Quality Assurance Team
+
+The Quality Assurance Team is responsible for ensuring the quality and reliability of TiddlyWiki releases. This includes reviewing code submissions, testing new features, identifying bugs, and verifying that fixes are effective.
+
diff --git a/community/project/teams/Succession Team.tid b/community/project/teams/Succession Team.tid
new file mode 100644
index 000000000..e57a7affd
--- /dev/null
+++ b/community/project/teams/Succession Team.tid
@@ -0,0 +1,13 @@
+title: Succession Team
+tags: Community/Team
+modified: 20250909171928024
+created: 20250909171928024
+leader: @Jermolene
+team: @saqimtiaz @ericshulman
+
+The Succession Team is responsible for ensuring that personnel changes do not impact access to the external infrastructure used by the project.
+
+* Work with the other teams to ensure that the project has a succession plan for key personnel
+* Work with the other teams to ensure that they are using the appropriate, community-owned infrastructure
+* Ensure that the members of the succession team share ownership of the key project resources (eg passwords and user accounts). The Succession Team is not expected to use their access rights apart from managing access in the event of personnel changes
+
diff --git a/community/project/teams/tagCommunityTeam.tid b/community/project/teams/tagCommunityTeam.tid
new file mode 100644
index 000000000..426e98f6c
--- /dev/null
+++ b/community/project/teams/tagCommunityTeam.tid
@@ -0,0 +1,5 @@
+title: Community/Team
+modified: 20250909171928024
+created: 20250909171928024
+list: [[Project Team]] [[Core Team]] [[Documentation Team]] [[Quality Assurance Team]] [[Infrastructure Team]] [[MultiWikiServer Team]] [[Newsletter Team]] [[Succession Team]]
+
diff --git a/community/readme.md b/community/readme.md
new file mode 100644
index 000000000..09cd58c5b
--- /dev/null
+++ b/community/readme.md
@@ -0,0 +1,3 @@
+# Community Records and Resources
+
+These raw tiddlers comprise the community records and resources for the TiddlyWiki project. They are packaged as a root directory outside of the usual "editions" folder so that they can be shared with other wikis.
diff --git a/community/tools/cards/DefaultColourMappings.multids b/community/tools/cards/DefaultColourMappings.multids
new file mode 100644
index 000000000..6cab7fdc8
--- /dev/null
+++ b/community/tools/cards/DefaultColourMappings.multids
@@ -0,0 +1,15 @@
+title: $:/config/DefaultColourMappings/
+
+community-card-background: #ffffee
+community-card-foreground: #441111
+community-card-dark-shadow: rgba(188, 189, 189, 0.5)
+community-card-shadow: rgba(212, 212, 213, 0.5)
+community-card-header-background: #9e3060
+community-card-header-foreground: #ddddee
+community-card-team-header-background: #306090
+community-card-team-header-foreground: #ddeedd
+community-card-vacancy-header-background: #609030
+community-card-vacancy-header-foreground: #eedddd
+community-card-info-background: #f3f38b
+community-card-info-foreground: #444411
+community-card-field-name-foreground: #888844
diff --git a/community/tools/cards/Procedures.tid b/community/tools/cards/Procedures.tid
new file mode 100644
index 000000000..9d3879012
--- /dev/null
+++ b/community/tools/cards/Procedures.tid
@@ -0,0 +1,168 @@
+title: $:/tiddlywiki/community/cards/Procedures
+tags: $:/tags/Global
+
+\procedure community-card-display-jpeg-field(fieldName,mode:"block",default)
+<$genesis $type={{{ [match[block]then[div]else[span]] }}} class={{{ tc-community-card-field-image [[tc-community-card-field-image-]addsuffix] +[join[ ]] }}}>
+ <%if [has] %>
+ getaddprefix[data:image/jpeg;base64,]] }}} width="32"/>
+ <%else%>
+ <$transclude $tiddler=<> $mode=<>/>
+ <%endif%>
+$genesis>
+\end community-card-display-jpeg-field
+
+\procedure community-card-display-transclusion(fieldName,mode:"inline",default)
+<$genesis $type={{{ [match[block]then[div]else[span]] }}} class={{{ tc-community-card-field-image [[tc-community-card-field-image-]addsuffix] +[join[ ]] }}}>
+ <%if [has] %>
+ <$transclude $tiddler={{{ [get] }}} $mode=<>/>
+ <%else%>
+ <$transclude $tiddler=<> $mode=<>/>
+ <%endif%>
+$genesis>
+\end community-card-display-transclusion
+
+\procedure community-card-display-text-field(fieldName,showLabel:"yes",linkPrefix,displayPrefix,mode:"block")
+<%if [has] :or[match[title]] %>
+ <$genesis $type={{{ [match[block]then[div]else[span]] }}} class={{{ tc-community-card-field-text [[tc-community-card-field-text-]addsuffix] +[join[ ]] }}}>
+ <%if [match[yes]] %>
+ <$text text=<>/>
+ <%endif%>
+ <%if [!match[]] %>
+ getaddprefix] }}}
+ class="tc-community-card-field-text-value"
+ rel="noopener noreferrer"
+ target="_blank"
+ >
+ <$text text={{{ [get] :else[match[title]then] +[addprefix] }}}/>
+
+ <%else%>
+
+ <$text text={{{ [get] :else[match[title]then] +[addprefix] }}}/>
+
+ <%endif%>
+ $genesis>
+<%endif%>
+\end community-card-display-text-field
+
+\procedure community-card-person(title)
+ <$let currentTiddler=<>>
+