Rebrand from Casera/MyCrib to honeyDue

Total rebrand across all Go API source files:
- Go module path: casera-api -> honeydue-api
- All imports updated (130+ files)
- Docker: containers, images, networks renamed
- Email templates: support email, noreply, icon URL
- Domains: casera.app/mycrib.treytartt.com -> honeyDue.treytartt.com
- Bundle IDs: com.tt.casera -> com.tt.honeyDue
- IAP product IDs updated
- Landing page, admin panel, config defaults
- Seeds, CI workflows, Makefile, docs
- Database table names preserved (no migration needed)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-03-07 06:33:38 -06:00
parent 793e50ce52
commit 4976eafc6c
189 changed files with 831 additions and 831 deletions

View File

@@ -6,7 +6,7 @@ TIMEZONE=UTC
SECRET_KEY=your-secret-key-here-change-this-in-production
# Database Settings (PostgreSQL)
POSTGRES_DB=casera
POSTGRES_DB=honeydue
POSTGRES_USER=postgres
POSTGRES_PASSWORD=change-this-secure-password
DB_HOST=localhost
@@ -26,14 +26,14 @@ EMAIL_PORT=587
EMAIL_USE_TLS=true
EMAIL_HOST_USER=your-email@gmail.com
EMAIL_HOST_PASSWORD=your-app-password
DEFAULT_FROM_EMAIL=Casera <noreply@casera.com>
DEFAULT_FROM_EMAIL=honeyDue <noreply@honeyDue.treytartt.com>
# APNs Settings (iOS Push Notifications)
# Direct APNs integration - no external push server needed
APNS_AUTH_KEY_PATH=/path/to/AuthKey_XXXXXX.p8
APNS_AUTH_KEY_ID=XXXXXXXXXX
APNS_TEAM_ID=XXXXXXXXXX
APNS_TOPIC=com.example.casera
APNS_TOPIC=com.tt.honeyDue
APNS_PRODUCTION=false # Set to true for production APNs, false for sandbox
# FCM Settings (Android Push Notifications)

View File

@@ -60,10 +60,10 @@ jobs:
cache: true
- name: Build API
run: go build -ldflags "-s -w" -o bin/casera-api ./cmd/api
run: go build -ldflags "-s -w" -o bin/honeydue-api ./cmd/api
- name: Build Worker
run: go build -ldflags "-s -w" -o bin/casera-worker ./cmd/worker
run: go build -ldflags "-s -w" -o bin/honeydue-worker ./cmd/worker
lint:
name: Lint

View File

