# alloy-howtos
> Titanium Alloy CLI and configuration guide. Use when creating, reviewing, analyzing, or examining Alloy projects, running alloy commands (new, generate, compile), configuring alloy.jmk or config.json, debugging compilation errors, creating conditional views, using Backbone.Events for communication, or writing custom XML tags.
- Author: Cesar Estrada
- Repository: macCesar/titools
- Version: 20260205112147
- Stars: 1
- Forks: 0
- Last Updated: 2026-02-06
- Source: https://github.com/macCesar/titools
- Web: https://mule.run/skillshub/@@macCesar/titools~alloy-howtos:20260205112147
---
---
name: alloy-howtos
description: "Titanium Alloy CLI and configuration guide. Use when creating, reviewing, analyzing, or examining Alloy projects, running alloy commands (new, generate, compile), configuring alloy.jmk or config.json, debugging compilation errors, creating conditional views, using Backbone.Events for communication, or writing custom XML tags."
argument-hint: "[task]"
allowed-tools: Read, Grep, Glob, Edit, Write, Bash(alloy *), Bash(node *)
---
# Titanium Alloy How-tos
Practical guide for Alloy MVC projects in the Titanium SDK.
## Project detection
:::info Auto-detects Alloy projects
This skill checks for Alloy projects when invoked and provides CLI and configuration guidance.
Detection is automatic. No manual command is needed.
Alloy project indicators:
- `app/` folder with Alloy structure
- `alloy.jmk` or `config.json` files
Behavior based on detection:
- Alloy detected -> Provide Alloy CLI command guidance, configuration file help, Alloy-specific troubleshooting
- Not detected -> Explain this skill is for Alloy projects only and suggest Alloy guides if the user wants to migrate
:::
## Quick reference
| Topic | Reference |
| -------------------------------------------- | ----------------------------------------------------------------------- |
| Best Practices & Naming Conventions | [best_practices.md](references/best_practices.md) |
| CLI Commands (new, generate, compile) | [cli_reference.md](references/cli_reference.md) |
| Configuration Files (alloy.jmk, config.json) | [config_files.md](references/config_files.md) |
| Custom XML Tags & Reusable Components | [custom_tags.md](references/custom_tags.md) |
| Debugging & Common Errors | [debugging_troubleshooting.md](references/debugging_troubleshooting.md) |
| Code Samples & Conditionals | [samples.md](references/samples.md) |
## Key practices
### Naming conventions
- **Never use double underscore prefixes** (`__foo`) - reserved for Alloy
- **Never use JavaScript reserved words as IDs**
### Global events - use Backbone.Events
Avoid `Ti.App.fireEvent` / `Ti.App.addEventListener`. It can cause memory leaks and poor performance.
Use the Backbone.Events pattern:
```javascript
// In alloy.js
Alloy.Events = _.clone(Backbone.Events);
// Listener
Alloy.Events.on('updateMainUI', refreshData);
// Clean up on close
$.controller.addEventListener('close', () => {
Alloy.Events.off('updateMainUI');
});
// Trigger
Alloy.Events.trigger('updateMainUI');
```
### Global variables in non-controller files
Always require Alloy modules:
```javascript
const Alloy = require('alloy');
const Backbone = require('alloy/backbone');
const _ = require('alloy/underscore')._;
```
## Conditional views
Use `if` attributes in XML for conditional rendering (evaluated before render):
```xml
```
Conditional TSS styles:
```tss
"#info[if=Alloy.Globals.isIos7Plus]": {
font: { textStyle: Ti.UI.TEXT_STYLE_FOOTNOTE }
}
```
Data-binding conditionals:
```xml
```
## Common error solutions
| Error | Solution |
| --------------------------------------- | ------------------------------------------------------- |
| `No app.js found` | Run `alloy compile --config platform=` |
| Android assets not showing | Use absolute paths (prepend `/`) |
| `Alloy is not defined` (non-controller) | Add `const Alloy = require('alloy');` |
| iOS `invalid method passed to UIModule` | Creating Android-only object - use `platform` attribute |
## CLI quick reference
```bash
# New project
alloy new [path] [template]
# Generate components
alloy generate controller
alloy generate model
alloy generate style --all
# Compile
alloy compile [--config platform=android,deploytype=test]
# Extract i18n strings
alloy extract-i18n en --apply
# Copy/move/remove controllers
alloy copy
alloy move
alloy remove
```
## Configuration files priority
**config.json precedence:** `os:ios` > `env:production` > `global`
Access at runtime: `Alloy.CFG.yourKey`
## Custom XML tags
Create reusable components without widgets. Drop a file in `app/lib/`:
**app/lib/checkbox.js**
```javascript
exports.createCheckBox = args => {
const wrapper = Ti.UI.createView({ layout: "horizontal", checked: false });
const box = Ti.UI.createView({ width: 15, height: 15, borderWidth: 1 });
// ... build component, return Ti.UI.* object
return wrapper;
};
```
**view.xml**
```xml
```
Key: the `module` attribute points to the file in `app/lib/` (without `.js`). The function must be `create`.
See [custom_tags.md](references/custom_tags.md) for complete examples.
## Resources
### references/
Reference docs by topic:
- **best_practices.md** - Coding standards, naming conventions, global events patterns
- **cli_reference.md** - All CLI commands with options and model schema format
- **config_files.md** - alloy.jmk tasks, config.json structure, widget.json format
- **custom_tags.md** - Creating reusable custom XML tags without widgets
- **debugging_troubleshooting.md** - Common errors with solutions
- **samples.md** - Controller examples, conditional views, data-binding patterns
## Related skills
For tasks beyond Alloy CLI and configuration, use these related skills:
| Task | Use This Skill |
| ---------------------------------------- | -------------- |
| Modern architecture, services, patterns | `ti-expert` |
| Alloy MVC concepts, models, data binding | `alloy-guides` |
| SDK config, Hyperloop, app distribution | `ti-guides` |