If you run a bitcoin meetup, this is for you:
Meetup.Com backup/replacement using nostr also pulls in events on existing meetup page (external link to @Derek Ross's Plektos) https://kcbitcoiners.com/calendar
Embeded/Private @npub15guz...twuk add locations using nostr.
https://kcbitcoiners.com/shop
This is a static website hosted on s3 so even non technical folks could deploy it super easily. If anyone finds this useful, I could fork it and make a generalized version for any meetup/group. There is a simple whitelist of npubs in the code for who can add events or locations.
Thread
Login to reply
Replies (35)
@BTC Map this is what I was talking about attestations via nostr. This is v0.0.1, but if you want to discuss how this could be used on your site I would love to chat. Planning to add individual attestations for each location vs grouped (ie bitcoin, lightning, seed oil free, etc.)
Niiice!
This is using the Place NIP?
@Nathan Day also created the Attestation NIP for Proof of Place, which is kinda what you are doing here.
We're currently think about an OSM-Nostr bridge.
Nathan Day
# Abstract
Nostr lacks a standardized, interoperable way to make, track, and revoke truthfulness claims about Nostr events.
This NIP introduces Attestations, which provides a base structure to:
- **Make attestations** about that validity of *any other* event on Nostr of *any* kind;
- **Revoke attestations** about previous validity claims.
This base Attestation structure can *optionally* be extended to:
- Manage simple attestation lifecycles;
- Request attestations from other npubs;
- Recommend individual attestation providers based on their proficiency in verifying given kinds;
- Publish your verification proficiency for given kinds.
Attestations enable a web of-trust for notes.
---
# Definitions
## Base Definitions
| Entity | Definition |
| ------------------- | --------------------------------------------------------------------------------- |
| `Assertor` | Signer of the `Assertion Event`. Interchangeable with Attestee. |
| `Attestor` | Verifying party and signer of the`Attestation Event`. |
| `Assertion Event` | Event being attested to by the `Attestor`. |
| `Attestation Event` | Event published by the `Attestor` to signal attestation of the `Assertion Event`. |

```mermaid
erDiagram
ATTESTOR ||--o{ ATTESTATION_EVENT : signs
ASSERTOR ||--o{ ASSERTION_EVENT : signs
ATTESTATION_EVENT ||--|| ASSERTION_EVENT : attests_to
```
---
## Extended Definitions
| Entity | Definition |
| ---------------------------------------- | -------------------------------------------------------------------------------------------- |
| `Requestor` | Signer of the `Attestation Request Event`. |
| `Reccomender` | Signer of the `Attestation Recommendation Event`. |
| `Attestation Request Event` | The request for an `Attestation Event` from an `Attestor`. |
| `Attestor Recommendation Event` | The recommendation of a given `Attestor` for proficiency in the verification of given kinds. |
| `Attestor Proficiency Declaration Event` | A declaration of proficiency from a given `Attestor` in the verification of given kinds. |

```mermaid
erDiagram
ATTESTOR o|--o{ ATTESTATION_EVENT : signs
ATTESTOR o|--|| ATTESTOR_PROFICIENCY_DECLARATION_EVENT : signs
ASSERTOR o|--o{ ASSERTION_EVENT : signs
ASSERTOR o|--o{ ATTESTATION_REQUEST_EVENT : signs
REQUESTOR o|--o{ ATTESTATION_REQUEST_EVENT : signs
RECOMMENDER o|--o{ ATTESTOR_RECOMMENDATION_EVENT : signs
ATTESTATION_EVENT ||--|| ASSERTION_EVENT : attests_to
ATTESTATION_REQUEST_EVENT ||--|| ASSERTION_EVENT : requests_attestation_of
ATTESTOR_RECOMMENDATION_EVENT ||--|| ATTESTOR: recommends
ATTESTOR_PROFICIENCY_DECLARATION_EVENT ||--|| ATTESTOR: declares_proficiency_of
```
---
# Specification
### Event Kinds
| Kind | Description | Type |
| ------- | -------------------------------- | ----------- |
| `31871` | Attestation | Addressable |
| `31872` | Attestation Request | Addressable |
| `31873` | Attestor Recommendation | Addressable |
| `11871` | Attestor Proficiency Declaration | Replaceable |
---
## Tags
### Attestation Event (`31871`)
Event signed by the `Attestor`. The `Attestor` should only sign an `Attestation Event` after verifying the validity of the `Assertion Event` to a degree appropriate for its kind type.
| Tag | Description | Format | Required |
| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------- | ----------- |
| `d` | Unique identifier for addressable attestation. | `["d", "<npub>:my-claim-id"]` | Yes |
| `e` / `a` / `p` | Specific `Assertion Event`. Exactly one of `e` or `a` or `p` **must** be present. | `["e", "<event-id>"]` or `["a", "<kind>:<pubkey>:<d-tag>"]` or `["p", <pubkey>]` | Yes |
| `v` | Validity claim. Conditional on `s` = `verified` | `["v", "valid"]` or `["v", "invalid"]` | Conditional |
| `s` | Marks an Attestation as being in only one of the following states:`accepted`- `rejected` - `verifying` - `verified` - `revoked` | `["s","accepted <> rejected <> verifying <> verified <> revoked"]` | Optional |
| `valid_from` | Unix timestamp (seconds). The earliest time (inclusive) at which the attestation is valid from. Clients **should** interpret the absence of `valid_from` tag as having `validity`/`invalidity` from the `created_at` timestamp of the `Assertion Event` | `["valid_from",1671217411]` | Optional |
| `valid_to` | UNIX timestamp (seconds). The latest time (inclusive) at which the attestation is valid from. Clients **should** interpret the absence of `valid_to` tag as having `validity`/`invalidity` in perpetuity. | `["valid_from",1671567643]` | Optional |
| `expiration` | UNIX timestamp (seconds). The time (inclusive) at which the `Attestation Event` will expire and be treated as such by relays in accordance to `NIP-40`. Clients **should** set this it be the same value as `valid_to` if there is no value in the `Attestation Event` being long-lived. | `["expiration",1671567643]` | Optional |
| `request` | `Attestation Request Event` that prompted this attestation. | `["request", "31872:<requestor_pubkey>:<d-tag>"]` | Optional |
---
### Attestation Request (`31872`)
Event signed by the `Requestor` (usually the `Assertor`) requesting an `Attestation Event` from an `Attestor`.
| Tag | Description | Format | Required |
| ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | -------- |
| `d` | Unique identifier for addressable attestation request. | `["d", "<requestor_pubkey>:my-request-id"]` | Yes |
| `e`/`a`/`p` | Specific `Assertion Event` Exactly one of `e` or `a` or `p` must be present. | `["e", "<event-id>"]` or `["a", "<kind>:<pubkey>:<d-tag>"]` or `["p", <pubkey>]`.| Yes |
| `p` | One or more requested `Attestators` | `["p", "<attestor_pubkey>"]` | No |
| `cashu_token` | A Cashu token locked to given spending conditions (HLTC, P2PK, etc.). Spending conditions *may* be locked to the observation of requested `Attestation Events`. | `["cashu_token", "<cashuBo...>"]` | No |
---
### Attestor Recommendation (`31873`)
Event signed by the `Recommender`.
Allows any npub to recommend an `Attestor` for verification proficiency in one or more event kinds.
| Tag | Description | Format | Required |
| ------ | ---------------------------------------------------------------- | ------------------------------------------------ | -------- |
| `d` | Unique identifier for the recommendation of a given`Attestor`. | `["d", "<attestor_pubkey>` | Yes |
| `k` | One or more event kinds the attestor is recommended for | `["k", "<kind>"]` (repeatable) | Yes |
| `desc` | Optional human-readable reason or context for the recommendation | `["desc", "Trustworthy for place attestations"]` | No |
---
### Attestor Proficiency Declaration (`11871`)
Event signed by the `Attestor`.
Enables an attestor to publicly declare which event kinds they are proficient in verifying; facilitating discovery of suitable attestors for specific verification needs.
| Tag | Description | Format | Required |
| ------ | ----------------------------------------------------------------- | -------------------------------------------- | -------- |
| `p` | Attestorβs pubkey (the declaring party) | `["p", "<pubkey>"]` | Yes |
| `k` | One or more event kinds the attestor claims proficiency in | `["k", "<kind>"]` | Yes |
| `desc` | Optional human-readable description of proficiency or credentials | `["desc", "I verify places and attributes"]` | No |
---
# Worked Examples
## 1. Attestation Request
```
{
"kind": 31872,
"tags": [
["d", "npub1requestor...:my-request-id"],
["a", 12345:npub1...:central-park-saftey-assertation"],
["p", "npub1attestor1..."]
["p", "npub1attestor2..."]
],
"content": "Verify safety status for Central Park"
}
```
## 2. Attestation
```
{
"kind": 31871,
"tags": [
["d", "npub:safety-verification-2025"],
["a", "12345:npub1...:central-park-saftey-assertation"],
["validity", "valid"],
["valid_from", "1760227200"], // Sept 12, 2025 @ 00:00 UTC
["valid_to", "1760486400"], // Sept 15, 2025 @ 00:00 UTC
["request", "request-event-id-123"]
],
"content": "Safety inspection valid"
}
```
## 3. Revocation
```
{
"kind": 31871,
"tags": [
["d", "npub:safety-verification-2025"],
["s", "revoked"]
],
"content": "Retracted due to new safety concerns"
}
```
---
# Related NIPs
## NIP-03 - OpenTimeStamps Attestations
An `Attestor`, `Assertor` or any other npub may choose to issue a `kind:1040` `OpenTimestamps Attestations for Events` event to anchor the `Attestation Event` to a given blockheight on the Bitcoin timechain.
## NIP-58 - Badges
An `Attestor` or any other npub may choose to issue a badge for a given `Attestation` should they wish.
View quoted note →
)
```mermaid
erDiagram
ATTESTOR ||--o{ ATTESTATION_EVENT : signs
ASSERTOR ||--o{ ASSERTION_EVENT : signs
ATTESTATION_EVENT ||--|| ASSERTION_EVENT : attests_to
```
---
## Extended Definitions
| Entity | Definition |
| ---------------------------------------- | -------------------------------------------------------------------------------------------- |
| `Requestor` | Signer of the `Attestation Request Event`. |
| `Reccomender` | Signer of the `Attestation Recommendation Event`. |
| `Attestation Request Event` | The request for an `Attestation Event` from an `Attestor`. |
| `Attestor Recommendation Event` | The recommendation of a given `Attestor` for proficiency in the verification of given kinds. |
| `Attestor Proficiency Declaration Event` | A declaration of proficiency from a given `Attestor` in the verification of given kinds. |

