Accept Parrhesia batch delivery in the timeline LiveView and reuse the existing note processing path for filtering, de-duplication, profile cache updates, and stream insertion. Add a regression test that sends the batched message shape to the LiveView.
Aether
aether is an external Tribes plugin that provides the social@1
capability.
Getting Started
Install deps and run the test suite:
mix deps.get
scripts/plugin test
If you are using the shared tribes devenv, run the plugin through the local plugin helper instead:
devenv shell -- plugin validate
devenv shell -- plugin test
devenv shell -- plugin precommit
Development
For local development alongside a Tribes checkout:
# Symlink into the host plugins directory once
cd /path/to/tribes
ln -s /path/to/tribes-plugin-aether plugins/aether
# Start the Tribes dev server
iex --sname dev -S mix phx.server
Then edit aether in its own repo. In development, the Tribes host watches
symlinked external plugins and automatically:
- runs
mix compilefor Elixir, HEEx, manifest, and migration changes - runs
npm run build --prefix assets - reloads the plugin in the running Tribes VM
- triggers a Phoenix browser reload after the rebuild finishes
That means the normal loop is:
cd /path/to/tribes-plugin-aether
mix deps.get
# in another terminal
cd /path/to/tribes
iex --sname dev -S mix phx.server
Inside the plugin repo's devenv shell, the plugin helper forwards to the host devenv automatically:
plugin validate
plugin test
plugin precommit
Use plugin test / plugin precommit for host-backed tests. Plain mix test
and mix precommit print this guidance; use mix raw_test /
mix raw_precommit only for deliberate low-level debugging after setting the
same host environment yourself.
Project Structure
aether/
├── manifest.json
├── mix.exs
├── lib/
│ ├── aether/
│ │ ├── application.ex
│ │ └── plugin.ex
│ └── aether_web/
│ └── live/
├── assets/
│ ├── css/aether.css
│ ├── js/aether.js
│ ├── package.json
│ └── package-lock.json
├── priv/
└── test/
Manifest
manifest.json declares the plugin contract:
{
"name": "aether",
"version": "0.1.0",
"entry_module": "Tribes.Plugins.Aether.Plugin",
"host_api": "1",
"otp_app": "aether",
"provides": ["social@1"],
"requires": ["ui@1"],
"enhances_with": [],
"assets": {
"global_js": ["aether.js"],
"global_css": ["aether.css"]
}
}
See the host plugin docs in PLUGINS.md for the full manifest and runtime contract.
Building for Release
MIX_ENV=prod mix compile
npm run build --prefix assets
Guix packaging assembles the plugin artifact from the compiled BEAM output,
priv/, and manifest.json. Enable it from the guix-tribes channel-side node
configuration.