Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
2143b09
chore(skills): add create-an-edge-app skill with Edge App setup guide…
nicomiguelino Jan 27, 2026
180917b
chore: ignore `.claude/` when running Super-Linter
nicomiguelino Jan 27, 2026
fbd6a31
chore: update .claude/skills/create-an-edge-app/SKILL.md
nicomiguelino Jan 27, 2026
070c405
chore(skills): improve HTML organization guidance in create-an-edge-a…
nicomiguelino Jan 27, 2026
a397ecc
feat: add birthday-greeting edge app with responsive design
nicomiguelino Jan 28, 2026
56b1616
chore(birthday-greeting): add a language identifier for fenced code b…
nicomiguelino Jan 28, 2026
7159fdd
docs(skill): remove code blocks and reference live examples in create…
nicomiguelino Jan 28, 2026
7adc7dd
chore(skills): resolve Markdown linting errors
nicomiguelino Jan 28, 2026
085d082
chore(skills): fix grammatical errors in create-an-edge-app skill
nicomiguelino Jan 28, 2026
b3c732a
added app icon
salmanfarisvp Jan 28, 2026
10447f0
Merge branch 'master' into create-claude-skills
nicomiguelino Jan 28, 2026
bc2054d
docs: add Figma design consultation to Edge App creation workflow
nicomiguelino Jan 28, 2026
120533b
chore(skills): replace bare URLS with links
nicomiguelino Jan 28, 2026
edc897b
Merge branch 'create-claude-skills' into new-edge-app/birthday-app
nicomiguelino Jan 28, 2026
faba107
Merge branch 'master' into new-edge-app/birthday-app
nicomiguelino Jan 28, 2026
36f4ad1
fix(birthday-greeting): prevent race condition in image loading
nicomiguelino Jan 28, 2026
6326ebe
chore(birthday-greeting): add accessibility attributes to the logo SVG
nicomiguelino Jan 28, 2026
8653405
chore(birthday-greeting): assign value to the empty `alt` attribute i…
nicomiguelino Jan 28, 2026
a1f8f78
fix(birthday-greeting): update regex checks for Base64 values so that…
nicomiguelino Jan 28, 2026
abcc2d1
chore(birthday-greeting): address formatting errors
nicomiguelino Jan 28, 2026
4c81b67
test(birthday-greeting): add comprehensive tests for image validation
nicomiguelino Jan 28, 2026
2ba3bc5
refactor(birthday-greeting): make image required and prevent duplicat…
nicomiguelino Jan 28, 2026
f142d0c
refactor(birthday-greeting): extract SVG logo to separate TypeScript …
nicomiguelino Jan 29, 2026
02872ab
style(birthday-greeting): improve responsive design with rem units an…
nicomiguelino Jan 29, 2026
6df6769
style(birthday-greeting): lay groundwork for portrait display support
nicomiguelino Jan 29, 2026
f3c2077
Merge branch 'master' into new-edge-app/birthday-app
nicomiguelino Jan 29, 2026
69be24f
Merge branch 'master' into new-edge-app/birthday-app
nicomiguelino Jan 30, 2026
381ff69
Merge branch 'master' into new-edge-app/birthday-app
nicomiguelino Jan 31, 2026
02f5fc9
Merge branch 'master' into new-edge-app/birthday-app
nicomiguelino Feb 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions edge-apps/birthday-greeting/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# Birthday Greeting

A vibrant and responsive birthday greeting app for digital signage displays. This app displays personalized birthday messages with the person's name, role, and optional photo.

## Features

- Personalized birthday greeting with name and role
- Optional photo support with Base64 image encoding
- Fallback placeholder when no photo is provided

## Deployment

Create and deploy the Edge App:

```bash
bun install
screenly edge-app create --name birthday-greeting --in-place
bun run deploy
```

## Configuration

The app accepts the following settings via `screenly.yml`:

- `name` (required) - The name of the person having a birthday (e.g., "Amy Smith")
- `role` (required) - The role or position of the person (e.g., "Sales Manager")
- `image` (optional) - A Base64-encoded image of the person. If not provided or if the image fails to load, a placeholder will be displayed

### Example Configuration

```yaml
name: 'Amy Smith'
role: 'Sales Manager'
image: 'data:image/jpeg;base64,/9j/4AAQSkZJRg...'
```

## Image Format

The `image` setting accepts Base64-encoded images in the following formats:

1. **Full data URI** (recommended):

```text
data:image/jpeg;base64,/9j/4AAQSkZJRg...
```

2. **Pure Base64 string** (will be automatically formatted):
```text
/9j/4AAQSkZJRg...
```

## Development

```bash
bun install # Install dependencies
bun run build # Build the app
bun run dev # Start development server
bun run lint # Lint and fix code
```

