Create, Display, Control. A next-generation web-based presentation application with unlimited customization, advanced screen remapping, and remote control capabilities.
Xellanix Projection goes beyond typical presentation software. It is designed to project content onto various screen sizes with precision. Whether you need complex animations, specific styling, or output remapping, Projection handles it all through a simple yet powerful interface.
- ๐จ Fully Customizable: Unlimited styling and animation possibilities for your content.
- ๐ฅ๏ธ Advanced Output: Screen remapping and multi-resolution support.
- ๐ฑ Remote Control: Control your presentation from any device via browser.
- โก High Performance: Built on modern web technologies (Bun).
Before you begin, ensure you have the following installed:
- Bun (Required runtime)
- Git
- Cloudflared (For remote control tunneling)
- Windows Terminal (Recommended for best experience on Windows)
Open your terminal in the project folder and install dependencies:
bun iYou have two modes for running the application:
| Mode | Command | Description |
|---|---|---|
| Development | bun run dev |
Read-write mode. Best for editing content. |
| Production | bun run start |
Read-only mode. Highly optimized performance. Requires Build. |
Warning
To run in production mode, you must build the project first.
Content is defined programmatically for maximum control.
- Location: Create a new
index.tsfile insidesrc/data/__temp/slides. - Structure: Export a constant named
_projectionscontaining your queue data.
Important
- Styling Customization: Deep style customization is natively supported for "Text" and "Component" types.
- System Core: If you require custom transitions (other than 'fade' or 'none') or advanced logic for primitive types, you will need to modify the core system files directly.
// src/data/__temp/slides/index.ts
export const _projections: ProjectionMaster[] = [
{
title: "My Presentation",
bg: "/__temp/path/to/background.mp4", // Background for the entire queue
transition: "fade", // "fade" or "none" (default: none)
contents: [
// Your slides go here (see Types below)
],
},
];You can define slides using three main types: Image/Video, Text, or Component.
// 1. Media (Image or Video)
{
type: "Image", // or "Video"
content: "/__temp/path/to/media.jpg", // Store local media in "public/__temp"
bg: "/__temp/optional-override-bg.mp4" // Optional per-content background
// name: "Optional name, like a title",
// group: "Optional group name",
// transition: "Optional per-content transition"
}
// 2. Text (Stylable)
{
type: "Text",
content: "Hello World",
options: {
className: "text-4xl font-bold", // Tailwind classes
style: { color: "red" } // React CSS properties
}
// bg: "/__temp/optional-override-bg.mp4"
// name: "Optional name, like a title",
// group: "Optional group name",
// transition: "Optional per-content transition"
}
// 3. Component (React Node)
{
type: "Component",
content: <MyCustomSlide />
// bg: "/__temp/optional-override-bg.mp4"
// name: "Optional name, like a title",
// group: "Optional group name",
// transition: "Optional per-content transition"
}Warning
If using local media, store them (files) in the public/__temp folder. Storing them outside the public/__temp folder may cause unexpected behavior.
Caution
Only import files from sources you trust. You assume full responsibility for any consequences.
Use the included Xellanix Projection Utilities app located at windows > utilities > utilities.exe.
- Importing:
- Select Import > Choose
.xprfile. - Review contents for safety.
- Process: Automatically extracts to the correct folders.
- Build:
- Choose "Build Now" to automatically prepare the app for production.
- Choose "Build Later" if you prefer to run the manual command (
bun run build) yourself at a later time.
- Select Import > Choose
- Exporting:
- Select Export.
- Review contents.
- Process: Packs your current temp folders into an
.xprfile.
Importing:
- Extract the
.xpr(zip) file. - Copy contents of
publicโXellanix Projection/public/__temp/ - Copy contents of
dataโXellanix Projection/src/data/__temp/ - Build: Run
bun run buildmanually.
Exporting:
- Copy files from
public/__tempto a new folder namedpublic. - Copy files from
src/data/__tempto a new folder nameddata. - Zip both folders and change extension from
.zipto.xpr.
Access the control view at http://localhost:12526.
- Sidebar: Navigation for Queues (slide decks) and Settings.
- Preview Section: Browse and prepare slides without showing them on the main screen.
- On Screen Section: Controls what is currently visible to the audience.
| Action | Key / Shortcut | Description |
|---|---|---|
| Add Queue | Shift + A |
Add queue(s) from .json file(s) |
| Action | Key / Shortcut | Scope |
|---|---|---|
| Previous Slide | Left |
On Screen |
| Next Slide | Right |
On Screen |
| Previous Preview Item | Shift + Left |
Preview |
| Next Preview Item | Shift + Right |
Preview |
| Jump to Slide #1-9 | 1 - 9 |
On Screen |
| Jump to Slide #10 | 0 |
On Screen |
| Jump to Group #1-10 | Shift + 0-9 |
On Screen |
| Select Queue | Up / Down |
Sidebar |
| Action | Key / Shortcut | Description |
|---|---|---|
| Project | Enter |
Push Preview content to Screen |
| Stop Projection | Shift + Enter |
Stop current session |
| Cover Screen | V |
Apply cover overlay |
| Transparent | T |
Make screen transparent |
| Blackout | B |
Turn screen black |
| Clear | C |
Hide content (keep background) |
| Live Message | Shift + M |
Show marquee message |
- Project: Moves the content currently selected in Preview to the On Screen view.
- Stop Projection: Halts the current projection immediately.
- Screen Overlays:
- Cover: Apply cover screen (configurable in Settings).
- Transparent: Useful for OBS/Overlay workflows.
- Black: Standard blackout.
- Clear: Hides the text/component foreground but keeps the video/image background running.
- Live Message: Display a scrolling marquee message at the bottom of the screen.
Control your presentation from a tablet or phone.
- Ensure the app is running locally.
- Run the tunnel command:
cloudflared tunnel --url http://localhost:12526
- Use the generated URL on any device to access the control interface.