Welcome to the Skylite UX development guide! This document will help you set up your development environment and understand the project structure.
Before you begin, ensure you have the following installed:
dev
.Dev Containers: Clone Repository in Container Volume
. Select your repository and branch.
http://localhost:3000
with:# npm
npm run dev
Skylite-UX/ ├── .devcontainer/ # Dev container configuration │ └── integrations/ # Compose files to deploy integration containers ├── app/ # Main application code │ ├── assets/ # Static assets (CSS, images, etc.) │ ├── components/ # Vue components │ │ ├── calendar/ # Calendar-related components │ │ ├── global/ # Global/shared components │ │ ├── settings/ # Settings page components │ │ ├── shopping/ # Shopping list components │ │ └── todos/ # Todo list components │ ├── composables/ # Vue composables │ ├── integrations/ # External integration files │ ├── lib/ # Library configurations │ ├── pages/ # Application pages (auto-routed) │ ├── plugins/ # Nuxt plugins │ ├── types/ # TypeScript type definitions │ ├── utils/ # Utility functions │ ├── app.config.ts # App configuration │ └── app.vue # Root Vue component ├── prisma/ # Database schema and migrations │ ├── migrations/ # Database migration files │ └── schema.prisma # Prisma schema definition ├── public/ # Public static assets ├── server/ # Server-side code │ ├── api/ # API endpoints │ │ ├── integrations/ # Integration API routes │ │ ├── shopping-lists/ # Shopping list API routes │ │ ├── todos/ # Todo API routes │ │ └── users/ # User API routes │ ├── integrations # Integration service files │ └── plugins/ # Server plugins ├── eslint.config.mjs # ESLint configuration ├── LICENSE.md # Project license ├── nuxt.config.ts # Nuxt configuration ├── package.json # Dependencies and scripts ├── README.md # Project documentation └── tsconfig.json # TypeScript configuration
git checkout dev
git pull origin dev
git checkout -b feature/your-feature-name
npm run test
npm run lint
npm run type-check
git add .
git commit -m "feat: add new feature description"
git push origin feature/your-feature-name
# Create Pull Request to dev branch
All linting rules are defined in eslint.config.mjs.
The project uses a camelCase naming convention for all files with some exceptions such as API routes and docker compose files where kebab-case is the convention.
<script setup lang="ts">
for all componentsref
, computed
, etc.)defineProps
and defineEmits
with TypeScript genericsany
type - use proper typing or unknown
npm run lint
before committingnpm run type-check
to catch TypeScript errorsfeat:
, fix:
, docs:
)
Skylite-UX is designed to integrate with various external and self-hosted services. This section covers how to set up and configure integrations for development.
We use the docker outside of docker dev container feature for easier development.
Skylite-UX/.devcontainer/integrations/
Skylite-UX/.devcontainer/integrations/
Skylite-UX/app/integrations/
Skylite-UX/server/api/integrations
Skylite-UX/server/integrations
Skylite-UX/app/integrations/integrationConfig.ts
so it will be picked up when Skylite starts# .devcontainer/integrations/service/service-docker-compose.yml
version: '3.8'
services:
# Comments about the integration
# How to create API key, base URL, etc.
# Base URL: http://mealie:9000
mealie:
image: ghcr.io/mealie-recipes/mealie:latest
container_name: mealie
restart: always
ports:
- "9925:9000" # External port mapping
deploy:
resources:
limits:
memory: 1000M # Memory limit
volumes:
- mealie-data:/app/data/
environment:
# Set Backend ENV Variables Here
ALLOW_SIGNUP: false
PUID: 1000
PGID: 1000
TZ: America/Anchorage
# Make sure the service runs on the same network as the dev container
networks:
skylite-ux_devcontainer_default:
volumes:
mealie-data:
# Make sure the service runs on the same network as the dev container
networks:
skylite-ux_devcontainer_default:
external: true
{
type: "shopping", // calendar,todo,shopping,meal
service: "tandoor", // the name of the service you are integrating
settingsFields: [
// fields used for setting up the integration
{
key: 'apiKey',
label: 'API Key',
type: 'password' as const,
placeholder: 'Scope needs to be "read write"',
required: true,
description: 'Your Tandoor API key for authentication'
},
{
key: 'baseUrl',
label: 'Base URL',
type: 'url' as const,
placeholder: 'http://your-tandoor-instance:port',
required: true,
description: 'The base URL of your Tandoor instance'
}
],
capabilities: ["add_items", "edit_items"], // declare your capabilities
icon: "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/tandoor-recipes.svg", // icon URL from selfh.st/icons
files: [
// list your file paths for your integration
"/integrations/tandoor/tandoorShoppingLists.ts",
"/server/api/integrations/tandoor/[...path].ts",
"/server/integrations/tandoor/"
],
dialogFields: [
// fields used for dialog
{
key: 'name',
label: 'Item Name',
type: 'text' as const,
placeholder: 'Milk, Bread, Apples, etc.',
required: true,
canEdit: true,
},
{
key: 'quantity',
label: 'Quantity',
type: 'number' as const,
min: 0,
canEdit: true,
},
{
key: 'unit',
label: 'Unit',
type: 'text' as const,
placeholder: 'Disabled for Tandoor',
canEdit: false,
},
],
// time in minutes to sync the integration
syncInterval: 5,
},
# Ensure service is on the same Docker network as dev container
# Ensure correct base URL
# Check token expiration
# Check network connectivity
# Verify API endpoints
# Review error logs
# Test with minimal data set
Skylite-UX uses @nuxt/test-utils for comprehensive testing support, including both unit and end-to-end tests.
npm run build:dev
npm run build
npm run preview
# Build Docker image
docker build -t skylite-ux .
# Run Docker container
docker run -p 3000:3000 skylite-ux
# Find process using port 3000
lsof -i :3000
# Kill the process
kill -9 <PID>
# Clear npm cache
npm cache clean --force
# Remove node_modules and reinstall
rm -rf node_modules package-lock.json
npm install
# Clean up Docker containers
docker system prune -a
# Rebuild without cache
docker-compose build --no-cache
# Check TypeScript configuration
npm run type-check
# Regenerate TypeScript types
npm run types:generate