self 0fa953420b fix: handle batched aether note events
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.
2026-05-23 15:59:44 +02:00
2026-03-25 12:42:19 +01:00
2026-03-25 12:42:19 +01:00
2026-04-26 22:06:08 +02:00
2026-04-09 10:44:46 +02:00
2026-03-25 12:42:19 +01:00
2026-05-21 12:42:42 +02:00
2026-04-09 10:44:46 +02:00
2026-04-09 10:44:46 +02:00

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 compile for 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.

S
Description
Tribes Aether Plugin (Twitter/DMs/Chat)
Readme 696 KiB
Languages
Elixir 91.6%
Shell 3.6%
Nix 2.2%
Scheme 1.9%
JavaScript 0.5%
Other 0.2%