https://github.com/lavafroth/publicly
Authenticate publicly, chat privately.
https://github.com/lavafroth/publicly
chat irc ssh ssh-chat tui tui-rs
Last synced: 5 months ago
JSON representation
Authenticate publicly, chat privately.
- Host: GitHub
- URL: https://github.com/lavafroth/publicly
- Owner: lavafroth
- License: agpl-3.0
- Created: 2025-03-18T16:32:30.000Z (over 1 year ago)
- Default Branch: master
- Last Pushed: 2026-01-11T12:56:04.000Z (5 months ago)
- Last Synced: 2026-01-11T16:51:53.821Z (5 months ago)
- Topics: chat, irc, ssh, ssh-chat, tui, tui-rs
- Language: Rust
- Homepage:
- Size: 309 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
README
# publicly
Authenticate publicly, chat privately.
*Publicly* is a lean, *invite only* chat server over SSH connections.
### Quickstart
Install *publicly* either by downloading a release or building from source.
```sh
cargo install --git https://github.com/lavafroth/publicly
```
Generate a keypair for the administrator.
```sh
ssh-keygen -f op -C "op:admin" -t ed25519 -N ""
mv op.pub Authfile
```
Deploy.
```sh
publicly
```
This binds to port 2222 on all interfaces. Members with the respective
private keys can join like so:
```sh
ssh 0.0.0.0 -p 2222 -oStrictHostKeyChecking=No -i op
```
Here, the private key file is named `op`.
### Roadmap
- [x] SSH authentication and authorization
- [x] Emacs-like shortcuts for textarea
- [x] multiline support with `Alt` `Return`
- [x] Adjustable parameters:
- [x] history size
- [x] Authfile path
- [x] Listening port number
- [x] `/add` command to add new keys
- [x] `/reload` command to reload the Authfile
- [x] `/rename` command
- [x] `/commit` command to commit in-memory changes to Authfile
- [ ] `#mention` tags
### Authfile
The `Authfile` is the source of truth.
Keys can be added via the chat interface with the `/add` command
but they won't persist over multiple runs of the server
unless they are committed using the `/commit` command.
Consider the keys in the example `Authfile`
```
ssh-ed25519 AAAA... bob@work
ssh-ed25519 AAAA... h@cafe:admin
```
The Authfile intentionally uses the same format as the `~/.ssh/authorized_keys` file,
with the only difference being that it parses the last field, the comment, to assign usernames.
For example, the first key has a comment `bob@work` which will be the username assigned to
anyone joining with the respective key. Further, `bob@work` can join only with normal privileges.
`h@cafe`, whose comment is tagged as `:admin` will be able to join the chat with admin privileges.
> [!NOTE]
Usernames may only contain ASCII alphanumeric characters and the symbols `@-_.`.
All other characters will be stripped.