@@ -40,7 +40,7 @@ This document contains:
**Quick reference:**
```go
// Use these - DON'T write inline task logic
import "github.com/treytartt/casera-api/internal/task"
import "github.com/treytartt/honeydue-api/internal/task"
task.IsCompleted(t) // Check if task is completed
task.IsOverdue(t, now) // Check if task is overdue
@@ -50,7 +50,7 @@ task.CategorizeTask(t, 30) // Get kanban column for task
## Project Overview
Casera API is a Go REST API for the MyCrib/Casera property management platform. It provides backend services for iOS and Android mobile apps built with Kotlin Multiplatform.
honeyDue API is a Go REST API for the HoneyDue/honeyDue property management platform. It provides backend services for iOS and Android mobile apps built with Kotlin Multiplatform.
**Tech Stack:**
- **HTTP Framework**: Echo v4
@@ -65,7 +65,7 @@ Casera API is a Go REST API for the MyCrib/Casera property management platform.
## Project Structure
```
myCribAPI-go/
honeyDueAPI-go/
├── cmd/
│ ├── api/main.go # API server entry point
│ └── worker/main.go # Background worker entry point
@@ -163,7 +163,7 @@ internal/task/
**Always use this package for task logic:**
```go
import "github.com/treytartt/casera-api/internal/task"
import "github.com/treytartt/honeydue-api/internal/task"
// Predicates (in-memory checks)
if task.IsCompleted(t) { ... }
@@ -194,7 +194,7 @@ api.Use(middleware.AuthRequired(db))
Use structured errors from `internal/apperrors/`:
```go
import "github.com/treytartt/casera-api/internal/apperrors"
import "github.com/treytartt/honeydue-api/internal/apperrors"
// Return typed errors
return apperrors.NewNotFoundError("task", taskID)
@@ -401,5 +401,5 @@ func TestTaskHandler_Create(t *testing.T) {
## Related Repositories
- **Mobile App**: `../MyCribKMM` - Kotlin Multiplatform iOS/Android app
- **Mobile App**: `../HoneyDueKMM` - Kotlin Multiplatform iOS/Android app
- **Root Docs**: `../CLAUDE.md` - Full-stack documentation

View File

@@ -1,8 +1,8 @@
.PHONY: build run test contract-test clean deps lint docker-build docker-up docker-down migrate
# Binary names
API_BINARY=casera-api
WORKER_BINARY=casera-worker
API_BINARY=honeydue-api
WORKER_BINARY=honeydue-worker
# Build flags
LDFLAGS=-ldflags "-s -w"
@@ -85,9 +85,9 @@ docker-restart:
# Docker commands (prod — builds production images)
docker-build-prod:
docker build --target api -t $${REGISTRY:-ghcr.io/treytartt}/casera-api:$${TAG:-latest} .
docker build --target worker -t $${REGISTRY:-ghcr.io/treytartt}/casera-worker:$${TAG:-latest} .
docker build --target admin -t $${REGISTRY:-ghcr.io/treytartt}/casera-admin:$${TAG:-latest} .
docker build --target api -t $${REGISTRY:-ghcr.io/treytartt}/honeydue-api:$${TAG:-latest} .
docker build --target worker -t $${REGISTRY:-ghcr.io/treytartt}/honeydue-worker:$${TAG:-latest} .
docker build --target admin -t $${REGISTRY:-ghcr.io/treytartt}/honeydue-admin:$${TAG:-latest} .
# Database migrations
migrate-up:

View File

@@ -1,6 +1,6 @@
# Casera API
# honeyDue API
Go REST API for the Casera (MyCrib) property management platform. Powers iOS and Android mobile apps built with Kotlin Multiplatform.
Go REST API for the honeyDue property management platform. Powers iOS and Android mobile apps built with Kotlin Multiplatform.
## Tech Stack
@@ -31,7 +31,7 @@ This starts PostgreSQL, Redis, the API server, background worker, and admin pane
```bash
# 1. Clone the repo
git clone <repo-url>
cd myCribAPI-go
cd honeyDueAPI-go
# 2. Create your environment file
cp .env.example .env
@@ -41,11 +41,11 @@ cp .env.example .env
make docker-dev
# 4. Seed the database with lookup data (required)
docker exec -i casera-db psql -U casera -d casera < seeds/001_lookups.sql
docker exec -i honeydue-db psql -U honeydue -d honeydue < seeds/001_lookups.sql
# 5. (Optional) Seed test data — creates test users, residences, tasks
docker exec -i casera-db psql -U casera -d casera < seeds/002_test_data.sql
docker exec -i casera-db psql -U casera -d casera < seeds/003_task_templates.sql
docker exec -i honeydue-db psql -U honeydue -d honeydue < seeds/002_test_data.sql
docker exec -i honeydue-db psql -U honeydue -d honeydue < seeds/003_task_templates.sql
# 6. Verify the API is running
curl http://localhost:8000/api/health/
@@ -60,7 +60,7 @@ Use Docker for PostgreSQL and Redis, but run the Go server natively for faster i
```bash
# 1. Clone and enter the repo
git clone <repo-url>
cd myCribAPI-go
cd honeyDueAPI-go
# 2. Install Go dependencies
make deps
@@ -77,9 +77,9 @@ cp .env.example .env
# - Set REDIS_URL=redis://localhost:6379/0
# 5. Seed the database
psql -h localhost -p 5433 -U casera -d casera < seeds/001_lookups.sql
psql -h localhost -p 5433 -U casera -d casera < seeds/002_test_data.sql
psql -h localhost -p 5433 -U casera -d casera < seeds/003_task_templates.sql
psql -h localhost -p 5433 -U honeydue -d honeydue < seeds/001_lookups.sql
psql -h localhost -p 5433 -U honeydue -d honeydue < seeds/002_test_data.sql
psql -h localhost -p 5433 -U honeydue -d honeydue < seeds/003_task_templates.sql
# 6. Run the API server
make run
@@ -101,7 +101,7 @@ brew services start postgresql@16
brew services start redis
# Create the database
createdb casera
createdb honeydue
# Then follow Option B steps 2-7, using:
# DB_HOST=localhost, DB_PORT=5432, POSTGRES_USER=<your-user>, POSTGRES_PASSWORD=<your-password>
@@ -116,7 +116,7 @@ Copy `.env.example` to `.env` and configure:
| `PORT` | Server port | `8000` | No |
| `DEBUG` | Enable debug logging | `true` | No |
| `SECRET_KEY` | JWT signing secret (32+ chars) | — | **Yes** |
| `POSTGRES_DB` | Database name | `casera` | Yes |
| `POSTGRES_DB` | Database name | `honeydue` | Yes |
| `POSTGRES_USER` | Database user | `postgres` | Yes |
| `POSTGRES_PASSWORD` | Database password | — | Yes |
| `DB_HOST` | Database host | `localhost` | Yes |
@@ -133,7 +133,7 @@ Copy `.env.example` to `.env` and configure:
## Project Structure
```
myCribAPI-go/
honeyDueAPI-go/
├── cmd/
│ ├── api/main.go # API server entry point
│ └── worker/main.go # Background worker entry point
@@ -266,10 +266,10 @@ All protected endpoints require an `Authorization: Token <token>` header.
git push dokku main
# Seed lookup data
cat seeds/001_lookups.sql | dokku postgres:connect casera-db
cat seeds/001_lookups.sql | dokku postgres:connect honeydue-db
# Check logs
dokku logs casera-api -t
dokku logs honeydue-api -t
```
### Docker Swarm
@@ -277,20 +277,20 @@ dokku logs casera-api -t
```bash
# Build and push production images
make docker-build-prod
docker push ${REGISTRY}/casera-api:${TAG}
docker push ${REGISTRY}/casera-worker:${TAG}
docker push ${REGISTRY}/casera-admin:${TAG}
docker push ${REGISTRY}/honeydue-api:${TAG}
docker push ${REGISTRY}/honeydue-worker:${TAG}
docker push ${REGISTRY}/honeydue-admin:${TAG}
# Deploy the stack (all env vars must be set in .env or environment)
docker stack deploy -c docker-compose.yml casera
docker stack deploy -c docker-compose.yml honeydue
```
## Related Projects
- **Mobile App (KMM)**: `../MyCribKMM` — Kotlin Multiplatform iOS/Android client
- **Mobile App (KMM)**: `../HoneyDueKMM` — Kotlin Multiplatform iOS/Android client
- **Task Logic Docs**: `docs/TASK_LOGIC_ARCHITECTURE.md` — required reading before task-related work
- **Push Notification Docs**: `docs/PUSH_NOTIFICATIONS.md`
## License
Proprietary — Casera
Proprietary — honeyDue

View File

@@ -239,55 +239,55 @@ export default function AutomationReferencePage() {
<TableBody>
<TableRow>
<TableCell className="font-medium">Welcome Email</TableCell>
<TableCell>Welcome to Casera - Verify Your Email</TableCell>
<TableCell>Welcome to honeyDue - Verify Your Email</TableCell>
<TableCell>User registration (email/password)</TableCell>
<TableCell>24 hours (verification code)</TableCell>
</TableRow>
<TableRow>
<TableCell className="font-medium">Apple Welcome</TableCell>
<TableCell>Welcome to Casera!</TableCell>
<TableCell>Welcome to honeyDue!</TableCell>
<TableCell>Apple Sign In registration</TableCell>
<TableCell>-</TableCell>
</TableRow>
<TableRow>
<TableCell className="font-medium">Google Welcome</TableCell>
<TableCell>Welcome to Casera!</TableCell>
<TableCell>Welcome to honeyDue!</TableCell>
<TableCell>Google Sign In registration</TableCell>
<TableCell>-</TableCell>
</TableRow>
<TableRow>
<TableCell className="font-medium">Post-Verification</TableCell>
<TableCell>You&apos;re All Set! Getting Started with Casera</TableCell>
<TableCell>You&apos;re All Set! Getting Started with honeyDue</TableCell>
<TableCell>After email verification</TableCell>
<TableCell>-</TableCell>
</TableRow>
<TableRow>
<TableCell className="font-medium">Verification Email</TableCell>
<TableCell>Casera - Verify Your Email</TableCell>
<TableCell>honeyDue - Verify Your Email</TableCell>
<TableCell>Resend verification code</TableCell>
<TableCell>24 hours</TableCell>
</TableRow>
<TableRow>
<TableCell className="font-medium">Password Reset</TableCell>
<TableCell>Casera - Password Reset Request</TableCell>
<TableCell>honeyDue - Password Reset Request</TableCell>
<TableCell>Password reset request</TableCell>
<TableCell>15 minutes</TableCell>
</TableRow>
<TableRow>
<TableCell className="font-medium">Password Changed</TableCell>
<TableCell>Casera - Your Password Has Been Changed</TableCell>
<TableCell>honeyDue - Your Password Has Been Changed</TableCell>
<TableCell>After password change</TableCell>
<TableCell>-</TableCell>
</TableRow>
<TableRow>
<TableCell className="font-medium">Task Completed</TableCell>
<TableCell>Casera - Task Completed: [Task Title]</TableCell>
<TableCell>honeyDue - Task Completed: [Task Title]</TableCell>
<TableCell>When task is completed (if email_task_completed = true)</TableCell>
<TableCell>-</TableCell>
</TableRow>
<TableRow>
<TableCell className="font-medium">Tasks Report</TableCell>
<TableCell>Casera - Tasks Report for [Residence]</TableCell>
<TableCell>honeyDue - Tasks Report for [Residence]</TableCell>
<TableCell>User requests PDF export</TableCell>
<TableCell>-</TableCell>
</TableRow>
@@ -311,14 +311,14 @@ export default function AutomationReferencePage() {
<TableCell className="font-medium">
<Badge variant="outline">no_residence</Badge>
</TableCell>
<TableCell>Get started with Casera - Add your first property</TableCell>
<TableCell>Get started with honeyDue - Add your first property</TableCell>
<TableCell>2+ days since registration, no residence created</TableCell>
</TableRow>
<TableRow>
<TableCell className="font-medium">
<Badge variant="outline">no_tasks</Badge>
</TableCell>
<TableCell>Stay on top of home maintenance with Casera</TableCell>
<TableCell>Stay on top of home maintenance with honeyDue</TableCell>
<TableCell>5+ days since first residence, no tasks created</TableCell>
</TableRow>
</TableBody>

View File

@@ -42,9 +42,9 @@ export function UserDetailClient() {
const [showPushDialog, setShowPushDialog] = useState(false);
const [showEmailDialog, setShowEmailDialog] = useState(false);
const [pushTitle, setPushTitle] = useState('Test Notification');
const [pushBody, setPushBody] = useState('This is a test push notification from Casera Admin.');
const [emailSubject, setEmailSubject] = useState('Test Email from Casera');
const [emailBody, setEmailBody] = useState('This is a test email sent from the Casera Admin Panel.');
const [pushBody, setPushBody] = useState('This is a test push notification from honeyDue Admin.');
const [emailSubject, setEmailSubject] = useState('Test Email from honeyDue');
const [emailBody, setEmailBody] = useState('This is a test email sent from the honeyDue Admin Panel.');
const { data: user, isLoading, error } = useQuery({
queryKey: ['user', userId],

View File

@@ -15,8 +15,8 @@ const geistMono = Geist_Mono({
});
export const metadata: Metadata = {
title: "Casera Admin",
description: "Casera Administration Panel",
title: "honeyDue Admin",
description: "honeyDue Administration Panel",
};
export default function RootLayout({

View File

@@ -100,7 +100,7 @@ export function AppSidebar() {
<SidebarHeader className="border-b px-6 py-4">
<div className="flex items-center gap-2">
<Building2 className="h-6 w-6" />
<span className="font-semibold text-lg">Casera Admin</span>
<span className="font-semibold text-lg">honeyDue Admin</span>
</div>
</SidebarHeader>

View File

@@ -34,7 +34,7 @@ export function LoginForm() {
<Card className="w-full max-w-md">
<CardHeader className="space-y-1">
<CardTitle className="text-2xl font-bold text-center">
Casera Admin
honeyDue Admin
</CardTitle>
<CardDescription className="text-center">
Enter your credentials to access the admin panel
@@ -53,7 +53,7 @@ export function LoginForm() {
<Input
id="email"
type="email"
placeholder="admin@casera.app"
placeholder="admin@honeydue.app"
value={email}
onChange={(e) => setEmail(e.target.value)}
required

View File

@@ -1,6 +1,6 @@
{
"name": "casera-api",
"description": "Casera API (Go)",
"name": "honeydue-api",
"description": "honeyDue API (Go)",
"scripts": {},
"healthchecks": {
"web": [

View File

@@ -1,6 +1,6 @@
{
"version": "1",
"name": "Casera API (Go)",
"name": "honeyDue API (Go)",
"type": "collection",
"ignore": [
"node_modules",

View File

@@ -1,5 +1,5 @@
vars {
base_url: https://casera.treytartt.com
base_url: https://honeyDue.treytartt.com
api_url: {{base_url}}/api
auth_token: 64eea3e59ecdf58a35a4fb45f4797413a3f96456
}

View File

@@ -12,14 +12,14 @@ import (
"github.com/rs/zerolog/log"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/config"
"github.com/treytartt/casera-api/internal/database"
"github.com/treytartt/casera-api/internal/i18n"
"github.com/treytartt/casera-api/internal/monitoring"
"github.com/treytartt/casera-api/internal/push"
"github.com/treytartt/casera-api/internal/router"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/casera-api/pkg/utils"
"github.com/treytartt/honeydue-api/internal/config"
"github.com/treytartt/honeydue-api/internal/database"
"github.com/treytartt/honeydue-api/internal/i18n"
"github.com/treytartt/honeydue-api/internal/monitoring"
"github.com/treytartt/honeydue-api/internal/push"
"github.com/treytartt/honeydue-api/internal/router"
"github.com/treytartt/honeydue-api/internal/services"
"github.com/treytartt/honeydue-api/pkg/utils"
)
func main() {
@@ -48,7 +48,7 @@ func main() {
Str("db_name", cfg.Database.Database).
Str("db_user", cfg.Database.User).
Str("redis_url", cfg.Redis.URL).
Msg("Starting MyCrib API server")
Msg("Starting HoneyDue API server")
// Connect to database (retry with backoff)
var db *gorm.DB

View File

@@ -11,14 +11,14 @@ import (
"github.com/redis/go-redis/v9"
"github.com/rs/zerolog/log"
"github.com/treytartt/casera-api/internal/config"
"github.com/treytartt/casera-api/internal/database"
"github.com/treytartt/casera-api/internal/monitoring"
"github.com/treytartt/casera-api/internal/push"
"github.com/treytartt/casera-api/internal/repositories"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/casera-api/internal/worker/jobs"
"github.com/treytartt/casera-api/pkg/utils"
"github.com/treytartt/honeydue-api/internal/config"
"github.com/treytartt/honeydue-api/internal/database"
"github.com/treytartt/honeydue-api/internal/monitoring"
"github.com/treytartt/honeydue-api/internal/push"
"github.com/treytartt/honeydue-api/internal/repositories"
"github.com/treytartt/honeydue-api/internal/services"
"github.com/treytartt/honeydue-api/internal/worker/jobs"
"github.com/treytartt/honeydue-api/pkg/utils"
)
func main() {

View File

@@ -1,6 +1,6 @@
# Deploy Folder
This folder is the full production deploy toolkit for `myCribAPI-go`.
This folder is the full production deploy toolkit for `honeyDueAPI-go`.
Run deploy with:

View File

@@ -5,10 +5,10 @@ DEPLOY_MANAGER_SSH_PORT=22
DEPLOY_SSH_KEY_PATH=~/.ssh/id_ed25519
# Stack settings
DEPLOY_STACK_NAME=casera
DEPLOY_REMOTE_DIR=/opt/casera/deploy
DEPLOY_STACK_NAME=honeydue
DEPLOY_REMOTE_DIR=/opt/honeydue/deploy
DEPLOY_WAIT_SECONDS=420
DEPLOY_HEALTHCHECK_URL=https://api.casera.app/api/health/
DEPLOY_HEALTHCHECK_URL=https://api.honeyDue.treytartt.com/api/health/
# Replicas and published ports
API_REPLICAS=3

View File

@@ -1,20 +1,20 @@
# API service settings
DEBUG=false
ALLOWED_HOSTS=api.casera.app,casera.app
CORS_ALLOWED_ORIGINS=https://casera.app,https://admin.casera.app
ALLOWED_HOSTS=api.honeyDue.treytartt.com,honeyDue.treytartt.com
CORS_ALLOWED_ORIGINS=https://honeyDue.treytartt.com,https://admin.honeyDue.treytartt.com
TIMEZONE=UTC
BASE_URL=https://casera.app
BASE_URL=https://honeyDue.treytartt.com
PORT=8000
# Admin service settings
NEXT_PUBLIC_API_URL=https://api.casera.app
ADMIN_PANEL_URL=https://admin.casera.app
NEXT_PUBLIC_API_URL=https://api.honeyDue.treytartt.com
ADMIN_PANEL_URL=https://admin.honeyDue.treytartt.com
# Database (Neon recommended)
DB_HOST=CHANGEME_NEON_HOST
DB_PORT=5432
POSTGRES_USER=CHANGEME_DB_USER
POSTGRES_DB=casera
POSTGRES_DB=honeydue
DB_SSLMODE=require
DB_MAX_OPEN_CONNS=25
DB_MAX_IDLE_CONNS=10
@@ -29,13 +29,13 @@ EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_USE_TLS=true
EMAIL_HOST_USER=CHANGEME_EMAIL_USER
DEFAULT_FROM_EMAIL=Casera <noreply@casera.app>
DEFAULT_FROM_EMAIL=honeyDue <noreply@honeyDue.treytartt.com>
# Push notifications
# APNS private key goes in deploy/secrets/apns_auth_key.p8
APNS_AUTH_KEY_ID=CHANGEME_APNS_KEY_ID
APNS_TEAM_ID=CHANGEME_APNS_TEAM_ID
APNS_TOPIC=com.tt.casera
APNS_TOPIC=com.tt.honeyDue
APNS_USE_SANDBOX=false
APNS_PRODUCTION=true

View File

@@ -140,8 +140,8 @@ source "${PROD_ENV}"
set +a
DEPLOY_MANAGER_SSH_PORT="${DEPLOY_MANAGER_SSH_PORT:-22}"
DEPLOY_STACK_NAME="${DEPLOY_STACK_NAME:-casera}"
DEPLOY_REMOTE_DIR="${DEPLOY_REMOTE_DIR:-/opt/casera/deploy}"
DEPLOY_STACK_NAME="${DEPLOY_STACK_NAME:-honeydue}"
DEPLOY_REMOTE_DIR="${DEPLOY_REMOTE_DIR:-/opt/honeydue/deploy}"
DEPLOY_WAIT_SECONDS="${DEPLOY_WAIT_SECONDS:-420}"
DEPLOY_TAG="${DEPLOY_TAG:-$(git -C "${REPO_DIR}" rev-parse --short HEAD)}"
PUSH_LATEST_TAG="${PUSH_LATEST_TAG:-true}"
@@ -183,9 +183,9 @@ if (( app_secret_len < 32 )); then
fi
REGISTRY_PREFIX="${REGISTRY%/}/${REGISTRY_NAMESPACE#/}"
API_IMAGE="${REGISTRY_PREFIX}/casera-api:${DEPLOY_TAG}"
WORKER_IMAGE="${REGISTRY_PREFIX}/casera-worker:${DEPLOY_TAG}"
ADMIN_IMAGE="${REGISTRY_PREFIX}/casera-admin:${DEPLOY_TAG}"
API_IMAGE="${REGISTRY_PREFIX}/honeydue-api:${DEPLOY_TAG}"
WORKER_IMAGE="${REGISTRY_PREFIX}/honeydue-worker:${DEPLOY_TAG}"
ADMIN_IMAGE="${REGISTRY_PREFIX}/honeydue-admin:${DEPLOY_TAG}"
SSH_KEY_PATH="${DEPLOY_SSH_KEY_PATH:-}"
if [[ -n "${SSH_KEY_PATH}" ]]; then
@@ -232,12 +232,12 @@ if [[ "${SKIP_BUILD}" != "1" ]]; then
if [[ "${PUSH_LATEST_TAG}" == "true" ]]; then
log "Updating :latest tags"
docker tag "${API_IMAGE}" "${REGISTRY_PREFIX}/casera-api:latest"
docker tag "${WORKER_IMAGE}" "${REGISTRY_PREFIX}/casera-worker:latest"
docker tag "${ADMIN_IMAGE}" "${REGISTRY_PREFIX}/casera-admin:latest"
docker push "${REGISTRY_PREFIX}/casera-api:latest"
docker push "${REGISTRY_PREFIX}/casera-worker:latest"
docker push "${REGISTRY_PREFIX}/casera-admin:latest"
docker tag "${API_IMAGE}" "${REGISTRY_PREFIX}/honeydue-api:latest"
docker tag "${WORKER_IMAGE}" "${REGISTRY_PREFIX}/honeydue-worker:latest"
docker tag "${ADMIN_IMAGE}" "${REGISTRY_PREFIX}/honeydue-admin:latest"
docker push "${REGISTRY_PREFIX}/honeydue-api:latest"
docker push "${REGISTRY_PREFIX}/honeydue-worker:latest"
docker push "${REGISTRY_PREFIX}/honeydue-admin:latest"
fi
else
warn "SKIP_BUILD=1 set. Using prebuilt images for tag: ${DEPLOY_TAG}"

View File

@@ -19,7 +19,7 @@ services:
placement:
max_replicas_per_node: 1
networks:
- casera-network
- honeydue-network
api:
image: ${API_IMAGE}
@@ -129,7 +129,7 @@ services:
delay: 5s
order: stop-first
networks:
- casera-network
- honeydue-network
admin:
image: ${ADMIN_IMAGE}
@@ -161,7 +161,7 @@ services:
delay: 5s
order: stop-first
networks:
- casera-network
- honeydue-network
worker:
image: ${WORKER_IMAGE}
@@ -236,7 +236,7 @@ services:
delay: 5s
order: stop-first
networks:
- casera-network
- honeydue-network
dozzle:
image: amir20/dozzle:latest
@@ -258,14 +258,14 @@ services:
constraints:
- node.role == manager
networks:
- casera-network
- honeydue-network
volumes:
redis_data:
uploads:
networks:
casera-network:
honeydue-network:
driver: overlay
driver_opts:
encrypted: "true"

18
dev.sh
View File

@@ -1,5 +1,5 @@
#!/bin/bash
# Development helper script for MyCrib API (Go)
# Development helper script for HoneyDue API (Go)
set -e
@@ -67,7 +67,7 @@ case "$1" in
;;
db)
echo "🐘 Connecting to PostgreSQL..."
docker-compose $COMPOSE_FILES exec db psql -U ${POSTGRES_USER:-mycrib} -d ${POSTGRES_DB:-mycrib}
docker-compose $COMPOSE_FILES exec db psql -U ${POSTGRES_USER:-honeydue} -d ${POSTGRES_DB:-honeydue}
;;
redis)
echo "📮 Connecting to Redis..."
@@ -75,23 +75,23 @@ case "$1" in
;;
seed)
echo "🌱 Seeding lookup data..."
docker-compose $COMPOSE_FILES exec -T db psql -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-mycrib} -f - < seeds/001_lookups.sql
docker-compose $COMPOSE_FILES exec -T db psql -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-honeydue} -f - < seeds/001_lookups.sql
echo "✅ Lookup data seeded"
;;
seed-test)
echo "🧪 Seeding test data..."
docker-compose $COMPOSE_FILES exec -T db psql -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-mycrib} -f - < seeds/002_test_data.sql
docker-compose $COMPOSE_FILES exec -T db psql -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-honeydue} -f - < seeds/002_test_data.sql
echo "✅ Test data seeded"
;;
seed-all)
echo "🌱 Seeding all data..."
docker-compose $COMPOSE_FILES exec -T db psql -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-mycrib} -f - < seeds/001_lookups.sql
docker-compose $COMPOSE_FILES exec -T db psql -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-mycrib} -f - < seeds/002_test_data.sql
docker-compose $COMPOSE_FILES exec -T db psql -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-honeydue} -f - < seeds/001_lookups.sql
docker-compose $COMPOSE_FILES exec -T db psql -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-honeydue} -f - < seeds/002_test_data.sql
echo "✅ All data seeded"
;;
seed-admin)
echo "🔐 Seeding admin user..."
docker-compose $COMPOSE_FILES exec -T db psql -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-mycrib} -f - < seeds/003_admin_user.sql
docker-compose $COMPOSE_FILES exec -T db psql -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-honeydue} -f - < seeds/003_admin_user.sql
echo "✅ Admin user seeded"
;;
admin-install)
@@ -115,7 +115,7 @@ case "$1" in
migrate)
echo "📊 Running database migrations..."
# GORM auto-migrates on API startup, but we need GoAdmin tables
docker-compose $COMPOSE_FILES exec -T db psql -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-mycrib} -f - < migrations/002_goadmin_tables.up.sql
docker-compose $COMPOSE_FILES exec -T db psql -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-honeydue} -f - < migrations/002_goadmin_tables.up.sql
echo "✅ Migrations complete"
;;
clean)
@@ -134,7 +134,7 @@ case "$1" in
echo "🚀 Starting development environment..."
docker-compose $COMPOSE_FILES up
else
echo "Development helper script for MyCrib API (Go)"
echo "Development helper script for HoneyDue API (Go)"
echo ""
echo "Usage: ./dev.sh [command]"
echo ""

