context-attachment-manager
Codex and Claude Code plugin (works in Claude Desktop): choose which past images go to the model with your next message. Unchecked images become placeholders, the conversation goes on, and requests st
The room votes, anonymously and once each. At the threshold, the meeting ends. A Teams app by Den Frie Vilje. Free.
PluginsTypeScript · ShellGitHub @den-frie-viljeOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
A Microsoft Teams app that ends the meeting when enough of the room has voted to, anonymously.
Taken from the repository README
Loading the full README.
Read the full README ↗Adjourn is a Microsoft Teams app for meetings. It posts one card in the meeting chat. Anyone in the meeting can press its button to vote to end the meeting, anonymously and once. When the share of those present reaches the threshold, the organiser gets a private notification on the meeting stage asking them to end it.
Teams gives no app a way to end a meeting for everyone, so the organiser presses the button. Adjourn supplies the numbers.
| One card | Posted when Adjourn is added to the meeting chat, and again when a scheduled meeting starts. It shows the count and the button, never names. |
| One vote each | A second press is answered privately with "You have already voted". Votes cannot be withdrawn. |
| Counted against those present | Votes are measured against the people in the meeting at that moment, not the invitation list. |
| A threshold | 50 percent by default. The organiser can set 50, 67, 75 or 100 from the card. |
| A private ask | At the threshold the organiser gets a targeted notification on the meeting stage with the count and the two clicks that end the meeting. |
Clone and install:
git clone https://github.com/den-frie-vilje/adjourn
cd adjourn && pnpm install
Open a tunnel to port 3978 and note its hostname. With Microsoft's dev tunnels:
devtunnel user login
devtunnel create --allow-anonymous
devtunnel port create -p 3978
devtunnel host
Register the bot. Either in the Teams Developer Portal under Tools › Bot management › New bot, with the messaging endpoint https://<your-host>/api/messages, and create a client secret; or with the Teams CLI (npm install -g @microsoft/teams.cli, teams login, then teams app create --endpoint https://<your-host>/api/messages --name Adjourn --env .env).
Put the ids in .env in the repository root:
CLIENT_ID=<the bot's app id>
CLIENT_SECRET=<the client secret>
TENANT_ID=<your tenant id>
BOT_DOMAIN=<your-host, no scheme>
Start the bot and build the app package:
pnpm dev
pnpm package
In Teams, open the meeting's chat or the meeting itself, select Apps, then Manage your apps › Upload an app › Upload a custom app, and choose appPackage/adjourn.zip. The organiser or a presenter consents to the permissions once. Adjourn posts its card.
Change the code and the running bot picks it up; change the manifest and upload the package again.
The whole app is src/app.ts, src/card.ts and src/motion.ts, on the Teams SDK for TypeScript.
adaptiveCard/action invoke. Teams authenticates the sender; nothing is posted to the chat. Adjourn stores a salted hash of the sender's id in the motion, declines a second press, and answers privately.ceil(present × threshold / 100), Adjourn fetches the meeting's organiser and sends a targeted in-meeting notification that opens docs/motion/index.html from this repository's GitHub Pages site, with the count in the URL. The card closes.Motions live in memory. Restarting the bot forgets open motions; the next meeting start opens a fresh one.
validDomains. The shipped manifest lists den-frie-vilje.github.io. Change MOTION_PAGE_URL and the manifest together if you host the page elsewhere.Adjourn keeps, for the length of a meeting and in the memory of one process: the threshold, a salted hash per voter, and the id of its own card message. It never stores or shows who voted. It reads the meeting's basic details, who is in it and the chat's members, sends messages to the chat and one notification to the organiser, and nothing else. No database, no telemetry, no account.
pnpm typecheck
pnpm test
pnpm build
The product page is docs/index.html, served by GitHub Pages; scripts/og.sh renders its social image and this README's hero from docs/og.html and docs/readme-hero.html.
MIT. Copyright Den Frie Vilje ApS.