## Testing

The app includes comprehensive tests for settings retrieval and image handling.

```bash
bun run test # Run all tests
```
1,124 changes: 1,124 additions & 0 deletions edge-apps/birthday-greeting/bun.lock

Large diffs are not rendered by default.

41 changes: 41 additions & 0 deletions edge-apps/birthday-greeting/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Birthday Greeting - Screenly Edge App</title>
<script src="screenly.js?version=1"></script>
<link rel="stylesheet" href="dist/css/style.css" />
</head>
<body>
<div class="container max-w-full">
<main class="main-content">
<div class="left-column h-full">
<div id="screenly-logo"></div>
<h1 class="greeting-title">
Happy<br />Birthday,<br /><span id="person-name"></span>!
</h1>
<p class="greeting-message">Wishing you all the best!</p>
</div>

<div class="right-column h-full">
<div class="photo-frame">
<div class="photo-container">
<div id="photo-placeholder" class="photo-placeholder"></div>
<img
id="person-photo"
class="person-photo hidden"
alt="Birthday photo"
/>
</div>
</div>
<div class="role-badge">
<p class="role-label">Our very own</p>
<p id="person-role" class="role-title"></p>
</div>
</div>
</main>
</div>
<script src="dist/js/main.js"></script>
</body>
</html>
35 changes: 35 additions & 0 deletions edge-apps/birthday-greeting/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"name": "birthday-greeting",
"version": "1.0.0",
"type": "module",
"scripts": {
"prebuild": "bun run type-check",
"generate-mock-data": "screenly edge-app run --generate-mock-data",
"predev": "bun run generate-mock-data && edge-apps-scripts build",
"dev": "run-p build:dev edge-app-server",
"edge-app-server": "screenly edge-app run",
"build": "edge-apps-scripts build",
"build:dev": "edge-apps-scripts build:dev",
"build:prod": "edge-apps-scripts build",
"test": "bun test",
"test:unit": "bun test",
"lint": "edge-apps-scripts lint --fix",
"format": "prettier --write src/ README.md index.html",
"format:check": "prettier --check src/ README.md index.html",
"deploy": "bun run build && screenly edge-app deploy",
"type-check": "edge-apps-scripts type-check",
"prepare": "cd ../edge-apps-library && bun install && bun run build"
},
"dependencies": {},
"prettier": "../edge-apps-library/.prettierrc.json",
"devDependencies": {
"@screenly/edge-apps": "workspace:../edge-apps-library",
"@types/bun": "^1.3.6",
"@types/jsdom": "^27.0.0",
"bun-types": "^1.3.6",
"jsdom": "^27.4.0",
"npm-run-all2": "^8.0.4",
"prettier": "^3.8.1",
"typescript": "^5.9.3"
}
}
39 changes: 39 additions & 0 deletions edge-apps/birthday-greeting/screenly.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
---
syntax: manifest_v1
description: A birthday greeting app that displays a personalized message with the person's name, role, and photo.
icon: https://playground.srly.io/edge-apps/birthday-greeting/static/img/icon.svg
author: Screenly, Inc.
ready_signal: true
settings:
display_errors:
type: string
default_value: 'false'
title: Display Errors
optional: true
help_text:
properties:
advanced: true
help_text: For debugging purposes to display errors on the screen.
type: boolean
schema_version: 1
image:
type: string
default_value: ''
title: Image
optional: false
help_text: |
A base64-encoded image of the person.
name:
type: string
default_value: ''
title: Name
optional: false
help_text: |
The name of the person having a birthday (e.g., "Amy Smith").
role:
type: string
default_value: ''
title: Role
optional: false
help_text: |
The role or position of the person (e.g., "Sales Manager").
39 changes: 39 additions & 0 deletions edge-apps/birthday-greeting/screenly_qc.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
---
syntax: manifest_v1
description: A birthday greeting app that displays a personalized message with the person's name, role, and photo.
icon: https://playground.srly.io/edge-apps/birthday-greeting/static/img/icon.svg
author: Screenly, Inc.
ready_signal: true
settings:
display_errors:
type: string
default_value: 'false'
title: Display Errors
optional: true
help_text:
properties:
advanced: true
help_text: For debugging purposes to display errors on the screen.
type: boolean
schema_version: 1
image:
type: string
default_value: ''
title: Image
optional: false
help_text: |
A base64-encoded image of the person.
name:
type: string
default_value: ''
title: Name
optional: false
help_text: |
The name of the person having a birthday (e.g., "Amy Smith").
role:
type: string
default_value: ''
title: Role
optional: false
help_text: |
The role or position of the person (e.g., "Sales Manager").
Loading