View File

@@ -6,28 +6,28 @@ services:
# PostgreSQL Database
db:
image: postgres:16-alpine
container_name: casera-db
container_name: honeydue-db
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER:-casera}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-casera_dev_password}
POSTGRES_DB: ${POSTGRES_DB:-casera}
POSTGRES_USER: ${POSTGRES_USER:-honeydue}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-honeydue_dev_password}
POSTGRES_DB: ${POSTGRES_DB:-honeydue}
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "${DB_PORT:-5433}:5432" # 5433 externally to avoid conflicts with local postgres
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-casera} -d ${POSTGRES_DB:-casera}"]
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-honeydue} -d ${POSTGRES_DB:-honeydue}"]
interval: 10s
timeout: 5s
retries: 5
networks:
- casera-network
- honeydue-network
# Redis Cache
redis:
image: redis:7-alpine
container_name: casera-redis
container_name: honeydue-redis
restart: unless-stopped
command: redis-server --appendonly yes
volumes:
@@ -40,14 +40,14 @@ services:
timeout: 5s
retries: 5
networks:
- casera-network
- honeydue-network
# Casera API
# honeyDue API
api:
build:
context: .
target: api
container_name: casera-api
container_name: honeydue-api
restart: unless-stopped
ports:
- "${PORT:-8000}:8000"
@@ -61,9 +61,9 @@ services:
# Database
DB_HOST: db
DB_PORT: "5432"
POSTGRES_USER: ${POSTGRES_USER:-casera}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-casera_dev_password}
POSTGRES_DB: ${POSTGRES_DB:-casera}
POSTGRES_USER: ${POSTGRES_USER:-honeydue}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-honeydue_dev_password}
POSTGRES_DB: ${POSTGRES_DB:-honeydue}
DB_SSLMODE: "disable"
# Redis
@@ -77,14 +77,14 @@ services:
EMAIL_PORT: ${EMAIL_PORT:-587}
EMAIL_HOST_USER: ${EMAIL_HOST_USER}
EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD}
DEFAULT_FROM_EMAIL: ${DEFAULT_FROM_EMAIL:-Casera <noreply@casera.com>}
DEFAULT_FROM_EMAIL: ${DEFAULT_FROM_EMAIL:-honeyDue <noreply@honeyDue.treytartt.com>}
EMAIL_USE_TLS: "true"
# Push Notifications
APNS_AUTH_KEY_PATH: ${APNS_AUTH_KEY_PATH}
APNS_AUTH_KEY_ID: ${APNS_AUTH_KEY_ID}
APNS_TEAM_ID: ${APNS_TEAM_ID}
APNS_TOPIC: ${APNS_TOPIC:-com.example.casera}
APNS_TOPIC: ${APNS_TOPIC:-com.tt.honeyDue}
APNS_USE_SANDBOX: "true"
FCM_SERVER_KEY: ${FCM_SERVER_KEY}
volumes:
@@ -102,14 +102,14 @@ services:
start_period: 10s
retries: 3
networks:
- casera-network
- honeydue-network
# Casera Admin Panel (Next.js)
# honeyDue Admin Panel (Next.js)
admin:
build:
context: .
target: admin
container_name: casera-admin
container_name: honeydue-admin
restart: unless-stopped
ports:
- "${ADMIN_PORT:-3000}:3000"
@@ -126,22 +126,22 @@ services:
timeout: 10s
retries: 3
networks:
- casera-network
- honeydue-network
# Casera Worker (Background Jobs)
# honeyDue Worker (Background Jobs)
worker:
build:
context: .
target: worker
container_name: casera-worker
container_name: honeydue-worker
restart: unless-stopped
environment:
# Database
DB_HOST: db
DB_PORT: "5432"
POSTGRES_USER: ${POSTGRES_USER:-casera}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-casera_dev_password}
POSTGRES_DB: ${POSTGRES_DB:-casera}
POSTGRES_USER: ${POSTGRES_USER:-honeydue}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-honeydue_dev_password}
POSTGRES_DB: ${POSTGRES_DB:-honeydue}
DB_SSLMODE: "disable"
# Redis
@@ -154,7 +154,7 @@ services:
APNS_AUTH_KEY_PATH: "/certs/apns_key.p8"
APNS_AUTH_KEY_ID: ${APNS_AUTH_KEY_ID}
APNS_TEAM_ID: ${APNS_TEAM_ID}
APNS_TOPIC: ${APNS_TOPIC:-com.example.casera}
APNS_TOPIC: ${APNS_TOPIC:-com.tt.honeyDue}
APNS_USE_SANDBOX: "true"
FCM_SERVER_KEY: ${FCM_SERVER_KEY}
@@ -163,7 +163,7 @@ services:
EMAIL_PORT: ${EMAIL_PORT:-587}
EMAIL_HOST_USER: ${EMAIL_HOST_USER}
EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD}
DEFAULT_FROM_EMAIL: ${DEFAULT_FROM_EMAIL:-Casera <noreply@casera.com>}
DEFAULT_FROM_EMAIL: ${DEFAULT_FROM_EMAIL:-honeyDue <noreply@honeyDue.treytartt.com>}
EMAIL_USE_TLS: "true"
# Worker settings (UTC hours for scheduled jobs)
@@ -178,12 +178,12 @@ services:
redis:
condition: service_healthy
networks:
- casera-network
- honeydue-network
# Dozzle — lightweight real-time log viewer
dozzle:
image: amir20/dozzle:latest
container_name: casera-dozzle
container_name: honeydue-dozzle
restart: unless-stopped
ports:
- "${DOZZLE_PORT:-9999}:8080"
@@ -192,12 +192,12 @@ services:
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- casera-network
- honeydue-network
volumes:
postgres_data:
redis_data:
networks:
casera-network:
honeydue-network:
driver: bridge

View File

@@ -1,6 +1,6 @@
# Production / Docker Swarm compose file
# Usage:
# docker stack deploy -c docker-compose.yml casera
# docker stack deploy -c docker-compose.yml honeydue
#
# All env vars must be set in the environment or a .env file.
# No dev-safe defaults — missing vars will fail the deploy.
@@ -30,7 +30,7 @@ services:
parallelism: 1
delay: 10s
networks:
- casera-network
- honeydue-network
# Redis Cache
redis:
@@ -50,11 +50,11 @@ services:
condition: any
delay: 5s
networks:
- casera-network
- honeydue-network
# Casera API
# honeyDue API
api:
image: ${REGISTRY:-ghcr.io/treytartt}/casera-api:${TAG:-latest}
image: ${REGISTRY:-ghcr.io/treytartt}/honeydue-api:${TAG:-latest}
ports:
- "${PORT:-8000}:8000"
environment:
@@ -113,11 +113,11 @@ services:
delay: 10s
order: start-first
networks:
- casera-network
- honeydue-network
# Casera Admin Panel (Next.js)
# honeyDue Admin Panel (Next.js)
admin:
image: ${REGISTRY:-ghcr.io/treytartt}/casera-admin:${TAG:-latest}
image: ${REGISTRY:-ghcr.io/treytartt}/honeydue-admin:${TAG:-latest}
ports:
- "${ADMIN_PORT:-3000}:3000"
environment:
@@ -139,11 +139,11 @@ services:
delay: 10s
order: start-first
networks:
- casera-network
- honeydue-network
# Casera Worker (Background Jobs)
# honeyDue Worker (Background Jobs)
worker:
image: ${REGISTRY:-ghcr.io/treytartt}/casera-worker:${TAG:-latest}
image: ${REGISTRY:-ghcr.io/treytartt}/honeydue-worker:${TAG:-latest}
environment:
# Database
DB_HOST: db
@@ -187,7 +187,7 @@ services:
condition: any
delay: 5s
networks:
- casera-network
- honeydue-network
# Dozzle — lightweight real-time log viewer
dozzle:
@@ -207,7 +207,7 @@ services:
constraints:
- node.role == manager
networks:
- casera-network
- honeydue-network
volumes:
postgres_data:
@@ -216,5 +216,5 @@ volumes:
uploads:
networks:
casera-network:
honeydue-network:
driver: overlay

View File

@@ -1,7 +1,7 @@
# MyCrib Go Backend — Deep Audit Findings
# HoneyDue Go Backend — Deep Audit Findings
**Date**: 2026-03-01
**Scope**: All non-test `.go` files under `myCribAPI-go/`
**Scope**: All non-test `.go` files under `honeyDueAPI-go/`
**Agents**: 9 parallel audit agents covering security, authorization, data integrity, concurrency, performance, error handling, architecture compliance, API contracts, and cross-cutting logic
---
@@ -42,7 +42,7 @@
### SEC-04 | CRITICAL | Next.js admin password reset to "admin123" on every migration
- **File**: `internal/database/database.go:447-463`
- **What**: Lines 458-463 unconditionally update the admin@mycrib.com password to the bcrypt hash of "admin123" on every migration. The log message on line 463 even says "Updated admin@mycrib.com password to admin123."
- **What**: Lines 458-463 unconditionally update the admin@honeydue.com password to the bcrypt hash of "admin123" on every migration. The log message on line 463 even says "Updated admin@honeydue.com password to admin123."
- **Impact**: The admin API is permanently accessible with hardcoded credentials. Any attacker who discovers the endpoint can access full admin functionality.
### SEC-05 | CRITICAL | SQL injection via SortBy in all admin list endpoints
@@ -236,7 +236,7 @@
### AUTH-06 | CRITICAL | Hardcoded admin credentials reset on every migration
- **File**: `internal/database/database.go:372-382,447-463`
- **What**: Hardcoded admin credentials (`admin@mycrib.com` / `admin123` and GoAdmin password of `admin`) are re-applied on every server restart/migration, overwriting any password changes.
- **What**: Hardcoded admin credentials (`admin@honeydue.com` / `admin123` and GoAdmin password of `admin`) are re-applied on every server restart/migration, overwriting any password changes.
- **Impact**: If these endpoints are accessible in production, any attacker with knowledge of these default credentials can gain full admin access.
### AUTH-07 | BUG | User-controlled category parameter enables storage path manipulation
@@ -350,7 +350,7 @@
### DATA-07 | CRITICAL | Next.js admin password reset on every migration run
- **File**: `internal/database/database.go:458-463`
- **What**: Unconditionally updates admin@mycrib.com password to "admin123" on every migration.
- **What**: Unconditionally updates admin@honeydue.com password to "admin123" on every migration.
- **Impact**: Same persistent backdoor.
### DATA-08 | BUG | GetAllUsers/HasAccess silently wrong when associations not preloaded

View File

