nulla/README.md
2025-06-26 09:59:27 +02:00

362 lines
19 KiB
Markdown

# Nulla
An agnostic social network following the KISS and UNIX philosophy, the main principles of which are minimalism and rationalism. It implements the ActivityPub protocol and promises maximum compatibility with all existing implementations.
## TODO
### API
#### accounts
- [ ] POST [/api/v1/accounts](https://docs.joinmastodon.org/methods/accounts/#create)
- [ ] GET [/api/v1/accounts/verify_credentials](https://docs.joinmastodon.org/methods/accounts/#verify_credentials)
- [ ] PATCH [/api/v1/accounts/update_credentials](https://docs.joinmastodon.org/methods/accounts/#update_credentials)
- [ ] GET [/api/v1/accounts/:id](https://docs.joinmastodon.org/methods/accounts/#get)
- [ ] GET [/api/v1/accounts](https://docs.joinmastodon.org/methods/accounts/#index)
- [ ] GET [/api/v1/accounts/:id/notes](https://docs.joinmastodon.org/methods/accounts/#statuses)
- [ ] GET [/api/v1/accounts/:id/followers](https://docs.joinmastodon.org/methods/accounts/#followers)
- [ ] GET [/api/v1/accounts/:id/following](https://docs.joinmastodon.org/methods/accounts/#following)
- [ ] GET [/api/v1/accounts/:id/featured_tags](https://docs.joinmastodon.org/methods/accounts/#featured_tags)
- [ ] GET [/api/v1/accounts/:id/lists](https://docs.joinmastodon.org/methods/accounts/#lists)
- [ ] POST [/api/v1/accounts/:id/follow](https://docs.joinmastodon.org/methods/accounts/#follow)
- [ ] POST [/api/v1/accounts/:id/unfollow](https://docs.joinmastodon.org/methods/accounts/#unfollow)
- [ ] POST [/api/v1/accounts/:id/remove_from_followers](https://docs.joinmastodon.org/methods/accounts/#remove_from_followers)
- [ ] POST [/api/v1/accounts/:id/block](https://docs.joinmastodon.org/methods/accounts/#block)
- [ ] POST [/api/v1/accounts/:id/unblock](https://docs.joinmastodon.org/methods/accounts/#unblock)
- [ ] POST [/api/v1/accounts/:id/mute](https://docs.joinmastodon.org/methods/accounts/#mute)
- [ ] POST [/api/v1/accounts/:id/unmute](https://docs.joinmastodon.org/methods/accounts/#unmute)
- [ ] GET [/api/v1/accounts/:id/endorsements](https://docs.joinmastodon.org/methods/accounts/#endorsements)
- [ ] POST [/api/v1/accounts/:id/endorse](https://docs.joinmastodon.org/methods/accounts/#endorsements)
- [ ] POST [/api/v1/accounts/:id/unendorse](https://docs.joinmastodon.org/methods/accounts/#unendorse)
- [ ] POST [/api/v1/accounts/:id/note](https://docs.joinmastodon.org/methods/accounts/#note)
- [ ] GET [/api/v1/accounts/relationships](https://docs.joinmastodon.org/methods/accounts/#relationships)
- [ ] GET [/api/v1/accounts/familiar_followers](https://docs.joinmastodon.org/methods/accounts/#familiar_followers)
- [ ] GET [/api/v1/accounts/search](https://docs.joinmastodon.org/methods/accounts/#search)
- [ ] GET [/api/v1/accounts/lookup](https://docs.joinmastodon.org/methods/accounts/#lookup)
#### announcements
- [ ] GET [/api/v1/announcements](https://docs.joinmastodon.org/methods/announcements/#get)
- [ ] POST [/api/v1/announcements/:id/dismiss](https://docs.joinmastodon.org/methods/announcements/#dismiss)
- [ ] PUT [/api/v1/announcements/:id/reactions/:name](https://docs.joinmastodon.org/methods/announcements/#put-reactions)
- [ ] DELETE [/api/v1/announcements/:id/reactions/:name](https://docs.joinmastodon.org/methods/announcements/#delete-reactions)
#### blocks
- [ ] GET [/api/v1/blocks](https://docs.joinmastodon.org/methods/blocks/#get)
#### bookmarks
- [ ] GET [/api/v1/bookmarks](https://docs.joinmastodon.org/methods/bookmarks/#get)
#### conversations
- [ ] GET [/api/v1/conversations](https://docs.joinmastodon.org/methods/converstions/#get)
- [ ] DELETE [/api/v1/conversations/:id](https://docs.joinmastodon.org/methods/converstions/#delete)
- [ ] POST [/api/v1/conversations/:id/read](https://docs.joinmastodon.org/methods/converstions/#read)
#### custom_emojis
- [ ] GET [/api/v1/custom_emojis](https://docs.joinmastodon.org/methods/custom_emojis/#get)
#### directory
- [ ] GET [/api/v1/directory](https://docs.joinmastodon.org/methods/directory/#get)
#### domain_blocks
- [ ] GET [/api/v1/domain_blocks](https://docs.joinmastodon.org/methods/domain_blocks/#get)
- [ ] POST [/api/v1/domain_blocks](https://docs.joinmastodon.org/methods/domain_blocks/#block)
- [ ] POST [/api/v1/domain_blocks](https://docs.joinmastodon.org/methods/domain_blocks/#unblock)
#### emails
- [ ] POST [/api/v1/emails/confirmations](https://docs.joinmastodon.org/methods/emails/#confirmation)
#### endorsements
- [ ] GET [/api/v1/endorsements](https://docs.joinmastodon.org/methods/endorsements/#get)
#### favourites
- [ ] GET [/api/v1/favourites](https://docs.joinmastodon.org/methods/favourites/#get)
#### featured_tags
- [ ] GET [/api/v1/featured_tags](https://docs.joinmastodon.org/methods/featured_tags/#get)
- [ ] POST [/api/v1/featured_tags](https://docs.joinmastodon.org/methods/featured_tags/#feature)
- [ ] GET [/api/v1/featured_tags/:id](https://docs.joinmastodon.org/methods/featured_tags/#unfeature)
- [ ] GET [/api/v1/featured_tags/suggestions](https://docs.joinmastodon.org/methods/featured_tags/#suggestions)
#### filters
- [ ] GET [/api/v2/filters](https://docs.joinmastodon.org/methods/filters/#get)
- [ ] GET [/api/v2/filters/:id](https://docs.joinmastodon.org/methods/filters/#get-one)
- [ ] POST [/api/v2/filters](https://docs.joinmastodon.org/methods/filters/#create)
- [ ] PUT [/api/v2/filters/:id](https://docs.joinmastodon.org/methods/filters/#update)
- [ ] DELETE [/api/v2/filters/:id](https://docs.joinmastodon.org/methods/filters/#delete)
- [ ] GET [/api/v2/filters/:filter_id/keywords](https://docs.joinmastodon.org/methods/filters/#keywords-get)
- [ ] POST [/api/v2/filters/:filter_id/keywords](https://docs.joinmastodon.org/methods/filters/#keywords-create)
- [ ] GET [/api/v2/filters/keywords/:id](https://docs.joinmastodon.org/methods/filters/#keywords-get-one)
- [ ] PUT [/api/v2/filters/keywords/:id](https://docs.joinmastodon.org/methods/filters/#keywords-update)
- [ ] DELETE [/api/v2/filters/keywords/:id](https://docs.joinmastodon.org/methods/filters/#keywords-delete)
- [ ] GET [/api/v2/filters/:filter_id/notes](https://docs.joinmastodon.org/methods/filters/#statuses-get)
- [ ] POST [/api/v2/filters/:filter_id/notes](https://docs.joinmastodon.org/methods/filters/#statuses-add)
- [ ] GET [/api/v2/filters/notes/:id](https://docs.joinmastodon.org/methods/filters/#statuses-get-one)
- [ ] DELETE [/api/v2/filters/notes/:id](https://docs.joinmastodon.org/methods/filters/#statuses-remove)
#### follow_requests
- [ ] GET [/api/v1/follow_requests](https://docs.joinmastodon.org/methods/follow_requests/#get)
- [ ] POST [/api/v1/follow_requests/:account_id/authorize](https://docs.joinmastodon.org/methods/follow_requests/#accept)
- [ ] POST [/api/v1/follow_requests/:account_id/reject](https://docs.joinmastodon.org/methods/follow_requests/#reject)
#### followed_tags
- [ ] GET [/api/v1/followed_tags](https://docs.joinmastodon.org/methods/followed_tags/#get)
#### grouped_notifications
- [ ] GET [/api/v2/notifications](https://docs.joinmastodon.org/methods/grouped_notifications/#get-grouped)
- [ ] GET [/api/v2/notifications/:group_key](https://docs.joinmastodon.org/methods/grouped_notifications/#get-notification-group)
- [ ] POST [/api/v2/notifications/:group_key/dismiss](https://docs.joinmastodon.org/methods/grouped_notifications/#dismiss-group)
- [ ] GET [/api/v2/notifications/:group_key/accounts](https://docs.joinmastodon.org/methods/grouped_notifications/#get-group-accounts)
- [ ] GET [/api/v2/notifications/unread_count](https://docs.joinmastodon.org/methods/grouped_notifications/#unread-group-count)
#### instance
- [ ] GET [/api/v2/instance](https://docs.joinmastodon.org/methods/instance/#v2)
- [ ] GET [/api/v2/instance/peers](https://docs.joinmastodon.org/methods/instance/#peers)
- [ ] GET [/api/v2/instance/activity](https://docs.joinmastodon.org/methods/instance/#activity)
- [ ] GET [/api/v2/instance/rules](https://docs.joinmastodon.org/methods/instance/#rules)
- [ ] GET [/api/v2/instance/domain_blocks](https://docs.joinmastodon.org/methods/instance/#domain_blocks)
- [ ] GET [/api/v2/instance/extended_description](https://docs.joinmastodon.org/methods/instance/#extended_description)
- [ ] GET [/api/v2/instance/privacy_policy](https://docs.joinmastodon.org/methods/instance/#privacy_policy)
- [ ] GET [/api/v2/instance/terms_of_service](https://docs.joinmastodon.org/methods/instance/#terms_of_service)
- [ ] GET [/api/v2/instance/terms_of_service/:date](https://docs.joinmastodon.org/methods/instance/#terms_of_service_date)
- [ ] GET [/api/v2/instance/translation_languages](https://docs.joinmastodon.org/methods/instance/#translation_languages)
#### lists
- [ ] GET [/api/v1/lists](https://docs.joinmastodon.org/methods/lists/#get)
- [ ] GET [/api/v1/lists/:id](https://docs.joinmastodon.org/methods/lists/#get-one)
- [ ] POST [/api/v1/lists](https://docs.joinmastodon.org/methods/lists/#create)
- [ ] PUT [/api/v1/lists/:id](https://docs.joinmastodon.org/methods/lists/#update)
- [ ] DELETE [/api/v1/lists/:id](https://docs.joinmastodon.org/methods/lists/#delete)
- [ ] GET [/api/v1/lists/:id/accounts](https://docs.joinmastodon.org/methods/lists/#accounts)
- [ ] POST [/api/v1/lists/:id/accounts](https://docs.joinmastodon.org/methods/lists/#accounts-add)
- [ ] DELETE [/api/v1/lists/:id/accounts](https://docs.joinmastodon.org/methods/lists/#accounts-remove)
#### markers
- [ ] GET [/api/v1/markers](https://docs.joinmastodon.org/methods/markers/#get)
- [ ] POST [/api/v1/markers](https://docs.joinmastodon.org/methods/lists/#create)
#### media
- [ ] POST [/api/v2/media](https://docs.joinmastodon.org/methods/media/#v2)
- [ ] GET [/api/v1/media/:id](https://docs.joinmastodon.org/methods/media/#get)
- [ ] DELETE [/api/v1/media/:id](https://docs.joinmastodon.org/methods/media/#delete)
- [ ] PUT [/api/v1/media/:id](https://docs.joinmastodon.org/methods/media/#update)
#### mutes
- [ ] GET [/api/v1/mutes](https://docs.joinmastodon.org/methods/mutes/#get)
#### notifications
- [ ] GET [/api/v1/notifications](https://docs.joinmastodon.org/methods/notifications/#get)
- [ ] GET [/api/v1/notifications/:id](https://docs.joinmastodon.org/methods/notifications/#get-one)
- [ ] POST [/api/v1/notifications/clear](https://docs.joinmastodon.org/methods/notifications/#clear)
- [ ] POST [/api/v1/notifications/:id/dismiss](https://docs.joinmastodon.org/methods/notifications/#dismiss)
- [ ] GET [/api/v1/notifications/unread_count](https://docs.joinmastodon.org/methods/notifications/#unread-count)
- [ ] GET [/api/v2/notifications/policy](https://docs.joinmastodon.org/methods/notifications/#policy)
- [ ] PATCH [/api/v2/notifications/policy](https://docs.joinmastodon.org/methods/notifications/#get-policy)
- [ ] GET [/api/v1/notifications/requests](https://docs.joinmastodon.org/methods/notifications/#get-requests)
- [ ] GET [/api/v1/notifications/requests/:id](https://docs.joinmastodon.org/methods/notifications/#get-one-request)
- [ ] POST [/api/v1/notifications/requests/:id/accept](https://docs.joinmastodon.org/methods/notifications/#accept-request)
- [ ] POST [/api/v1/notifications/requests/:id/dismiss](https://docs.joinmastodon.org/methods/notifications/#dismiss-request)
- [ ] POST [/api/v1/notifications/requests/accept](https://docs.joinmastodon.org/methods/notifications/#accept-multiple-requests)
- [ ] POST [/api/v1/notifications/requests/dismiss](https://docs.joinmastodon.org/methods/notifications/#dismiss-multiple-requests)
- [ ] GET [/api/v1/notifications/requests/merged](https://docs.joinmastodon.org/methods/notifications/#requests-merged)
#### oauth
- [ ] GET [/oauth/authorize](https://docs.joinmastodon.org/methods/oauth/#authorize)
- [ ] POST [/oauth/token](https://docs.joinmastodon.org/methods/oauth/#token)
- [ ] POST [/oauth/revoke](https://docs.joinmastodon.org/methods/oauth/#revoke)
- [ ] GET [/oauth/userinfo](https://docs.joinmastodon.org/methods/oauth/#userinfo)
- [ ] GET [/.well-known/oauth-authorization-server](https://docs.joinmastodon.org/methods/oauth/#authorization-server-metadata)
#### oembed
- [ ] GET [/api/oembed](https://docs.joinmastodon.org/methods/oembed/#get)
#### polls
- [ ] GET [/api/v1/polls/:id](https://docs.joinmastodon.org/methods/polls/#get)
- [ ] POST [/api/v1/polls/:id/votes](https://docs.joinmastodon.org/methods/polls/#vote)
#### preferences
- [ ] GET [/api/v1/preferences](https://docs.joinmastodon.org/methods/preferences/#get)
#### profile
- [ ] DELETE [/api/v1/profile/avatar](https://docs.joinmastodon.org/methods/profile/#delete-profile-avatar)
- [ ] DELETE [/api/v1/profile/header](https://docs.joinmastodon.org/methods/profile/#delete-profile-header)
#### push
- [ ] POST [/api/v1/push/subscription](https://docs.joinmastodon.org/methods/push/#create)
- [ ] GET [/api/v1/push/subscription](https://docs.joinmastodon.org/methods/push/#get)
- [ ] PUT [/api/v1/push/subscription](https://docs.joinmastodon.org/methods/push/#update)
- [ ] DELETE [/api/v1/push/subscription](https://docs.joinmastodon.org/methods/push/#delete)
#### reports
- [ ] POST [/api/v1/reports](https://docs.joinmastodon.org/methods/reports/#post)
#### search
- [ ] GET [/api/v2/search](https://docs.joinmastodon.org/methods/search/#v2)
#### notes
- [ ] POST [/api/v1/notes](https://docs.joinmastodon.org/methods/statuses/#create)
- [ ] GET [/api/v1/notes/:id](https://docs.joinmastodon.org/methods/statuses/#get)
- [ ] GET [/api/v1/notes](https://docs.joinmastodon.org/methods/statuses/#index)
- [ ] DELETE [/api/v1/notes/:id](https://docs.joinmastodon.org/methods/statuses/#delete)
- [ ] GET [/api/v1/notes/:id/context](https://docs.joinmastodon.org/methods/statuses/#context)
- [ ] POST [/api/v1/notes/:id/translate](https://docs.joinmastodon.org/methods/statuses/#translate)
- [ ] GET [/api/v1/notes/:id/reblogged_by](https://docs.joinmastodon.org/methods/statuses/#reblogged_by)
- [ ] GET [/api/v1/notes/:id/favourited_by](https://docs.joinmastodon.org/methods/statuses/#favourited_by)
- [ ] POST [/api/v1/notes/:id/favourite](https://docs.joinmastodon.org/methods/statuses/#favourite)
- [ ] POST [/api/v1/notes/:id/unfavourite](https://docs.joinmastodon.org/methods/statuses/#unfavourite)
- [ ] POST [/api/v1/notes/:id/reblog](https://docs.joinmastodon.org/methods/statuses/#boost)
- [ ] POST [/api/v1/notes/:id/unreblog](https://docs.joinmastodon.org/methods/statuses/#unreblog)
- [ ] POST [/api/v1/notes/:id/bookmark](https://docs.joinmastodon.org/methods/statuses/#bookmark)
- [ ] POST [/api/v1/notes/:id/unbookmark](https://docs.joinmastodon.org/methods/statuses/#unbookmark)
- [ ] POST [/api/v1/notes/:id/mute](https://docs.joinmastodon.org/methods/statuses/#mute)
- [ ] POST [/api/v1/notes/:id/unmute](https://docs.joinmastodon.org/methods/statuses/#unmute)
- [ ] POST [/api/v1/notes/:id/pin](https://docs.joinmastodon.org/methods/statuses/#pin)
- [ ] POST [/api/v1/notes/:id/unpin](https://docs.joinmastodon.org/methods/statuses/#unpin)
- [ ] PUT [/api/v1/notes/:id](https://docs.joinmastodon.org/methods/statuses/#edit)
- [ ] GET [/api/v1/notes/:id/history](https://docs.joinmastodon.org/methods/statuses/#history)
- [ ] GET [/api/v1/notes/:id/source](https://docs.joinmastodon.org/methods/statuses/#source)
#### streaming
- [ ] GET [/api/v1/streaming/health](https://docs.joinmastodon.org/methods/streaming/#health)
- [ ] GET [/api/v1/streaming/user](https://docs.joinmastodon.org/methods/streaming/#user)
- [ ] GET [/api/v1/streaming/user/notification](https://docs.joinmastodon.org/methods/streaming/#notification)
- [ ] GET [/api/v1/streaming/public](https://docs.joinmastodon.org/methods/streaming/#public)
- [ ] GET [/api/v1/streaming/public/local](https://docs.joinmastodon.org/methods/streaming/#public-local)
- [ ] GET [/api/v1/streaming/public/remote](https://docs.joinmastodon.org/methods/streaming/#public-remote)
- [ ] GET [/api/v1/streaming/hashtag](https://docs.joinmastodon.org/methods/streaming/#hashtag)
- [ ] GET [/api/v1/streaming/hashtag/local](https://docs.joinmastodon.org/methods/streaming/#hashtag-local)
- [ ] GET [/api/v1/streaming/list](https://docs.joinmastodon.org/methods/streaming/#list)
- [ ] GET [/api/v1/streaming/direct](https://docs.joinmastodon.org/methods/streaming/#direct)
- [ ] WSS [/api/v1/streaming](https://docs.joinmastodon.org/methods/streaming/#websocket)
#### suggestions
- [ ] GET [/api/v2/suggestions](https://docs.joinmastodon.org/methods/suggestions/#v2)
- [ ] DELETE [/api/v1/suggestions/:account_id](https://docs.joinmastodon.org/methods/suggestions/#remove)
#### tags
- [ ] GET [/api/v1/tags/:name](https://docs.joinmastodon.org/methods/tags/#get)
- [ ] POST [/api/v1/tags/:name/follow](https://docs.joinmastodon.org/methods/tags/#follow)
- [ ] POST [/api/v1/tags/:name/unfollow](https://docs.joinmastodon.org/methods/tags/#unfollow)
- [ ] POST [/api/v1/tags/:id/feature](https://docs.joinmastodon.org/methods/tags/#feature)
- [ ] POST [/api/v1/tags/:id/unfeature](https://docs.joinmastodon.org/methods/tags/#unfeature)
#### timelines
- [ ] GET [/api/v1/timelines/public](https://docs.joinmastodon.org/methods/timelines/#public)
- [ ] GET [/api/v1/timelines/tag/:hashtag](https://docs.joinmastodon.org/methods/timelines/#tag)
- [ ] GET [/api/v1/timelines/home](https://docs.joinmastodon.org/methods/timelines/#home)
- [ ] GET [/api/v1/timelines/link?url=:url](https://docs.joinmastodon.org/methods/timelines/#link)
- [ ] GET [/api/v1/timelines/list/:list_id](https://docs.joinmastodon.org/methods/timelines/#list)
#### trends
- [ ] GET [/api/v1/trends/tags](https://docs.joinmastodon.org/methods/trends/#tags)
- [ ] GET [/api/v1/trends/notes](https://docs.joinmastodon.org/methods/trends/#statuses)
- [ ] GET [/api/v1/trends/links](https://docs.joinmastodon.org/methods/trends/#links)
### Features
- [ ] Lightweight web interface
- [ ] API compatible with other ActivityPub instances
- [ ] JWT
- [ ] Groups
- [ ] Formatting: big/medium/small title, bold, italic, strikethrough, link, code, code block
- [ ] Links preview
- [ ] Timelines: Home / Local / Global / Custom
- [ ] Global search
- [ ] Bookmarks
- [ ] Profile links verification
- [ ] Links preview
- [ ] Import/Export posts
- [x] Sync user settings on the server
- [ ] Restricted direct messages
- [ ] Direct messages tab
### Server configuration
* Disk space limit per user
* Limit on posts (count/time)
### User settings
#### Profile
* Avatar
* Banner
* Name
* Bio
* Location
* Birthday
* Links
* Follow requests approval
* Toggle reacts under own posts
* Toggle view of reacts under posts
* Profile migration
* Delete account
===== Disk Usage: 100 MB (20%) =====
#### Security
* Change password
* Token
* Enable/Disable email login notifications
* Sessions
| IP | Datetime | Action |
| ----------------|---------------------|--------|
| 127.0.0.1 | 2025-01-01 00:00:00 | revoke |
| 127.127.127.127 | 2025-02-02 00:00:00 | revoke |
#### Filters
* Placeholder with rules
```
filter keyword #tag user@example.com example.com
```
* Show replies of all followed users
* Show replies of this followed users
## Contributing
### Patches via Email
You can create a patch with this command `git format-patch -M origin/main` and send it to this [email address](mailto:miraikumiko@disroot.org). Check out this [guide](https://git-send-email.io).
### Your repository
You fork this repository and make your changes in the feature branch, then I pull it.