FamilyNido — a self-hosted PWA for a single household: shared calendar, chores, meals, school agenda, health records and a family wall. One instance per family, deployable with `docker compose` on any home server. Stack: .NET 10 (ASP.NET Core Minimal APIs) + EF Core 10 + PostgreSQL 16 on the backend, Angular 21 (standalone, signals, zoneless) + Tailwind CSS v4 on the frontend, SignalR for realtime, optional OIDC alongside local credentials, integration via a versioned `/api/v1/**` public API. See README.md for the module overview and how to deploy. |
||
|---|---|---|
| .. | ||
| README.md | ||
Integrations — FamilyNido public API
FamilyNido exposes a small set of versioned endpoints under /api/v1/**
so any external integration (an automation runner, n8n, IFTTT, a cron
job on another machine…) can create tasks in the family's dashboard.
Authentication is by API key, minted from the FamilyNido admin UI (My account → API keys for integrations, admins only). The key is sent with every request:
X-Api-Key: bxn_xxxxxxxxxxxxxxxxxxxxxxxx
or, alternatively, as Authorization: Bearer bxn_….
Available endpoints
POST /api/v1/tasks — create a task
Body (JSON):
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
title |
string | yes | — | Up to 200 characters. |
category |
string | no | "General" |
Up to 50 characters. |
points |
int | no | 5 |
Range 0–100. |
dueDate |
string YYYY-MM-DD |
no | today | Ignored when isFloating=true. |
isFloating |
bool | no | false |
Floating task — has no fixed date and stays pending every day until someone marks it done. |
responsibleMemberId |
guid | no | — | Must belong to the family the token was issued for. |
deduplicate |
bool | no | false |
When true and a pending task (not archived, no completions) with the same title already exists, returns 200 OK with created=false instead of inserting a new row. |
Response 201 Created (or 200 OK when deduplicate matches an
existing pending task):
{
"created": true,
"reason": null,
"taskId": "01938efc-...",
"title": "Empty the dishwasher"
}
reason is "already-pending" on a dedup hit.
Common errors:
400 Bad Request: validation failed (empty title,pointsout of range,responsibleMemberIdoutside the family).401 Unauthorized: header missing, malformed or revoked.429 Too Many Requests: rate limit exceeded (60 req/min/IP).
Example: curl
curl -X POST https://your-host/api/v1/tasks \
-H "X-Api-Key: bxn_xxxxxxxx…" \
-H "Content-Type: application/json" \
-d '{"title":"Buy bread","category":"Shopping","points":1}'
Concrete guides
If you wire up an integration worth sharing, open a PR against this folder with a short worked example — that kind of doc pays for itself.