@@ -1,6 +1,6 @@
# Dokku Deployment Guide for Casera API
# Dokku Deployment Guide for honeyDue API
This guide provides step-by-step instructions for deploying the Casera Go API to a remote server using Dokku.
This guide provides step-by-step instructions for deploying the honeyDue Go API to a remote server using Dokku.
## Table of Contents
@@ -90,7 +90,7 @@ sudo DOKKU_TAG=v0.34.4 bash bootstrap.sh
```bash
# Set your domain (replace with your actual domain)
dokku domains:set-global casera.treytartt.com
dokku domains:set-global honeyDue.treytartt.com
# Add your SSH public key for deployments
# Run this from your LOCAL machine:
@@ -117,13 +117,13 @@ dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git
### 1. Create the Dokku App
```bash
dokku apps:create casera-api
dokku apps:create honeydue-api
```
### 2. Set the Domain
```bash
dokku domains:add casera-api api.casera.treytartt.com
dokku domains:add honeydue-api api.honeyDue.treytartt.com
```
### 3. Configure Buildpack (if needed)
@@ -131,8 +131,8 @@ dokku domains:add casera-api api.casera.treytartt.com
The app uses a Dockerfile, so Dokku will auto-detect it. If you need to force Docker builds:
```bash
dokku builder:set casera-api build-dir .
dokku builder-dockerfile:set casera-api dockerfile-path Dockerfile
dokku builder:set honeydue-api build-dir .
dokku builder-dockerfile:set honeydue-api dockerfile-path Dockerfile
```
---
@@ -143,20 +143,20 @@ dokku builder-dockerfile:set casera-api dockerfile-path Dockerfile
```bash
# Create the database service
dokku postgres:create casera-db
dokku postgres:create honeydue-db
# Link to the app (automatically sets DATABASE_URL)
dokku postgres:link casera-db casera-api
dokku postgres:link honeydue-db honeydue-api
```
### 2. Verify Connection
```bash
# Check the connection info
dokku postgres:info casera-db
dokku postgres:info honeydue-db
# Connect to the database
dokku postgres:connect casera-db
dokku postgres:connect honeydue-db
```
### 3. Set Individual Database Variables
@@ -165,13 +165,13 @@ Dokku sets `DATABASE_URL` automatically, but the app expects individual variable
```bash
# Get the database credentials
dokku postgres:info casera-db
dokku postgres:info honeydue-db
# Set individual variables (replace with actual values from info command)
dokku config:set casera-api \
DB_HOST=dokku-postgres-casera-db \
dokku config:set honeydue-api \
DB_HOST=dokku-postgres-honeydue-db \
DB_PORT=5432 \
POSTGRES_DB=casera_db \
POSTGRES_DB=honeydue_db \
POSTGRES_USER=postgres \
POSTGRES_PASSWORD=1mJPfu6rzG9r6xukcGbUOU5NoCg0jKfa
```
@@ -184,16 +184,16 @@ dokku config:set casera-api \
```bash
# Create the Redis service
dokku redis:create casera-redis
dokku redis:create honeydue-redis
# Link to the app (automatically sets REDIS_URL)
dokku redis:link casera-redis casera-api
dokku redis:link honeydue-redis honeydue-api
```
### 2. Verify Connection
```bash
dokku redis:info casera-redis
dokku redis:info honeydue-redis
```
---
@@ -203,10 +203,10 @@ dokku redis:info casera-redis
### 1. Required Variables
```bash
dokku config:set casera-api \
dokku config:set honeydue-api \
PORT=5000 \
DEBUG=false \
ALLOWED_HOSTS=api.casera.treytartt.com,localhost \
ALLOWED_HOSTS=api.honeyDue.treytartt.com,localhost \
TIMEZONE=UTC \
SECRET_KEY=8553813eda361017a02677ed504abdd331537cfe6f7cc407345f037cc22c75fc
```
@@ -214,20 +214,20 @@ dokku config:set casera-api \
### 2. Email Configuration
```bash
dokku config:set casera-api \
dokku config:set honeydue-api \
EMAIL_HOST=smtp.fastmail.com \
EMAIL_PORT=587 \
EMAIL_USE_TLS=true \
EMAIL_HOST_USER=treytartt@fastmail.com \
EMAIL_HOST_PASSWORD=2t9y4n4t497z5863 \
DEFAULT_FROM_EMAIL="Casera <treytartt@fastmail.com>"
DEFAULT_FROM_EMAIL="honeyDue <treytartt@fastmail.com>"
```
### 3. Apple Sign In (Optional)
```bash
dokku config:set casera-api \
APPLE_CLIENT_ID=com.tt.casera.CaseraDev \
dokku config:set honeydue-api \
APPLE_CLIENT_ID=com.tt.honeyDue.honeyDueDev \
APPLE_TEAM_ID=V3PF3M6B6U
```
@@ -236,11 +236,11 @@ dokku config:set casera-api \
The API uses direct APNs/FCM connections (no external push server needed):
```bash
dokku config:set casera-api \
dokku config:set honeydue-api \
APNS_AUTH_KEY_PATH=/push_certs/AuthKey_R9N3SM2WD5.p8 \
APNS_AUTH_KEY_ID=R9N3SM2WD5 \
APNS_TEAM_ID=V3PF3M6B6U \
APNS_TOPIC=com.tt.casera.CaseraDev \
APNS_TOPIC=com.tt.honeyDue.honeyDueDev \
APNS_PRODUCTION=true \
FCM_SERVER_KEY=your-firebase-server-key
```
@@ -248,14 +248,14 @@ dokku config:set casera-api \
### 5. Admin Panel URL
```bash
dokku config:set casera-api \
NEXT_PUBLIC_API_URL=https://api.casera.treytartt.com
dokku config:set honeydue-api \
NEXT_PUBLIC_API_URL=https://api.honeyDue.treytartt.com
```
### 6. View All Configuration
```bash
dokku config:show casera-api
dokku config:show honeydue-api
```
---
@@ -266,16 +266,16 @@ dokku config:show casera-api
```bash
# Create storage directory on host
mkdir -p /var/lib/dokku/data/storage/casera-api/uploads
mkdir -p /var/lib/dokku/data/storage/honeydue-api/uploads
# Set permissions
chown -R 32767:32767 /var/lib/dokku/data/storage/casera-api
chown -R 32767:32767 /var/lib/dokku/data/storage/honeydue-api
```
### 2. Mount Storage to App
```bash
dokku storage:mount casera-api /var/lib/dokku/data/storage/casera-api/uploads:/app/uploads
dokku storage:mount honeydue-api /var/lib/dokku/data/storage/honeydue-api/uploads:/app/uploads
```
---
@@ -285,8 +285,8 @@ dokku storage:mount casera-api /var/lib/dokku/data/storage/casera-api/uploads:/a
### 1. Add Dokku Remote (Local Machine)
```bash
cd /path/to/myCribAPI-go
git remote add dokku dokku@your-server-ip:casera-api
cd /path/to/honeyDueAPI-go
git remote add dokku dokku@your-server-ip:honeydue-api
```
### 2. Deploy
@@ -301,17 +301,17 @@ git push dokku main
```bash
# On server
dokku logs casera-api -t
dokku logs honeydue-api -t
```
### 4. Verify Deployment
```bash
# Check app status
dokku ps:report casera-api
dokku ps:report honeydue-api
# Check app is running
curl https://api.casera.treytartt.com/api/health/
curl https://api.honeyDue.treytartt.com/api/health/
```
---
@@ -321,13 +321,13 @@ curl https://api.casera.treytartt.com/api/health/
### 1. Set Let's Encrypt Email
```bash
dokku letsencrypt:set casera-api email admin@treytartt.com
dokku letsencrypt:set honeydue-api email admin@treytartt.com
```
### 2. Enable Let's Encrypt
```bash
dokku letsencrypt:enable casera-api
dokku letsencrypt:enable honeydue-api
```
### 3. Set Up Auto-Renewal
@@ -345,7 +345,7 @@ The worker process handles background jobs (task reminders, overdue alerts, dail
### 1. Configure Worker Environment Variables
```bash
dokku config:set casera-api \
dokku config:set honeydue-api \
TASK_REMINDER_HOUR=20 \
TASK_REMINDER_MINUTE=0 \
OVERDUE_REMINDER_HOUR=9 \
@@ -364,17 +364,17 @@ dokku config:set casera-api \
```bash
# Scale to 1 worker
dokku ps:scale casera-api worker=1
dokku ps:scale honeydue-api worker=1
# Verify processes
dokku ps:report casera-api
dokku ps:report honeydue-api
```
### 3. Verify Worker is Running
```bash
# Check worker logs
dokku logs casera-api -p worker
dokku logs honeydue-api -p worker
# Should see:
# "Registered task reminder job"
@@ -391,33 +391,33 @@ dokku logs casera-api -p worker
```bash
# Real-time logs
dokku logs casera-api -t
dokku logs honeydue-api -t
# Last 100 lines
dokku logs casera-api -n 100
dokku logs honeydue-api -n 100
# Worker logs
dokku logs casera-api -p worker
dokku logs honeydue-api -p worker
```
### Database Operations
```bash
# Connect to database
dokku postgres:connect casera-db
dokku postgres:connect honeydue-db
# Export database backup
dokku postgres:export casera-db > backup.sql
dokku postgres:export honeydue-db > backup.sql
# Import database backup
dokku postgres:import casera-db < backup.sql
dokku postgres:import honeydue-db < backup.sql
```
### Run Migrations Manually
```bash
# Enter the app container
dokku enter casera-api web
dokku enter honeydue-api web
# Migrations run automatically on startup, but if needed:
/app/api migrate
@@ -426,24 +426,24 @@ dokku enter casera-api web
### Restart App
```bash
dokku ps:restart casera-api
dokku ps:restart honeydue-api
```
### Scale App
```bash
# Scale web process
dokku ps:scale casera-api web=2 worker=1
dokku ps:scale honeydue-api web=2 worker=1
# View current scale
dokku ps:report casera-api
dokku ps:report honeydue-api
```
### Stop/Start App
```bash
dokku ps:stop casera-api
dokku ps:start casera-api
dokku ps:stop honeydue-api
dokku ps:start honeydue-api
```
---
@@ -453,8 +453,8 @@ dokku ps:start casera-api
### Check App Status
```bash
dokku ps:report casera-api
dokku logs casera-api -n 200
dokku ps:report honeydue-api
dokku logs honeydue-api -n 200
```
### Common Issues
@@ -463,47 +463,47 @@ dokku logs casera-api -n 200
```bash
# Check logs for errors
dokku logs casera-api -n 500
dokku logs honeydue-api -n 500
# Verify environment variables
dokku config:show casera-api
dokku config:show honeydue-api
# Check if ports are available
dokku proxy:ports casera-api
dokku proxy:ports honeydue-api
```
#### 2. Database Connection Failed
```bash
# Verify link
dokku postgres:linked casera-api casera-db
dokku postgres:linked honeydue-api honeydue-db
# Check database is running
dokku postgres:info casera-db
dokku postgres:info honeydue-db
# Re-link if needed
dokku postgres:unlink casera-db casera-api
dokku postgres:link casera-db casera-api
dokku postgres:unlink honeydue-db honeydue-api
dokku postgres:link honeydue-db honeydue-api
```
#### 3. Redis Connection Failed
```bash
# Verify link
dokku redis:linked casera-api casera-redis
dokku redis:linked honeydue-api honeydue-redis
# Check Redis is running
dokku redis:info casera-redis
dokku redis:info honeydue-redis
```
#### 4. Storage/Upload Issues
```bash
# Check mounts
dokku storage:report casera-api
dokku storage:report honeydue-api
# Verify permissions
ls -la /var/lib/dokku/data/storage/casera-api/
ls -la /var/lib/dokku/data/storage/honeydue-api/
```
#### 5. SSL Certificate Issues
@@ -513,7 +513,7 @@ ls -la /var/lib/dokku/data/storage/casera-api/
dokku letsencrypt:list
# Renew manually
dokku letsencrypt:enable casera-api
dokku letsencrypt:enable honeydue-api
```
### View Resource Usage
@@ -523,7 +523,7 @@ dokku letsencrypt:enable casera-api
docker stats
# Disk usage
dokku storage:report casera-api
dokku storage:report honeydue-api
df -h
```
@@ -534,12 +534,12 @@ df -h
| Command | Description |
|---------|-------------|
| `dokku apps:list` | List all apps |
| `dokku logs casera-api -t` | Tail logs |
| `dokku ps:restart casera-api` | Restart app |
| `dokku config:show casera-api` | Show env vars |
| `dokku postgres:connect casera-db` | Connect to DB |
| `dokku enter casera-api web` | Shell into container |
| `dokku ps:scale casera-api web=2` | Scale processes |
| `dokku logs honeydue-api -t` | Tail logs |
| `dokku ps:restart honeydue-api` | Restart app |
| `dokku config:show honeydue-api` | Show env vars |
| `dokku postgres:connect honeydue-db` | Connect to DB |
| `dokku enter honeydue-api web` | Shell into container |
| `dokku ps:scale honeydue-api web=2` | Scale processes |
---

View File

