3.7 KiB
Sites & Social Accounts Manager — Design
Purpose
A local-network-only Laravel app for managing two independent lists of data that an AI agent will later consume via API to act on the user's behalf:
- Sites — a list of the user's websites (name, url, description).
- Social Accounts — a list of social network accounts (network, username, email, password, type) that the AI can use to post, comment, or like on the user's behalf.
Both lists are managed through a Livewire UI (full CRUD) and exposed read-only via a JSON API for AI consumption.
Scope
- CRUD UI for Sites
- CRUD UI for Social Accounts
- Read-only JSON API for both resources, with basic filtering
- No authentication anywhere (UI or API) — this runs on the local network only
- No relationship between Sites and Social Accounts — fully independent resources
Out of scope:
- Authentication/authorization (UI or API)
- Password encryption/hashing (stored and returned as plain text by design, since the AI needs to use credentials directly)
- Linking sites to accounts
- Multi-type accounts (an account has at most one type)
- Write endpoints on the API (create/update/delete are UI-only)
Data Model
sites table
| Column | Type | Constraints |
|---|---|---|
| id | bigint | PK |
| name | string | required |
| url | string | required |
| description | text | nullable |
| created_at / updated_at | timestamps |
social_accounts table
| Column | Type | Constraints |
|---|---|---|
| id | bigint | PK |
| network | string (enum) | required — one of: twitter, instagram, facebook, reddit, tiktok, linkedin, youtube, other |
| username | string | required |
| string | required | |
| password | string | required, stored in plain text (no hashing/encryption) |
| type | string (enum) | nullable — one of: post, comment, like, or null |
| created_at / updated_at | timestamps |
No foreign keys between the two tables.
UI (Livewire, no auth)
Simple nav with two sections: Sites and Social Accounts.
Sites
- Table view: name, url, description, actions (edit/delete)
- Create/Edit via modal form (name and url required, description optional)
- Delete with confirmation
Social Accounts
- Table view: network, username, email, type, actions (edit/delete)
- Password is stored/edited as plain text in the form, but masked in the table view with a reveal toggle (UI convenience only — not a security control, since the API and DB already hold it in plain text)
- Create/Edit via modal form — network (dropdown), username, email, password all required; type dropdown optional (post/comment/like/none)
- Delete with confirmation
Exact Livewire component structure (single component with modal vs. separate index/form components) is an implementation detail decided during planning.
API (read-only, no auth, JSON)
Standard Laravel API resource controllers, index/show actions only (no store/update/destroy routes). Responses via Eloquent API Resources.
GET /api/sites— list all sites?name=— optional partial match filter on name
GET /api/sites/{id}— single siteGET /api/accounts— list all social accounts, including the plain-textpasswordfield?network=— optional exact match filter?type=— optional exact match filter
GET /api/accounts/{id}— single social account, including password
No pagination requirements specified — dataset is expected to be small (personal use). Standard Eloquent collection response is sufficient; can add pagination later if needed.
Testing
- Feature tests for CRUD flows (Livewire component tests) for both resources
- Feature tests for API endpoints: list, show, and filter behavior for both resources