```mermaid
erDiagram
ATTESTOR o|--o{ ATTESTATION_EVENT : signs
ATTESTOR o|--|| ATTESTOR_PROFICIENCY_DECLARATION_EVENT : signs
ASSERTOR o|--o{ ASSERTION_EVENT : signs
ASSERTOR o|--o{ ATTESTATION_REQUEST_EVENT : signs
REQUESTOR o|--o{ ATTESTATION_REQUEST_EVENT : signs
RECOMMENDER o|--o{ ATTESTOR_RECOMMENDATION_EVENT : signs
ATTESTATION_EVENT ||--|| ASSERTION_EVENT : attests_to
ATTESTATION_REQUEST_EVENT ||--|| ASSERTION_EVENT : requests_attestation_of
ATTESTOR_RECOMMENDATION_EVENT ||--|| ATTESTOR: recommends
ATTESTOR_PROFICIENCY_DECLARATION_EVENT ||--|| ATTESTOR: declares_proficiency_of
```
---
# Specification
### Event Kinds
| Kind | Description | Type |
| ------- | -------------------------------- | ----------- |
| `31871` | Attestation | Addressable |
| `31872` | Attestation Request | Addressable |
| `31873` | Attestor Recommendation | Addressable |
| `11871` | Attestor Proficiency Declaration | Replaceable |
---
## Tags
### Attestation Event (`31871`)
Event signed by the `Attestor`. The `Attestor` should only sign an `Attestation Event` after verifying the validity of the `Assertion Event` to a degree appropriate for its kind type.
| Tag | Description | Format | Required |
| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------- | ----------- |
| `d` | Unique identifier for addressable attestation. | `["d", "<npub>:my-claim-id"]` | Yes |
| `e` / `a` / `p` | Specific `Assertion Event`. Exactly one of `e` or `a` or `p` **must** be present. | `["e", "<event-id>"]` or `["a", "<kind>:<pubkey>:<d-tag>"]` or `["p", <pubkey>]` | Yes |
| `v` | Validity claim. Conditional on `s` = `verified` | `["v", "valid"]` or `["v", "invalid"]` | Conditional |
| `s` | Marks an Attestation as being in only one of the following states:`accepted`- `rejected` - `verifying` - `verified` - `revoked` | `["s","accepted <> rejected <> verifying <> verified <> revoked"]` | Optional |
| `valid_from` | Unix timestamp (seconds). The earliest time (inclusive) at which the attestation is valid from. Clients **should** interpret the absence of `valid_from` tag as having `validity`/`invalidity` from the `created_at` timestamp of the `Assertion Event` | `["valid_from",1671217411]` | Optional |
| `valid_to` | UNIX timestamp (seconds). The latest time (inclusive) at which the attestation is valid from. Clients **should** interpret the absence of `valid_to` tag as having `validity`/`invalidity` in perpetuity. | `["valid_from",1671567643]` | Optional |
| `expiration` | UNIX timestamp (seconds). The time (inclusive) at which the `Attestation Event` will expire and be treated as such by relays in accordance to `NIP-40`. Clients **should** set this it be the same value as `valid_to` if there is no value in the `Attestation Event` being long-lived. | `["expiration",1671567643]` | Optional |
| `request` | `Attestation Request Event` that prompted this attestation. | `["request", "31872:<requestor_pubkey>:<d-tag>"]` | Optional |
---
### Attestation Request (`31872`)
Event signed by the `Requestor` (usually the `Assertor`) requesting an `Attestation Event` from an `Attestor`.
| Tag | Description | Format | Required |
| ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | -------- |
| `d` | Unique identifier for addressable attestation request. | `["d", "<requestor_pubkey>:my-request-id"]` | Yes |
| `e`/`a`/`p` | Specific `Assertion Event` Exactly one of `e` or `a` or `p` must be present. | `["e", "<event-id>"]` or `["a", "<kind>:<pubkey>:<d-tag>"]` or `["p", <pubkey>]`.| Yes |
| `p` | One or more requested `Attestators` | `["p", "<attestor_pubkey>"]` | No |
| `cashu_token` | A Cashu token locked to given spending conditions (HLTC, P2PK, etc.). Spending conditions *may* be locked to the observation of requested `Attestation Events`. | `["cashu_token", "<cashuBo...>"]` | No |
---
### Attestor Recommendation (`31873`)
Event signed by the `Recommender`.
Allows any npub to recommend an `Attestor` for verification proficiency in one or more event kinds.
| Tag | Description | Format | Required |
| ------ | ---------------------------------------------------------------- | ------------------------------------------------ | -------- |
| `d` | Unique identifier for the recommendation of a given`Attestor`. | `["d", "<attestor_pubkey>` | Yes |
| `k` | One or more event kinds the attestor is recommended for | `["k", "<kind>"]` (repeatable) | Yes |
| `desc` | Optional human-readable reason or context for the recommendation | `["desc", "Trustworthy for place attestations"]` | No |
---
### Attestor Proficiency Declaration (`11871`)
Event signed by the `Attestor`.
Enables an attestor to publicly declare which event kinds they are proficient in verifying; facilitating discovery of suitable attestors for specific verification needs.
| Tag | Description | Format | Required |
| ------ | ----------------------------------------------------------------- | -------------------------------------------- | -------- |
| `p` | Attestorβs pubkey (the declaring party) | `["p", "<pubkey>"]` | Yes |
| `k` | One or more event kinds the attestor claims proficiency in | `["k", "<kind>"]` | Yes |
| `desc` | Optional human-readable description of proficiency or credentials | `["desc", "I verify places and attributes"]` | No |
---
# Worked Examples
## 1. Attestation Request
```
{
"kind": 31872,
"tags": [
["d", "npub1requestor...:my-request-id"],
["a", 12345:npub1...:central-park-saftey-assertation"],
["p", "npub1attestor1..."]
["p", "npub1attestor2..."]
],
"content": "Verify safety status for Central Park"
}
```
## 2. Attestation
```
{
"kind": 31871,
"tags": [
["d", "npub:safety-verification-2025"],
["a", "12345:npub1...:central-park-saftey-assertation"],
["validity", "valid"],
["valid_from", "1760227200"], // Sept 12, 2025 @ 00:00 UTC
["valid_to", "1760486400"], // Sept 15, 2025 @ 00:00 UTC
["request", "request-event-id-123"]
],
"content": "Safety inspection valid"
}
```
## 3. Revocation
```
{
"kind": 31871,
"tags": [
["d", "npub:safety-verification-2025"],
["s", "revoked"]
],
"content": "Retracted due to new safety concerns"
}
```
---
# Related NIPs
## NIP-03 - OpenTimeStamps Attestations
An `Attestor`, `Assertor` or any other npub may choose to issue a `kind:1040` `OpenTimestamps Attestations for Events` event to anchor the `Attestation Event` to a given blockheight on the Bitcoin timechain.
## NIP-58 - Badges
An `Attestor` or any other npub may choose to issue a badge for a given `Attestation` should they wish.What is the place nip? Also, @Zapstore is this attestation spec compatible with the one we discussed for apps? To me it looks to specific.
If you want to direct me to where those discussions are happening I would gladly contribute.
Kind 31871 looks simple enough? What I ideally want is more of a "vouch" and not sure how the s field and others would look like.
Suggestions @Nathan Day ?
It's buried in a NIP repo PR. Let me publish it on NostrHub so it's more discoverable.
BRB ...
Yeah, we discussed this a while back.
There was some other project doing binary attestations too, but I can't recall it.
At its core, an Attestation Event is a simple valid/invalid on the referenced assertion event (e.g. an app release).
Zapstore and others could interpret this as a simple vouch.
Another way is to actually publish some kind of specific app vouch event with more detail in it that some expert can publish (perhaps even zapstore) that other experts can attest to.
I think the later is more robust, the former simpler though. Both can be used in parallel I guess.
Looking at this definition, how is it any different than nip25 reactions? You could just interpret β
βοΈβοΈπ― as positive attestations and βοΈβββπ« as negative ones.
I am think about this in terms of two use cases:
Attesting that a location accepts bitcoin
AND
An application has a reproducible build.
So I guess what you're saying is that there should be a separate kind(s) for assertions or declarations, which would then be attested to separately? In the case of a location accepting bitcoin, the initial assertion could be represented by a bitcoin badge and the asserts could be like a number the same way notifications on a phone work, but it could be negative if more people asset that something is false than true.
The only issue I guess I have is what if multiple people make the same declaration? Let's say multiple people create workflows to check the reproducibility of some application. Then wouldnt the client have to basically determine which one to attach the attestations to? Because you wouldn't just want to force the attestations just to go to whichever assertion is first, because it means different things for the app owner to declare that their build is reproducible vs another entity vs some random not technical person or bot. This is really only relevant to the assertion discussion because assertions only apply to other events.
Yeah, we could. We actually started there but concluded we needed something less open to interpretation, particularly as reactions are used for all sorts.
An Attestation should carry much more weight - like a notorisation.
Users and clients would need to weigh Attestations in accordance to their social graph and preferences using WoT. e.g. people may highly weight Proof of Place Attestations from BTC Map, but not music recommendations.
More context here:
And here:

Users and clients would need to weigh Attestations in accordance to their social graph and preferences using WoT. e.g. people may highly weight Proof of Place Attestations from BTC Map, but not music recommendations.
More context here:

Habla
Cryptography, the Commons and Proof of Place - Nathan Day
As we navigate the frontier of cryptographic ownership and decentralised data, itβs up to us to find the balance between preserving the Open Data...
Google Docs
d/h/d/ BTC Prague 2025
The Nuts are in the Mail Nathan Day BTC Map and Other Stuff
I am on board with the choice not to use reactions, hzrd convinced me of that this fall. But what you linked doesn't address the problem of multiple oracles making an initial, identical declaration.
I'd btc map says person x owns place y, and some govt also says person x owns place y, how do you link attestations? Does a user have to sign 2 attestations that both pronouncements are true?
That's for clients to interpret with WoT.
The user doesn't sign anything.
In Proof of Place:
- The owner Asserts a Place
- Other entities then Attest to that being valid/invalid
- Users weigh those attestations how they like.
If I don't trust the government then I'll not weight their attestations on given kind types.
More directly in a swer to your question, the Attestations are linked by the Assertion Event (in this case a Place event).
Right, but there can be identical assertions made to the same place and I could trust both. If I'm at a location and attest to the veracity of a neighboring assertion are you saying that because they assertions are the same that two attestations (one for each assertion) should be signed.
Assertions can't be identical unless they are from the same key.
Attestations can also be attested to. π
Ok not identical but 2 entities can assert the same thing (Is there a spec for the actual assertion events?)
What I'm trying to ask is if btc map and county gov say person x runs business as location y. I am there. I trust both entities. I click "verify" which would sign an assertion. Where would that attestation be linked to? Assertion a or b or both?
The spec is agnostic on the Assertion Event - it can literally be any other event of any kind. It's covered on the nostrhub link above.
The Assertion Event, to be useful, should be domain specific and as detailed as necessary such that a valid/invalid assesment can be made via an Attestation.
In your case directly above, you're not signing the assertion - that is the place event itself published by the merchant.
You would either be attesting to it directly, or attesting to the other attestations as you trust them implicitly. Both are fine.
I feel like we are talking past each other.
Are you saying that 2 entities cannot assert the same thing? Because that does not mirror reality. My understanding of the attestation spec above is that an attestation only can apply to 1 assertion, but if there are 2 assertions that are the same, how would that be handled, considering that a user attesting to the fact that the sky is blue isn't relevant whether God or the devil made that assertion.
π’π’π’π’π’π’π’π’π’π’
Yeah, entities can make the same broad Assertion - the sky is blue.
I guess we could look at the hash of a subset of tags of a well-specified Assertion event to determine if it was the same?
Attestations basically amplify/dampen the views of a given entity as there is no base 'truth' - that is emergent and subjective.
The place example is a special case in that it is the *combination* of Place event content *and* npub we are interested in as we are seeking to link cyberspace ownership (nsec/npub) with meatspace ownership (physical address).
You should join the #wotathon calls by @nosfabrica!
Is there a calendar of them?
My related spec on βacceptanceβ - based on input and collaboration from @Nathan Day and the #Wotathon folks
I distinguish between assertion, attestation and delegation
π.md
I like your model.
Reading it makes me think the only think that is missing from the attestation spec is optional tags to "proof".
For example, when I assert a build is reproducible, i should also attest to my own assertion being true and link to the build pipelines outputs showing that.
Also makes me think there might be some convention that should (not required) be applied to assertions that they should be phrased as null hypotheseses.
Yeah, it's on my to-do for Attestations. Proof/evidence to support the validity/invalidity claim.
Lit. Ok I think I have enough information to get Fran what he needs to implement reproducible builds via assertions and attestations.
Step 0 for that is to just piggy back on izzyondroid scans
Step 1 do it via loom so it can be done on demand for those who don't want to farm out their trust.
Step 2 would be to add those in as attestations to the initial assertion
Step 3 would be figure out how to apply wot to who's assertions you care about in that specific context.
Step 4 drink coffee and take a walk
404
Fuck I guess you have to go to kcbitcoiners.com then click calendar or shop. Will fix
Should be fixed
Cool. Was wondering if something like this already existed. Should def open it up for wider use!
Ok gimme a week. What's your preferred "deploy". Thinking to make it work for github pages too.
Iβd prob run it on VPS, GitHub pages would likely be useful to more people though.
Have you thought about building in a group chat/community? Telegram is the go to for this but would be cool to have meetup-in-a-box
Have we talked before? Cuz that is my term lol.
But yes, flotilla is the ux I think is optimal, but am open to additional suggestions. Currently budabit has the best fork of that plus adds ngit.
I think the first thing I'm going to do is make this generic so it is easy to configure and then make it even more generic so each page is its own repo/microservice so folks could pick and choose which pages they'd want.
Nope, Iβve just been thinking about this idea for a little while.
Pick and choose is a good way to go. Iβm thinking for a new meetup but it will be harder to get existing meetups to move group chats and stuff, a meetup calendar though would be good regardless