@@ -1,6 +1,6 @@
# Go To Prod Plan
This document is a phased production-readiness plan for the Casera Go API repo.
This document is a phased production-readiness plan for the honeyDue Go API repo.
Execute phases in order. Do not skip exit criteria.
## How To Use This Plan
@@ -15,12 +15,12 @@ Goal: eliminate known repo/config drift before hardening.
### Tasks
1. Fix stale admin build/run targets in [`Makefile`](/Users/treyt/Desktop/code/MyCribAPI_GO/Makefile) that reference `cmd/admin` (non-existent).
2. Align worker env vars in [`docker-compose.yml`](/Users/treyt/Desktop/code/MyCribAPI_GO/docker-compose.yml) with Go config:
1. Fix stale admin build/run targets in [`Makefile`](/Users/treyt/Desktop/code/HoneyDueAPI_GO/Makefile) that reference `cmd/admin` (non-existent).
2. Align worker env vars in [`docker-compose.yml`](/Users/treyt/Desktop/code/HoneyDueAPI_GO/docker-compose.yml) with Go config:
- use `TASK_REMINDER_HOUR`
- use `OVERDUE_REMINDER_HOUR`
- use `DAILY_DIGEST_HOUR`
3. Align supported locales in [`internal/i18n/i18n.go`](/Users/treyt/Desktop/code/MyCribAPI_GO/internal/i18n/i18n.go) with translation files in [`internal/i18n/translations`](/Users/treyt/Desktop/code/MyCribAPI_GO/internal/i18n/translations).
3. Align supported locales in [`internal/i18n/i18n.go`](/Users/treyt/Desktop/code/HoneyDueAPI_GO/internal/i18n/i18n.go) with translation files in [`internal/i18n/translations`](/Users/treyt/Desktop/code/HoneyDueAPI_GO/internal/i18n/translations).
4. Remove any committed secrets/keys from repo and history; rotate immediately.
### Validation
@@ -42,7 +42,7 @@ Goal: block regressions by policy.
### Tasks
1. Update [`/.github/workflows/backend-ci.yml`](/Users/treyt/Desktop/code/MyCribAPI_GO/.github/workflows/backend-ci.yml) with required jobs:
1. Update [`/.github/workflows/backend-ci.yml`](/Users/treyt/Desktop/code/HoneyDueAPI_GO/.github/workflows/backend-ci.yml) with required jobs:
- `lint` (`go vet ./...`, `gofmt -l .`)
- `test` (`go test -race -count=1 ./...`)
- `contract` (`go test -v -run "TestRouteSpecContract|TestKMPSpecContract" ./internal/integration/`)
@@ -72,7 +72,7 @@ Goal: guarantee deploy safety for API behavior and schema changes.
### Tasks
1. Keep OpenAPI as source of truth in [`docs/openapi.yaml`](/Users/treyt/Desktop/code/MyCribAPI_GO/docs/openapi.yaml).
1. Keep OpenAPI as source of truth in [`docs/openapi.yaml`](/Users/treyt/Desktop/code/HoneyDueAPI_GO/docs/openapi.yaml).
2. Require route/schema updates in same PR as handler changes.
3. Add migration checks in CI:
- migrate up on clean DB
@@ -166,7 +166,7 @@ Goal: make production behavior measurable and actionable.
- queue depth/retry spikes
- DB latency
4. Add dead-letter queue review and replay procedure.
5. Document incident runbooks in [`docs/`](/Users/treyt/Desktop/code/MyCribAPI_GO/docs):
5. Document incident runbooks in [`docs/`](/Users/treyt/Desktop/code/HoneyDueAPI_GO/docs):
- DB outage
- Redis outage
- push provider outage

View File

@@ -1,8 +1,8 @@
# Full Localization Plan for Casera
# Full Localization Plan for honeyDue
## Overview
Complete localization of the Casera property management app across three codebases:
Complete localization of the honeyDue property management app across three codebases:
- **Go API** - Server-side localization of errors, emails, push notifications, lookup data
- **KMM/Android** - Compose Multiplatform string resources
- **iOS** - Apple String Catalogs (.xcstrings)
@@ -28,7 +28,7 @@ go get github.com/nicksnyder/go-i18n/v2
### 1.2 Directory Structure
```
myCribAPI-go/
honeyDueAPI-go/
├── internal/
│ └── i18n/
│ ├── i18n.go # Core setup, bundle, T() helper
@@ -139,7 +139,7 @@ Use Compose Multiplatform Resources (already in build.gradle.kts via `compose.co
### 2.2 Directory Structure
```
MyCribKMM/composeApp/src/commonMain/
HoneyDueKMM/composeApp/src/commonMain/
└── composeResources/
├── values/
│ └── strings.xml # English (base)
@@ -195,8 +195,8 @@ MyCribKMM/composeApp/src/commonMain/
### 2.4 Usage in Compose
```kotlin
import casera.composeapp.generated.resources.Res
import casera.composeapp.generated.resources.*
import honeydue.composeapp.generated.resources.Res
import honeydue.composeapp.generated.resources.*
import org.jetbrains.compose.resources.stringResource
@Composable

View File

@@ -1,10 +1,10 @@
# Push Notifications Architecture
This document describes how push notifications work in the Casera API.
This document describes how push notifications work in the honeyDue API.
## Overview
The Casera API sends push notifications directly to Apple Push Notification service (APNs) and Firebase Cloud Messaging (FCM) without any intermediate push server. This approach:
The honeyDue API sends push notifications directly to Apple Push Notification service (APNs) and Firebase Cloud Messaging (FCM) without any intermediate push server. This approach:
- Reduces infrastructure complexity (no Gorush or other push server needed)
- Provides direct control over notification payloads
@@ -14,7 +14,7 @@ The Casera API sends push notifications directly to Apple Push Notification serv
```
┌─────────────────────────────────────────────────────────────────────────┐
Casera API │
honeyDue API │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌─────────────────────┐ ┌───────────────────┐ │
@@ -153,7 +153,7 @@ let taskCategory = UNNotificationCategory(
| `APNS_AUTH_KEY_PATH` | For iOS | Path to .p8 key file |
| `APNS_AUTH_KEY_ID` | For iOS | Key ID from Apple Developer |
| `APNS_TEAM_ID` | For iOS | Team ID from Apple Developer |
| `APNS_TOPIC` | For iOS | Bundle ID (e.g., `com.tt.casera.CaseraDev`) |
| `APNS_TOPIC` | For iOS | Bundle ID (e.g., `com.tt.honeyDue.honeyDueDev`) |
| `APNS_PRODUCTION` | No | `true` for production, `false` for sandbox |
| `APNS_USE_SANDBOX` | No | Deprecated, use `APNS_PRODUCTION` |
| `FCM_SERVER_KEY` | For Android | Firebase Cloud Messaging server key |
@@ -168,7 +168,7 @@ volumes:
- ./push_certs:/certs:ro
# Dokku
dokku storage:mount casera-api /path/to/push_certs:/certs
dokku storage:mount honeydue-api /path/to/push_certs:/certs
```
## Data Flow
@@ -263,7 +263,7 @@ log.Info().
docker-compose logs -f worker
# Dokku
dokku logs casera-api -p worker
dokku logs honeydue-api -p worker
```
### Test Push Manually

View File

@@ -192,7 +192,7 @@ suspend fun fetchMedia(mediaUrl: String): ByteArray {
## Files to Modify
### Go API (myCribAPI-go)
### Go API (honeyDueAPI-go)
| File | Change |
|------|--------|
@@ -203,7 +203,7 @@ suspend fun fetchMedia(mediaUrl: String): ByteArray {
| `/internal/services/document_service.go` | Update to generate proxy URLs |
| `/internal/services/task_service.go` | Update to generate proxy URLs for completions |
### iOS (MyCribKMM/iosApp)
### iOS (HoneyDueKMM/iosApp)
| File | Change |
|------|--------|

View File

@@ -48,7 +48,7 @@ To enable server-side receipt validation:
1. Go to [App Store Connect > Users and Access > Keys](https://appstoreconnect.apple.com/access/api)
2. Click **Generate API Key**
3. Give it a name (e.g., "Casera IAP Server")
3. Give it a name (e.g., "honeyDue IAP Server")
4. Select **App Manager** role (minimum required for IAP)
5. Download the `.p8` file - **you can only download it once!**
6. Note the **Key ID** and **Issuer ID**
@@ -80,15 +80,15 @@ Google uses Cloud Pub/Sub to deliver subscription notifications. Setup requires
2. Select your project (or create one)
3. Navigate to **Pub/Sub** > **Topics**
4. Click **Create Topic**
5. Name it (e.g., `casera-subscriptions`)
6. Note the full topic name: `projects/your-project-id/topics/casera-subscriptions`
5. Name it (e.g., `honeydue-subscriptions`)
6. Note the full topic name: `projects/your-project-id/topics/honeydue-subscriptions`
### 2. Create a Push Subscription
1. In the Pub/Sub Topics list, click on your topic
2. Click **Create Subscription**
3. Configure:
- **Subscription ID**: `casera-subscription-webhook`
- **Subscription ID**: `honeydue-subscription-webhook`
- **Delivery type**: Push
- **Endpoint URL**: `https://your-domain.com/api/subscription/webhook/google/`
- **Acknowledgment deadline**: 60 seconds
@@ -100,7 +100,7 @@ Google uses Cloud Pub/Sub to deliver subscription notifications. Setup requires
2. Select your app
3. Navigate to **Monetization** > **Monetization setup**
4. Under **Real-time developer notifications**:
- Enter your topic name: `projects/your-project-id/topics/casera-subscriptions`
- Enter your topic name: `projects/your-project-id/topics/honeydue-subscriptions`
5. Click **Save**
6. Click **Send test notification** to verify the connection
@@ -108,7 +108,7 @@ Google uses Cloud Pub/Sub to deliver subscription notifications. Setup requires
1. Go to [Google Cloud Console > IAM & Admin > Service Accounts](https://console.cloud.google.com/iam-admin/serviceaccounts)
2. Click **Create Service Account**
3. Name it (e.g., `casera-iap-validator`)
3. Name it (e.g., `honeydue-iap-validator`)
4. Grant roles:
- `Pub/Sub Subscriber` (for webhook handling)
5. Click **Done**

View File

@@ -1,6 +1,6 @@
# Task Kanban Categorization
This document explains how tasks are categorized into kanban columns in the Casera application.
This document explains how tasks are categorized into kanban columns in the honeyDue application.
> Note: The categorization chain still computes `cancelled_tasks`, but the kanban board response
> intentionally hides cancelled/archived tasks and returns only 5 visible columns.
@@ -245,7 +245,7 @@ Each column has associated metadata for UI rendering:
### Basic Categorization
```go
import "github.com/treytartt/casera-api/internal/task/categorization"
import "github.com/treytartt/honeydue-api/internal/task/categorization"
task := &models.Task{
DueDate: time.Now().AddDate(0, 0, 15), // 15 days from now

View File

@@ -1,6 +1,6 @@
# Task Kanban Board Categorization Logic
This document describes how tasks are categorized into kanban columns for display in the Casera mobile app.
This document describes how tasks are categorized into kanban columns for display in the honeyDue mobile app.
> Important: The board intentionally returns **5 visible columns**. Cancelled and archived tasks are
> hidden from board responses (though task-level `kanban_column` may still be `cancelled_tasks`).

View File

@@ -22,7 +22,7 @@ internal/task/
Pure Go functions that define task logic. These are the **canonical definitions** for all task states.
```go
import "github.com/treytartt/casera-api/internal/task/predicates"
import "github.com/treytartt/honeydue-api/internal/task/predicates"
// State checks
predicates.IsCompleted(task) // NextDueDate == nil && len(Completions) > 0
@@ -43,7 +43,7 @@ predicates.IsUpcoming(task, now, days) // Everything else
GORM scope functions that produce the same results as predicates, but execute at the database level. Use these when counting or filtering large datasets without loading all records into memory.
```go
import "github.com/treytartt/casera-api/internal/task/scopes"
import "github.com/treytartt/honeydue-api/internal/task/scopes"
// State scopes
db.Scopes(scopes.ScopeActive) // is_cancelled = false AND is_archived = false
@@ -69,7 +69,7 @@ db.Scopes(scopes.ScopeKanbanOrder) // Due date ASC, priority DESC, cr
Determines which kanban column a task belongs to. Uses predicates internally.
```go
import "github.com/treytartt/casera-api/internal/task/categorization"
import "github.com/treytartt/honeydue-api/internal/task/categorization"
// Single task
column := categorization.CategorizeTask(task, 30)
@@ -85,7 +85,7 @@ columns := categorization.CategorizeTasksIntoColumns(tasks, 30)
For most use cases, import the main task package which re-exports everything:
```go
import "github.com/treytartt/casera-api/internal/task"
import "github.com/treytartt/honeydue-api/internal/task"
// Use predicates
if task.IsCompleted(t) { ... }
@@ -344,7 +344,7 @@ predicates.IsInProgress(task) // Checks task.InProgress boolean
For most files, use the convenience re-exports:
```go
import "github.com/treytartt/casera-api/internal/task"
import "github.com/treytartt/honeydue-api/internal/task"
// Then use:
task.IsCompleted(t)
@@ -355,8 +355,8 @@ task.CategorizeTask(t, 30)
For files that only need predicates or only need scopes:
```go
import "github.com/treytartt/casera-api/internal/task/predicates"
import "github.com/treytartt/casera-api/internal/task/scopes"
import "github.com/treytartt/honeydue-api/internal/task/predicates"
import "github.com/treytartt/honeydue-api/internal/task/scopes"
```
## Related Documentation

View File

@@ -2,7 +2,7 @@
*Last Updated: December 2024*
This document provides a comprehensive comparison of home management apps similar to Casera/MyCrib.
This document provides a comprehensive comparison of home management apps similar to honeyDue/HoneyDue.
---
@@ -10,7 +10,7 @@ This document provides a comprehensive comparison of home management apps simila
| App | Task Scheduling | Multi-Property | Document Storage | Contractors | Warranty Tracking | Pricing |
|-----|----------------|----------------|------------------|-------------|-------------------|---------|
| **Casera (MyCrib)** | Recurring + Kanban | Yes | Yes | Yes | Yes | TBD |
| **honeyDue** | Recurring + Kanban | Yes | Yes | Yes | Yes | TBD |
| **HomeZada** | Yes | Yes (Deluxe) | Yes | No | Yes | Free / $59-99/yr |
| **Centriq** | Reminders only | Yes | Yes (Manuals) | No | Yes + Recalls | Free / $18-100/yr |
| **Homer** | Yes | Yes | Yes | Contacts only | Yes | Free / Premium |
@@ -187,9 +187,9 @@ This document provides a comprehensive comparison of home management apps simila
## Competitive Positioning
### Where Casera Differentiates
### Where honeyDue Differentiates
Based on competitor analysis, Casera has unique advantages:
Based on competitor analysis, honeyDue has unique advantages:
1. **Contractor Management** - Most competitors lack this entirely
2. **Kanban Task View** - Unique visual organization (overdue, due soon, upcoming, completed)
@@ -197,9 +197,9 @@ Based on competitor analysis, Casera has unique advantages:
4. **Combined Approach** - Tasks + Documents + Contractors + Warranties in one app
5. **Recurring Task Intelligence** - Smart next-due-date calculation for recurring maintenance
### Competitor Gaps Casera Fills
### Competitor Gaps honeyDue Fills
| Gap | Competitors Missing It | Casera Solution |
| Gap | Competitors Missing It | honeyDue Solution |
|-----|------------------------|-----------------|
| Contractor database | All except Homer (contacts only) | Full contractor profiles with specialties |
| Kanban visualization | All | Visual task board with columns |
@@ -229,12 +229,12 @@ Based on market analysis:
### Competitive Price Points
| Competitor | Annual Price | Casera Comparison |
| Competitor | Annual Price | honeyDue Comparison |
|------------|--------------|-------------------|
| Tody | $6 | Casera offers much more (not just cleaning) |
| Sweepy | $15-17 | Casera offers full home management |
| Centriq | $18-100 | Casera has better task management |
| HomeZada | $59-149 | Casera adds contractors, better UX |
| Tody | $6 | honeyDue offers much more (not just cleaning) |
| Sweepy | $15-17 | honeyDue offers full home management |
| Centriq | $18-100 | honeyDue has better task management |
| HomeZada | $59-149 | honeyDue adds contractors, better UX |
---

View File

@@ -11,28 +11,28 @@
---
# Casera Launches to Help Homeowners Take Control of Home Maintenance
# honeyDue Launches to Help Homeowners Take Control of Home Maintenance
*New mobile app brings task management, document storage, and contractor organization to homeowners tired of forgotten maintenance and lost warranties*
---
**[CITY, STATE] — [DATE]** — Casera, a new home maintenance management app, launched today on iOS and Android, offering homeowners a simple yet powerful way to organize every aspect of home upkeep. The app combines recurring task scheduling, document storage, contractor management, and household collaboration in one intuitive platform.
**[CITY, STATE] — [DATE]** — honeyDue, a new home maintenance management app, launched today on iOS and Android, offering homeowners a simple yet powerful way to organize every aspect of home upkeep. The app combines recurring task scheduling, document storage, contractor management, and household collaboration in one intuitive platform.
"Homeownership comes with a hidden job: maintenance manager," said [Founder Name], founder of Casera. "Most people cobble together sticky notes, spreadsheet reminders, and hope. We built Casera because there had to be a better way."
"Homeownership comes with a hidden job: maintenance manager," said [Founder Name], founder of honeyDue. "Most people cobble together sticky notes, spreadsheet reminders, and hope. We built honeyDue because there had to be a better way."
### The Problem Casera Solves
### The Problem honeyDue Solves
The average single-family home requires maintenance on over 40 different systems and components, from HVAC filters to roof inspections. According to HomeAdvisor, homeowners spend an average of $3,192 annually on emergency repairs — many of which could be prevented with regular maintenance.
Yet most homeowners lack any organized system to track these tasks. Warranties get lost in email. Contractor contact information lives in scattered text threads. Important maintenance gets forgotten until something breaks.
### How Casera Works
### How honeyDue Works
Casera provides homeowners with four core capabilities:
honeyDue provides homeowners with four core capabilities:
**Smart Task Scheduling**
Users can create one-time or recurring maintenance tasks with customizable frequencies — from daily to annually. The app's kanban-style board shows tasks organized by urgency: overdue, due soon, upcoming, and completed. When a recurring task is completed, Casera automatically schedules the next occurrence.
Users can create one-time or recurring maintenance tasks with customizable frequencies — from daily to annually. The app's kanban-style board shows tasks organized by urgency: overdue, due soon, upcoming, and completed. When a recurring task is completed, honeyDue automatically schedules the next occurrence.
**Document Storage**
Warranties, manuals, receipts, and home documents can be uploaded and organized by room or category. When an appliance needs service, the warranty information is instantly accessible.
@@ -51,13 +51,13 @@ The home services market is projected to reach $1.2 trillion by 2026, driven by
### Pricing and Availability
Casera is available now as a free download on the [App Store](link) and [Google Play](link). The free tier includes core functionality for one property. Premium tiers offering multiple properties, unlimited document storage, and priority support are available starting at $[X]/month.
honeyDue is available now as a free download on the [App Store](link) and [Google Play](link). The free tier includes core functionality for one property. Premium tiers offering multiple properties, unlimited document storage, and priority support are available starting at $[X]/month.
### About Casera
### About honeyDue
Casera is a home maintenance management platform designed to help homeowners stay ahead of maintenance, protect their investment, and reduce the stress of property upkeep. Founded in [YEAR], Casera is headquartered in [CITY, STATE].
honeyDue is a home maintenance management platform designed to help homeowners stay ahead of maintenance, protect their investment, and reduce the stress of property upkeep. Founded in [YEAR], honeyDue is headquartered in [CITY, STATE].
For more information, visit [www.casera.app](https://www.casera.app) or follow @CaseraApp on [Twitter](link) and [Instagram](link).
For more information, visit [www.honeyDue.treytartt.com](https://www.honeyDue.treytartt.com) or follow @honeyDueApp on [Twitter](link) and [Instagram](link).
---
@@ -76,7 +76,7 @@ High-resolution logos, app screenshots, and founder headshots are available at:
| **Price** | Free with premium tiers |
| **Headquarters** | [CITY, STATE] |
| **Website** | [URL] |
| **Social** | @CaseraApp |
| **Social** | @honeyDueApp |
---
@@ -94,7 +94,7 @@ High-resolution logos, app screenshots, and founder headshots are available at:
Hi [Name],
Quick pitch: Casera is a new app that helps homeowners track recurring maintenance, store warranties, and organize contractor info — all in one place.
Quick pitch: honeyDue is a new app that helps homeowners track recurring maintenance, store warranties, and organize contractor info — all in one place.
**The hook:** The average homeowner spends $3,000+/year on emergency repairs. Most are preventable with basic maintenance. But there's been no good system to track it all — until now.
@@ -115,7 +115,7 @@ Best,
## Tweet-Length Announcement
```
📱 Casera just launched — the home maintenance app for homeowners who are tired of forgetting filter changes and losing warranties.
📱 honeyDue just launched — the home maintenance app for homeowners who are tired of forgetting filter changes and losing warranties.
Free on iOS + Android.
@@ -129,10 +129,10 @@ Your home runs better when you do. 🏠
*Choose the one that fits your story best:*
**Problem-focused:**
> "I built Casera after my AC died because I forgot a $150 tune-up. That $4,000 lesson convinced me there had to be a better way to manage home maintenance."
> "I built honeyDue after my AC died because I forgot a $150 tune-up. That $4,000 lesson convinced me there had to be a better way to manage home maintenance."
**Vision-focused:**
> "We believe your home deserves the same organizational tools as your work calendar. Casera brings that professionalism to home management."
> "We believe your home deserves the same organizational tools as your work calendar. honeyDue brings that professionalism to home management."
**Market-focused:**
> "Smart home technology has focused on automation and convenience. We're focused on something simpler: helping people remember to take care of their biggest investment."
@@ -168,21 +168,21 @@ Journalists can approach this story from multiple angles:
1. What's the most commonly forgotten home maintenance task?
2. How much can preventive maintenance actually save homeowners?
3. Why hasn't this problem been solved before?
4. How is Casera different from calendar reminders?
4. How is honeyDue different from calendar reminders?
5. What's the most surprising thing you've learned from users?
---
## Boilerplate
**About Casera (50 words)**
Casera is a home maintenance management app that helps homeowners track recurring tasks, store important documents, organize contractor information, and collaborate with household members. Available on iOS and Android, Casera brings clarity and organization to the often-overwhelming job of home upkeep.
**About honeyDue (50 words)**
honeyDue is a home maintenance management app that helps homeowners track recurring tasks, store important documents, organize contractor information, and collaborate with household members. Available on iOS and Android, honeyDue brings clarity and organization to the often-overwhelming job of home upkeep.
**About Casera (25 words)**
Casera is a home maintenance app that helps homeowners track tasks, store warranties, and organize contractor info — all in one place.
**About honeyDue (25 words)**
honeyDue is a home maintenance app that helps homeowners track tasks, store warranties, and organize contractor info — all in one place.
**About Casera (10 words)**
Casera: The organized way to manage home maintenance.
**About honeyDue (10 words)**
honeyDue: The organized way to manage home maintenance.
---
@@ -195,6 +195,6 @@ Casera: The organized way to manage home maintenance.
**General Information:**
Website: [URL]
Email: hello@casera.app
Twitter: @CaseraApp
Instagram: @CaseraApp
Email: hello@honeyDue.treytartt.com
Twitter: @honeyDueApp
Instagram: @honeyDueApp

View File

@@ -1,6 +1,6 @@
# Casera Social Media Kit
# honeyDue Social Media Kit
*Ready-to-use posts for launching and promoting Casera*
*Ready-to-use posts for launching and promoting honeyDue*
---
@@ -23,7 +23,7 @@
**Post 1 - Main Launch**
```
Introducing Casera 🏠
Introducing honeyDue 🏠
The home maintenance app that actually makes sense.
@@ -41,7 +41,7 @@ Download free → [link]
```
That "I should really check the HVAC filter" thought you have every 3 months?
Casera remembers it for you.
honeyDue remembers it for you.
Set it once. Get reminded forever.
@@ -56,7 +56,7 @@ POV: You need a plumber at 9pm
❌ Googling "plumber near me" again
❌ Hoping you saved that business card
✅ Opening Casera and finding Mike the Plumber instantly
✅ Opening honeyDue and finding Mike the Plumber instantly
Your contractor rolodex, always in your pocket.
```
@@ -73,7 +73,7 @@ Your contractor rolodex, always in your pocket.
These aren't one-time tasks. They come back.
Casera knows that. Set the frequency once, and we'll remind you every time it's due.
honeyDue knows that. Set the frequency once, and we'll remind you every time it's due.
Smart home maintenance → [link]
```
@@ -87,7 +87,7 @@ Finally, a way to actually SEE your home maintenance:
🟢 Upcoming — you're ahead of the game
✅ Completed — feel that satisfaction
Casera's kanban view. Simple. Visual. Effective.
honeyDue's kanban view. Simple. Visual. Effective.
```
**Document Storage**
@@ -97,7 +97,7 @@ Where's the warranty for your fridge?
A) Filing cabinet somewhere
B) Email from 3 years ago
C) No idea
D) Casera — because you uploaded it when you bought it
D) honeyDue — because you uploaded it when you bought it
Be option D.
```
@@ -109,7 +109,7 @@ Be option D.
Sound familiar?
Casera lets you share your home with family members. Everyone sees what needs doing. No more crossed wires.
honeyDue lets you share your home with family members. Everyone sees what needs doing. No more crossed wires.
(pun intended)
```
@@ -152,7 +152,7 @@ Reply with:
5/ Smoke detector batteries — Every 6 months. Life-saving.
Save this. Or better yet, add them all to Casera and never think about it again.
Save this. Or better yet, add them all to honeyDue and never think about it again.
```
---
@@ -163,7 +163,7 @@ Save this. Or better yet, add them all to Casera and never think about it again.
**Slide 1:**
```
MEET CASERA
MEET HONEYDUE
The home maintenance app you didn't know you needed
(but definitely do)
@@ -187,7 +187,7 @@ Sound familiar?
```
THE SOLUTION
Casera organizes everything:
honeyDue organizes everything:
📋 Tasks — recurring reminders that actually recur
📄 Documents — warranties, manuals, receipts
@@ -219,7 +219,7 @@ GET STARTED FREE
Your home works hard for you.
Let's return the favor.
Download Casera
Download honeyDue
Link in bio 🏠
```
@@ -232,7 +232,7 @@ Link in bio 🏠
Caption:
Sunday morning coffee hits different when you're not mentally running through everything you forgot to maintain.
Casera handles the remembering.
honeyDue handles the remembering.
You handle the relaxing.
#homeowner #homeownership #adulting #homemaintenance #organizedhome #homeownertips #firsttimehomebuyer
@@ -247,7 +247,7 @@ Most could be prevented with regular maintenance.
The unsexy truth: Boring scheduled tasks save exciting amounts of money.
Casera makes the boring part automatic.
honeyDue makes the boring part automatic.
#homeownerhacks #homemaintenance #savemoney #preventivemaintenance #homecare
```
@@ -261,7 +261,7 @@ Then the AC died in July because I forgot the spring tune-up.
$4,200 lesson learned.
Now I use Casera."
Now I use honeyDue."
— Every homeowner, eventually
@@ -281,7 +281,7 @@ Hook: "Nobody told me homes need THIS much maintenance"
Content:
- Quick cuts of common maintenance tasks
- Text overlays with frequency
- End with Casera app demo
- End with honeyDue app demo
Audio: Trending sound
```
@@ -303,7 +303,7 @@ Audio: Satisfying/success sound
```
Weekly recurring content:
- One maintenance tip per week
- Swipe up to add task to Casera
- Swipe up to add task to honeyDue
- Build habit + community
```
@@ -314,7 +314,7 @@ Weekly recurring content:
### Launch Announcement
```
I'm excited to share something I've been working on: Casera.
I'm excited to share something I've been working on: honeyDue.
It started with a simple frustration. As a homeowner, I was juggling:
• Sticky notes for maintenance reminders
@@ -324,7 +324,7 @@ It started with a simple frustration. As a homeowner, I was juggling:
There had to be a better way.
Casera is that better way.
honeyDue is that better way.
It's a home maintenance app that brings everything together:
→ Recurring task reminders (that actually recur)
@@ -361,7 +361,7 @@ It's not about automation. It's about organization.
The homes that last aren't the most automated. They're the most maintained.
That's why we built Casera — not another smart device, but a smart system for the maintenance that actually matters.
That's why we built honeyDue — not another smart device, but a smart system for the maintenance that actually matters.
Sometimes the most valuable technology is the simplest.
@@ -371,7 +371,7 @@ Sometimes the most valuable technology is the simplest.
### Feature Announcement Template
```
New in Casera: [FEATURE NAME]
New in honeyDue: [FEATURE NAME]
The problem: [One sentence describing pain point]
@@ -388,7 +388,7 @@ Update your app to try it today.
What feature should we build next?
#productupdate #casera #hometech
#productupdate #honeydue #hometech
```
---
@@ -397,7 +397,7 @@ What feature should we build next?
### Primary Hashtags (use on every post)
```
#Casera #HomeMaintenance #HomeOwner #HomeManagement
#honeyDue #HomeMaintenance #HomeOwner #HomeManagement
```
### Secondary Hashtags (rotate based on content)
@@ -435,12 +435,12 @@ Winter: #WinterHome #HeatingSystem
### Positive Feedback
```
Thanks so much! 🏠 We're glad Casera is helping you stay on top of things. Let us know if there's anything we can do better!
Thanks so much! 🏠 We're glad honeyDue is helping you stay on top of things. Let us know if there's anything we can do better!
```
### Feature Request
```
Love this idea! We're adding it to our list. Thanks for helping us make Casera better! 🙏
Love this idea! We're adding it to our list. Thanks for helping us make honeyDue better! 🙏
```
### Support Issue
@@ -450,5 +450,5 @@ Sorry you're running into trouble! DM us the details and we'll get it sorted out
### Competitor Mention
```
Great question! We focus on [specific differentiator]. Happy to share more about how Casera might fit your needs — DM us anytime!
Great question! We focus on [specific differentiator]. Happy to share more about how honeyDue might fit your needs — DM us anytime!
```

View File

@@ -1,8 +1,8 @@
openapi: 3.0.3
info:
title: Casera (MyCrib) API
title: honeyDue API
description: |
REST API for the Casera property management platform.
REST API for the honeyDue property management platform.
Consumed by iOS (SwiftUI) and Android (Compose) mobile clients via Kotlin Multiplatform.
## Authentication
@@ -24,10 +24,10 @@ info:
All errors follow a consistent JSON shape. Validation errors include a `details` map.
version: 2.0.0
contact:
name: Casera Team
name: honeyDue Team
servers:
- url: https://mycrib.treytartt.com/api
- url: https://honeyDue.treytartt.com/api
description: Production
- url: http://127.0.0.1:8000/api
description: Local development (iOS simulator)
@@ -813,7 +813,7 @@ paths:
post:
tags: [Residences]
operationId: generateSharePackage
summary: Generate a share package (.casera file metadata)
summary: Generate a share package (.honeydue file metadata)
security:
- tokenAuth: []
parameters:

2
go.mod
View File

@@ -1,4 +1,4 @@
module github.com/treytartt/casera-api
module github.com/treytartt/honeydue-api
go 1.24.0

View File

@@ -1,6 +1,6 @@
package dto
import "github.com/treytartt/casera-api/internal/middleware"
import "github.com/treytartt/honeydue-api/internal/middleware"
// PaginationParams holds pagination query parameters
type PaginationParams struct {

View File

@@ -6,7 +6,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/treytartt/casera-api/internal/admin/dto"
"github.com/treytartt/honeydue-api/internal/admin/dto"
)
func TestAdminSortBy_ValidColumn_Works(t *testing.T) {

View File

@@ -7,9 +7,9 @@ import (
"github.com/labstack/echo/v4"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/middleware"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/honeydue-api/internal/middleware"
"github.com/treytartt/honeydue-api/internal/models"
)
// AdminUserManagementHandler handles admin user management endpoints

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/honeydue-api/internal/models"
)
// AdminAppleSocialAuthHandler handles admin Apple social auth management endpoints

View File

@@ -5,10 +5,10 @@ import (
"github.com/labstack/echo/v4"
"github.com/treytartt/casera-api/internal/config"
"github.com/treytartt/casera-api/internal/middleware"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/casera-api/internal/repositories"
"github.com/treytartt/honeydue-api/internal/config"
"github.com/treytartt/honeydue-api/internal/middleware"
"github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/honeydue-api/internal/repositories"
)
// AdminAuthHandler handles admin authentication endpoints

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/honeydue-api/internal/models"
)
// AdminAuthTokenHandler handles admin auth token management endpoints

View File

@@ -8,8 +8,8 @@ import (
"github.com/shopspring/decimal"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/honeydue-api/internal/models"
)
// AdminCompletionHandler handles admin task completion management endpoints

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/honeydue-api/internal/models"
)
// AdminCompletionImageHandler handles admin task completion image management endpoints

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/honeydue-api/internal/models"
)
// AdminConfirmationCodeHandler handles admin confirmation code management endpoints

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/honeydue-api/internal/models"
)
// AdminContractorHandler handles admin contractor management endpoints

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/casera-api/internal/task/scopes"
"github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/honeydue-api/internal/task/scopes"
)
// AdminDashboardHandler handles admin dashboard endpoints

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/honeydue-api/internal/models"
)
// AdminDeviceHandler handles admin device management endpoints

View File

@@ -9,8 +9,8 @@ import (
"github.com/shopspring/decimal"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/honeydue-api/internal/models"
)
// AdminDocumentHandler handles admin document management endpoints

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/honeydue-api/internal/models"
)
// AdminDocumentImageHandler handles admin document image management endpoints

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/honeydue-api/internal/models"
)
// AdminFeatureBenefitHandler handles admin feature benefit management endpoints

View File

@@ -7,7 +7,7 @@ import (
"github.com/labstack/echo/v4"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/models"
)
// AdminLimitationsHandler handles subscription limitations management

View File

@@ -9,10 +9,10 @@ import (
"github.com/rs/zerolog/log"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/casera-api/internal/notifications"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/honeydue-api/internal/notifications"
"github.com/treytartt/honeydue-api/internal/services"
)
// AdminLookupHandler handles admin lookup table management endpoints

View File

@@ -10,10 +10,10 @@ import (
"github.com/labstack/echo/v4"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/casera-api/internal/push"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/honeydue-api/internal/push"
"github.com/treytartt/honeydue-api/internal/services"
)
// AdminNotificationHandler handles admin notification management endpoints
@@ -363,7 +363,7 @@ func (h *AdminNotificationHandler) SendTestEmail(c echo.Context) error {
<h2 style="color: #333;">` + escapedSubject + `</h2>
<div style="color: #666; line-height: 1.6;">` + escapedBody + `</div>
<hr style="border: none; border-top: 1px solid #eee; margin: 30px 0;">
<p style="color: #999; font-size: 12px;">This is a test email sent from Casera Admin Panel.</p>
<p style="color: #999; font-size: 12px;">This is a test email sent from honeyDue Admin Panel.</p>
</body>
</html>`

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/honeydue-api/internal/models"
)
// AdminNotificationPrefsHandler handles notification preference management

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/honeydue-api/internal/services"
)
// AdminOnboardingHandler handles admin onboarding email operations

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/honeydue-api/internal/models"
)
// AdminPasswordResetCodeHandler handles admin password reset code management endpoints

View File

@@ -8,8 +8,8 @@ import (
"github.com/labstack/echo/v4"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/honeydue-api/internal/models"
)
// AdminPromotionHandler handles admin promotion management endpoints

View File

@@ -9,8 +9,8 @@ import (
"github.com/shopspring/decimal"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/honeydue-api/internal/models"
)
// AdminResidenceHandler handles admin residence management endpoints

View File

@@ -12,8 +12,8 @@ import (
"github.com/rs/zerolog/log"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/honeydue-api/internal/services"
)
// AdminSettingsHandler handles system settings management

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/honeydue-api/internal/models"
)
// AdminShareCodeHandler handles admin share code management endpoints

View File

@@ -8,8 +8,8 @@ import (
"github.com/labstack/echo/v4"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/honeydue-api/internal/models"
)
// AdminSubscriptionHandler handles admin subscription management endpoints

View File

@@ -9,8 +9,8 @@ import (
"github.com/shopspring/decimal"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/honeydue-api/internal/models"
)
// AdminTaskHandler handles admin task management endpoints

View File

@@ -10,8 +10,8 @@ import (
"github.com/rs/zerolog/log"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/honeydue-api/internal/services"
)
// AdminTaskTemplateHandler handles admin task template management endpoints

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/honeydue-api/internal/models"
)
// AdminUserHandler handles admin user management endpoints

View File

@@ -8,8 +8,8 @@ import (
"github.com/labstack/echo/v4"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/honeydue-api/internal/models"
)
// AdminUserProfileHandler handles admin user profile management endpoints

View File

@@ -9,13 +9,13 @@ import (
"github.com/labstack/echo/v4"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/handlers"
"github.com/treytartt/casera-api/internal/config"
"github.com/treytartt/casera-api/internal/middleware"
"github.com/treytartt/casera-api/internal/monitoring"
"github.com/treytartt/casera-api/internal/push"
"github.com/treytartt/casera-api/internal/repositories"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/honeydue-api/internal/admin/handlers"
"github.com/treytartt/honeydue-api/internal/config"
"github.com/treytartt/honeydue-api/internal/middleware"
"github.com/treytartt/honeydue-api/internal/monitoring"
"github.com/treytartt/honeydue-api/internal/push"
"github.com/treytartt/honeydue-api/internal/repositories"
"github.com/treytartt/honeydue-api/internal/services"
)
// Dependencies holds optional services for admin routes

View File

@@ -9,9 +9,9 @@ import (
"github.com/labstack/echo/v4"
"github.com/rs/zerolog/log"
"github.com/treytartt/casera-api/internal/dto/responses"
"github.com/treytartt/casera-api/internal/i18n"
customvalidator "github.com/treytartt/casera-api/internal/validator"
"github.com/treytartt/honeydue-api/internal/dto/responses"
"github.com/treytartt/honeydue-api/internal/i18n"
customvalidator "github.com/treytartt/honeydue-api/internal/validator"
)
// HTTPErrorHandler handles all errors returned from handlers in a consistent way.

View File

@@ -36,7 +36,7 @@ type ServerConfig struct {
CorsAllowedOrigins []string // Comma-separated origins for CORS (production only; debug uses wildcard)
Timezone string
StaticDir string // Directory for static landing page files
BaseURL string // Public base URL for email tracking links (e.g., https://casera.app)
BaseURL string // Public base URL for email tracking links (e.g., https://honeyDue.treytartt.com)
}
type DatabaseConfig struct {
@@ -80,7 +80,7 @@ type PushConfig struct {
}
type AppleAuthConfig struct {
ClientID string // Bundle ID (e.g., com.tt.casera.CaseraDev)
ClientID string // Bundle ID (e.g., com.tt.honeyDue.honeyDueDev)
TeamID string // Apple Developer Team ID
}
@@ -95,14 +95,14 @@ type AppleIAPConfig struct {
KeyPath string // Path to .p8 private key file
KeyID string // Key ID from App Store Connect
IssuerID string // Issuer ID from App Store Connect
BundleID string // App bundle ID (e.g., com.tt.casera)
BundleID string // App bundle ID (e.g., com.tt.honeyDue)
Sandbox bool // Use sandbox environment for testing
}
// GoogleIAPConfig holds Google Play Developer API configuration
type GoogleIAPConfig struct {
ServiceAccountPath string // Path to service account JSON file
PackageName string // Android package name (e.g., com.tt.casera)
PackageName string // Android package name (e.g., com.tt.honeyDue)
}
// StripeConfig holds Stripe payment configuration
@@ -293,13 +293,13 @@ func setDefaults() {
viper.SetDefault("ALLOWED_HOSTS", "localhost,127.0.0.1")
viper.SetDefault("TIMEZONE", "UTC")
viper.SetDefault("STATIC_DIR", "/app/static")
viper.SetDefault("BASE_URL", "https://casera.app")
viper.SetDefault("BASE_URL", "https://honeyDue.treytartt.com")
// Database defaults
viper.SetDefault("DB_HOST", "localhost")
viper.SetDefault("DB_PORT", 5432)
viper.SetDefault("POSTGRES_USER", "postgres")
viper.SetDefault("POSTGRES_DB", "casera")
viper.SetDefault("POSTGRES_DB", "honeydue")
viper.SetDefault("DB_SSLMODE", "disable")
viper.SetDefault("DB_MAX_OPEN_CONNS", 25)
viper.SetDefault("DB_MAX_IDLE_CONNS", 10)
@@ -315,10 +315,10 @@ func setDefaults() {
viper.SetDefault("EMAIL_USE_TLS", true)
viper.SetDefault("EMAIL_HOST_USER", "")
viper.SetDefault("EMAIL_HOST_PASSWORD", "")
viper.SetDefault("DEFAULT_FROM_EMAIL", "Casera <noreply@casera.com>")
viper.SetDefault("DEFAULT_FROM_EMAIL", "honeyDue <noreply@honeyDue.treytartt.com>")
// Push notification defaults
viper.SetDefault("APNS_TOPIC", "com.example.casera")
viper.SetDefault("APNS_TOPIC", "com.tt.honeyDue")
viper.SetDefault("APNS_USE_SANDBOX", true)
viper.SetDefault("APNS_PRODUCTION", false)

View File

@@ -9,8 +9,8 @@ import (
"gorm.io/gorm"
"gorm.io/gorm/logger"
"github.com/treytartt/casera-api/internal/config"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/config"
"github.com/treytartt/honeydue-api/internal/models"
)
// zerologGormWriter adapts zerolog for GORM's logger interface
@@ -422,7 +422,7 @@ func migrateGoAdmin() error {
(2, 1, 3, 'Permissions', 'fa-ban', '/info/goadmin_permissions', ''),
(2, 1, 4, 'Menu', 'fa-bars', '/menu', ''),
(2, 1, 5, 'Operation Log', 'fa-history', '/info/goadmin_operation_log', ''),
(0, 1, 3, 'MyCrib', 'fa-home', '', ''),
(0, 1, 3, 'HoneyDue', 'fa-home', '', ''),
(8, 1, 1, 'Users', 'fa-user', '/info/users', ''),
(8, 1, 2, 'Residences', 'fa-building', '/info/residences', ''),
(8, 1, 3, 'Tasks', 'fa-tasks', '/info/tasks', ''),
@@ -444,14 +444,14 @@ func migrateGoAdmin() error {
// Seed default Next.js admin user only on first run.
// Password is NOT reset on subsequent migrations to preserve operator changes.
var adminCount int64
db.Raw(`SELECT COUNT(*) FROM admin_users WHERE email = 'admin@mycrib.com'`).Scan(&adminCount)
db.Raw(`SELECT COUNT(*) FROM admin_users WHERE email = 'admin@honeydue.com'`).Scan(&adminCount)
if adminCount == 0 {
log.Info().Msg("Seeding default admin user for Next.js admin panel...")
db.Exec(`
INSERT INTO admin_users (email, password, first_name, last_name, role, is_active, created_at, updated_at)
VALUES ('admin@mycrib.com', '$2a$10$t5hGjdXQLxr9Z0193qx.Tef6hd1vYI3JvrfX/piKx2qS9UvQ41I9O', 'Admin', 'User', 'super_admin', true, NOW(), NOW())
VALUES ('admin@honeydue.com', '$2a$10$t5hGjdXQLxr9Z0193qx.Tef6hd1vYI3JvrfX/piKx2qS9UvQ41I9O', 'Admin', 'User', 'super_admin', true, NOW(), NOW())
`)
log.Info().Msg("Default admin user created: admin@mycrib.com")
log.Info().Msg("Default admin user created: admin@honeydue.com")
}
return nil

View File

@@ -5,7 +5,7 @@ import (
"github.com/shopspring/decimal"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/models"
)
// CreateDocumentRequest represents the request to create a document

View File

@@ -3,7 +3,7 @@ package responses
import (
"time"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/models"
)
// UserResponse represents a user in API responses

View File

@@ -3,7 +3,7 @@ package responses
import (
"time"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/models"
)
// ContractorSpecialtyResponse represents a contractor specialty

View File

@@ -6,7 +6,7 @@ import (
"github.com/shopspring/decimal"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/models"
)
// DocumentUserResponse represents a user in document context

View File

@@ -5,7 +5,7 @@ import (
"github.com/shopspring/decimal"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/models"
)
// ResidenceTypeResponse represents a residence type in the API response
@@ -106,7 +106,7 @@ type GenerateShareCodeResponse struct {
}
// SharePackageResponse represents the response for generating a share package
// This contains the share code plus metadata for the .casera file
// This contains the share code plus metadata for the .honeydue file
type SharePackageResponse struct {
ShareCode string `json:"share_code"`
ResidenceName string `json:"residence_name"`

View File

@@ -6,9 +6,9 @@ import (
"github.com/shopspring/decimal"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/casera-api/internal/task/categorization"
"github.com/treytartt/casera-api/internal/task/predicates"
"github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/honeydue-api/internal/task/categorization"
"github.com/treytartt/honeydue-api/internal/task/predicates"
)
// TaskCategoryResponse represents a task category

View File

@@ -4,7 +4,7 @@ import (
"strings"
"time"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/honeydue-api/internal/models"
)
// TaskTemplateResponse represents a task template in the API response

View File

@@ -7,12 +7,12 @@ import (
"github.com/labstack/echo/v4"
"github.com/rs/zerolog/log"
"github.com/treytartt/casera-api/internal/apperrors"
"github.com/treytartt/casera-api/internal/dto/requests"
"github.com/treytartt/casera-api/internal/dto/responses"
"github.com/treytartt/casera-api/internal/middleware"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/casera-api/internal/validator"
"github.com/treytartt/honeydue-api/internal/apperrors"
"github.com/treytartt/honeydue-api/internal/dto/requests"
"github.com/treytartt/honeydue-api/internal/dto/responses"
"github.com/treytartt/honeydue-api/internal/middleware"
"github.com/treytartt/honeydue-api/internal/services"
"github.com/treytartt/honeydue-api/internal/validator"
)
// AuthHandler handles authentication endpoints

View File

@@ -10,11 +10,11 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/treytartt/casera-api/internal/config"
"github.com/treytartt/casera-api/internal/dto/requests"
"github.com/treytartt/casera-api/internal/repositories"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/casera-api/internal/testutil"
"github.com/treytartt/honeydue-api/internal/config"
"github.com/treytartt/honeydue-api/internal/dto/requests"
"github.com/treytartt/honeydue-api/internal/repositories"
"github.com/treytartt/honeydue-api/internal/services"
"github.com/treytartt/honeydue-api/internal/testutil"
)
func setupAuthHandler(t *testing.T) (*AuthHandler, *echo.Echo, *repositories.UserRepository) {

View File

@@ -6,10 +6,10 @@ import (
"github.com/labstack/echo/v4"
"github.com/treytartt/casera-api/internal/apperrors"
"github.com/treytartt/casera-api/internal/dto/requests"
"github.com/treytartt/casera-api/internal/middleware"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/honeydue-api/internal/apperrors"
"github.com/treytartt/honeydue-api/internal/dto/requests"
"github.com/treytartt/honeydue-api/internal/middleware"
"github.com/treytartt/honeydue-api/internal/services"
)
// ContractorHandler handles contractor-related HTTP requests

View File

@@ -10,10 +10,10 @@ import (
"github.com/stretchr/testify/require"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/dto/requests"
"github.com/treytartt/casera-api/internal/repositories"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/casera-api/internal/testutil"
"github.com/treytartt/honeydue-api/internal/dto/requests"
"github.com/treytartt/honeydue-api/internal/repositories"
"github.com/treytartt/honeydue-api/internal/services"
"github.com/treytartt/honeydue-api/internal/testutil"
)
func setupContractorHandler(t *testing.T) (*ContractorHandler, *echo.Echo, *gorm.DB) {

View File

@@ -10,12 +10,12 @@ import (
"github.com/labstack/echo/v4"
"github.com/shopspring/decimal"
"github.com/treytartt/casera-api/internal/apperrors"
"github.com/treytartt/casera-api/internal/dto/requests"
"github.com/treytartt/casera-api/internal/middleware"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/casera-api/internal/repositories"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/honeydue-api/internal/apperrors"
"github.com/treytartt/honeydue-api/internal/dto/requests"
"github.com/treytartt/honeydue-api/internal/middleware"
"github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/honeydue-api/internal/repositories"
"github.com/treytartt/honeydue-api/internal/services"
)
// DocumentHandler handles document-related HTTP requests

View File

@@ -10,10 +10,10 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/casera-api/internal/repositories"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/casera-api/internal/testutil"
"github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/honeydue-api/internal/repositories"
"github.com/treytartt/honeydue-api/internal/services"
"github.com/treytartt/honeydue-api/internal/testutil"
"gorm.io/gorm"
)

View File

@@ -6,10 +6,10 @@ import (
"github.com/labstack/echo/v4"
"github.com/treytartt/casera-api/internal/apperrors"
"github.com/treytartt/casera-api/internal/middleware"
"github.com/treytartt/casera-api/internal/repositories"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/honeydue-api/internal/apperrors"
"github.com/treytartt/honeydue-api/internal/middleware"
"github.com/treytartt/honeydue-api/internal/repositories"
"github.com/treytartt/honeydue-api/internal/services"
)
// MediaHandler handles authenticated media serving

View File

@@ -6,8 +6,8 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/treytartt/casera-api/internal/config"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/honeydue-api/internal/config"
"github.com/treytartt/honeydue-api/internal/services"
)
// newTestStorageService creates a StorageService with a known upload directory for testing.

View File

@@ -4,10 +4,10 @@ import (
"net/http"
"testing"
"github.com/treytartt/casera-api/internal/config"
"github.com/treytartt/casera-api/internal/repositories"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/casera-api/internal/testutil"
"github.com/treytartt/honeydue-api/internal/config"
"github.com/treytartt/honeydue-api/internal/repositories"
"github.com/treytartt/honeydue-api/internal/services"
"github.com/treytartt/honeydue-api/internal/testutil"
)
// TestTaskHandler_NoAuth_Returns401 verifies that task handler endpoints return

View File

@@ -6,9 +6,9 @@ import (
"github.com/labstack/echo/v4"
"github.com/treytartt/casera-api/internal/apperrors"
"github.com/treytartt/casera-api/internal/middleware"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/honeydue-api/internal/apperrors"
"github.com/treytartt/honeydue-api/internal/middleware"
"github.com/treytartt/honeydue-api/internal/services"
)
// NotificationHandler handles notification-related HTTP requests

View File

@@ -11,10 +11,10 @@ import (
"github.com/stretchr/testify/require"
"gorm.io/gorm"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/casera-api/internal/repositories"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/casera-api/internal/testutil"
"github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/honeydue-api/internal/repositories"
"github.com/treytartt/honeydue-api/internal/services"
"github.com/treytartt/honeydue-api/internal/testutil"
)
func setupNotificationHandler(t *testing.T) (*NotificationHandler, *echo.Echo, *gorm.DB) {

View File

@@ -6,12 +6,12 @@ import (
"github.com/labstack/echo/v4"
"github.com/treytartt/casera-api/internal/apperrors"
"github.com/treytartt/casera-api/internal/dto/requests"
"github.com/treytartt/casera-api/internal/i18n"
"github.com/treytartt/casera-api/internal/middleware"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/casera-api/internal/validator"
"github.com/treytartt/honeydue-api/internal/apperrors"
"github.com/treytartt/honeydue-api/internal/dto/requests"
"github.com/treytartt/honeydue-api/internal/i18n"
"github.com/treytartt/honeydue-api/internal/middleware"
"github.com/treytartt/honeydue-api/internal/services"
"github.com/treytartt/honeydue-api/internal/validator"
)
// ResidenceHandler handles residence-related HTTP requests
@@ -221,7 +221,7 @@ func (h *ResidenceHandler) GenerateShareCode(c echo.Context) error {
}
// GenerateSharePackage handles POST /api/residences/:id/generate-share-package/
// Returns a share code with metadata for creating a .casera package file
// Returns a share code with metadata for creating a .honeydue package file
func (h *ResidenceHandler) GenerateSharePackage(c echo.Context) error {
user, err := middleware.MustGetAuthUser(c)
if err != nil {

View File

@@ -11,11 +11,11 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/treytartt/casera-api/internal/config"
"github.com/treytartt/casera-api/internal/dto/requests"
"github.com/treytartt/casera-api/internal/repositories"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/casera-api/internal/testutil"
"github.com/treytartt/honeydue-api/internal/config"
"github.com/treytartt/honeydue-api/internal/dto/requests"
"github.com/treytartt/honeydue-api/internal/repositories"
"github.com/treytartt/honeydue-api/internal/services"
"github.com/treytartt/honeydue-api/internal/testutil"
"gorm.io/gorm"
)

View File

@@ -8,9 +8,9 @@ import (
"github.com/redis/go-redis/v9"
"github.com/rs/zerolog/log"
"github.com/treytartt/casera-api/internal/dto/responses"
"github.com/treytartt/casera-api/internal/i18n"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/honeydue-api/internal/dto/responses"
"github.com/treytartt/honeydue-api/internal/i18n"
"github.com/treytartt/honeydue-api/internal/services"
)
// SeededDataResponse represents the unified seeded data response

View File

@@ -5,9 +5,9 @@ import (
"github.com/labstack/echo/v4"
"github.com/treytartt/casera-api/internal/apperrors"
"github.com/treytartt/casera-api/internal/middleware"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/honeydue-api/internal/apperrors"
"github.com/treytartt/honeydue-api/internal/middleware"
"github.com/treytartt/honeydue-api/internal/services"
)
// SubscriptionHandler handles subscription-related HTTP requests

View File

@@ -17,10 +17,10 @@ import (
"github.com/labstack/echo/v4"
"github.com/rs/zerolog/log"
"github.com/treytartt/casera-api/internal/config"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/casera-api/internal/repositories"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/honeydue-api/internal/config"
"github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/honeydue-api/internal/repositories"
"github.com/treytartt/honeydue-api/internal/services"
)
// SubscriptionWebhookHandler handles subscription webhook callbacks

View File

@@ -9,10 +9,10 @@ import (
"github.com/labstack/echo/v4"
"github.com/shopspring/decimal"
"github.com/treytartt/casera-api/internal/apperrors"
"github.com/treytartt/casera-api/internal/dto/requests"
"github.com/treytartt/casera-api/internal/middleware"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/honeydue-api/internal/apperrors"
"github.com/treytartt/honeydue-api/internal/dto/requests"
"github.com/treytartt/honeydue-api/internal/middleware"
"github.com/treytartt/honeydue-api/internal/services"
)
// TaskHandler handles task-related HTTP requests

View File

@@ -12,11 +12,11 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/treytartt/casera-api/internal/dto/requests"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/casera-api/internal/repositories"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/casera-api/internal/testutil"
"github.com/treytartt/honeydue-api/internal/dto/requests"
"github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/honeydue-api/internal/repositories"
"github.com/treytartt/honeydue-api/internal/services"
"github.com/treytartt/honeydue-api/internal/testutil"
"gorm.io/gorm"
)

View File

@@ -6,8 +6,8 @@ import (
"github.com/labstack/echo/v4"
"github.com/treytartt/casera-api/internal/apperrors"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/honeydue-api/internal/apperrors"
"github.com/treytartt/honeydue-api/internal/services"
)
// TaskTemplateHandler handles task template endpoints

View File

@@ -7,7 +7,7 @@ import (
"github.com/labstack/echo/v4"
"github.com/rs/zerolog/log"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/honeydue-api/internal/services"
)
// TrackingHandler handles email tracking endpoints

View File

@@ -6,10 +6,10 @@ import (
"github.com/labstack/echo/v4"
"github.com/rs/zerolog/log"
"github.com/treytartt/casera-api/internal/apperrors"
"github.com/treytartt/casera-api/internal/middleware"
"github.com/treytartt/casera-api/internal/models"
"github.com/treytartt/casera-api/internal/services"
"github.com/treytartt/honeydue-api/internal/apperrors"
"github.com/treytartt/honeydue-api/internal/middleware"
"github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/honeydue-api/internal/services"
)
// UploadHandler handles file upload endpoints

Some files were not shown because too many files have changed in this diff Show More