# Troubleshooting

Solutions for common issues when developing Mosis apps.

## Build Errors

### "Invalid manifest: missing required field"

Your `manifest.json` is missing a required field.

**Solution:** Check these required fields:
```json
{
  "id": "com.example.app",
  "name": "App Name",
  "version": "1.0.0",
  "version_code": 1,
  "entry": "assets/main.rml",
  "author": {
    "name": "Your Name",
    "email": "you@example.com"
  },
  "icons": {
    "128": "icon.png"
  }
}
```

### "Invalid package ID format"

Package IDs must follow reverse domain notation.

**Valid:**
- `com.example.myapp`
- `com.yourname.calculator`
- `io.github.user.app`

**Invalid:**
- `myapp` (needs domain prefix)
- `Com.Example.App` (must be lowercase)
- `com..app` (no double dots)
- `com.app.` (can't end with dot)

### "Entry point not found"

The `entry` file specified in manifest doesn't exist.

**Solution:** Verify the path:
```json
"entry": "assets/main.rml"
```

Check that `assets/main.rml` exists relative to your manifest file.

### "Icon not found"

An icon file specified in manifest doesn't exist.

**Solution:**
1. Check file paths are correct
2. Ensure files exist
3. Use forward slashes in paths

```json
"icons": {
  "128": "icons/icon-128.png"
}
```

### "Package too large"

Package exceeds the 10MB limit.

**Solutions:**
- Compress images (use TGA or optimized PNG)
- Remove unused assets
- Move large files to external CDN
- Check for accidentally included files

## Runtime Errors

### "attempt to index nil value"

You're accessing a property on a nil variable.

**Common causes:**

1. **Element not found:**
```lua
-- Bad
local elem = document:GetElementById("typo")
elem.inner_rml = "Hello"  -- Error: elem is nil

-- Good
local elem = document:GetElementById("correct-id")
if elem then
    elem.inner_rml = "Hello"
end
```

2. **Table key doesn't exist:**
```lua
-- Bad
local data = json.decode(response.body)
print(data.user.name)  -- Error if user is nil

-- Good
if data and data.user then
    print(data.user.name)
end
```

### "attempt to call nil value"

You're calling a function that doesn't exist.

**Common causes:**

1. **Typo in function name:**
```lua
-- Bad: navigateto (lowercase t)
navigateto("settings")

-- Good
navigateTo("settings")
```

2. **Missing permission:**
```lua
-- Error if 'network' permission not declared
http.get(url, callback)
```

### "Permission denied"

You're using an API without the required permission.

**Solution:** Add permission to manifest:
```json
"permissions": ["storage", "network"]
```

### "Network request failed"

HTTP request couldn't complete.

**Common causes:**

1. **No network permission:**
```json
"permissions": ["network"]
```

2. **Invalid URL:**
```lua
-- Bad: missing protocol
http.get("api.example.com/data", callback)

-- Good
http.get("https://api.example.com/data", callback)
```

3. **HTTP not allowed (HTTPS only):**
```lua
-- Bad
http.get("http://example.com/data", callback)

-- Good
http.get("https://example.com/data", callback)
```

4. **CORS error:** The server doesn't allow cross-origin requests. Contact the API provider or use a CORS proxy.

### "Storage quota exceeded"

You've exceeded the 5MB storage limit.

**Solution:**
- Clear unnecessary data: `storage.clear()`
- Use selective removal: `storage.remove("large-key")`
- Store only essential data
- Consider using network storage for large data

## UI Issues

### Element not displaying

**Check:**

1. **Display not set to none:**
```css
/* Element might be hidden */
.element {
    display: none;  /* Remove this */
}
```

2. **Size is zero:**
```css
.element {
    width: 0;   /* Add dimensions */
    height: 0;
}
```

3. **Element is off-screen:**
```css
.element {
    position: absolute;
    left: -1000dp;  /* Move to visible area */
}
```

4. **Z-index issues:**
```css
.element {
    z-index: 1;  /* Bring to front */
}
```

### Click events not working

**Check:**

1. **Function exists:**
```xml
<button onclick="handleClick()">Click</button>
```
```lua
-- Make sure function is defined
function handleClick()
    print("Clicked!")
end
```

2. **Element is overlapped:**
Another element might be blocking clicks. Check z-index and position.

3. **Element has pointer-events: none:**
```css
.element {
    /* Remove this */
    pointer-events: none;
}
```

### Styles not applying

**Check:**

1. **Stylesheet is linked:**
```xml
<head>
    <link type="text/rcss" href="styles.rcss"/>
</head>
```

2. **Selector is correct:**
```css
/* Class selector needs dot */
.my-class { }

/* ID selector needs hash */
#my-id { }

/* Tag selector has no prefix */
button { }
```

3. **Specificity issues:**
More specific selectors override less specific ones:
```css
/* Less specific */
button { color: blue; }

/* More specific - wins */
.btn.primary { color: red; }
```

4. **Units are correct:**
```css
/* Use dp units */
padding: 12dp;

/* Not px on mobile */
padding: 12px;  /* May not work correctly */
```

### Layout breaks on different screens

**Solutions:**

1. **Use dp units instead of px:**
```css
padding: 16dp;  /* Scales properly */
```

2. **Use flexbox:**
```css
.container {
    display: flex;
    flex-direction: column;
}
```

3. **Use percentage widths:**
```css
.card {
    width: 90%;
    max-width: 400dp;
}
```

### Text is cut off

**Solutions:**

1. **Allow wrapping:**
```css
.text {
    word-break: break-word;
}
```

2. **Add overflow scrolling:**
```css
.container {
    overflow: auto;
}
```

3. **Use ellipsis (if supported):**
```css
.text {
    text-overflow: ellipsis;
    overflow: hidden;
    white-space: nowrap;
}
```

## Designer Issues

### Hot reload not working

**Solutions:**

1. **Save the file** - Changes only reload on save
2. **Check file is in watch path**
3. **Restart designer** - Sometimes needed after many changes
4. **Check for syntax errors** - Invalid files may not reload

### Designer crashes on startup

**Solutions:**

1. **Check file paths:**
```bash
# Make sure path exists
mosis-designer.exe ../assets/main.rml
```

2. **Try a simple file first:**
```xml
<rml>
<head><title>Test</title></head>
<body><p>Hello</p></body>
</rml>
```

3. **Check for missing assets:**
Images or fonts that don't exist can cause crashes.

4. **Update graphics drivers:**
The designer uses OpenGL which requires up-to-date drivers.

### Rendering looks different on device

**Common causes:**

1. **Font differences** - Ensure fonts are bundled
2. **DPI scaling** - Use dp units consistently
3. **Color profiles** - Use standard sRGB colors

## Submission Issues

### "Version code must be higher"

Each new version needs a higher version_code.

**Solution:**
```json
{
  "version": "1.0.1",
  "version_code": 2  // Increment from previous
}
```

### "Signature verification failed"

Your package signature is invalid.

**Solutions:**

1. **Rebuild the package:**
```bash
mosis build
```

2. **Check signing key is registered:**
```bash
mosis keys list
```

3. **Re-register your key if needed:**
```bash
mosis keys register ~/.mosis/keys/production.pub
```

### "Review rejected"

Check the rejection reason in your dashboard. Common issues:

| Reason | Solution |
|--------|----------|
| Inappropriate content | Remove violating content |
| Misleading description | Update description to match functionality |
| Crashes on launch | Fix startup errors |
| Missing privacy policy | Add privacy policy for data-collecting apps |
| Impersonation | Don't copy other apps |

## Getting More Help

### Check Logs

**Designer logs:**
```bash
mosis-designer.exe app.rml --log debug.log
```

**Lua errors:**
```lua
-- Add error handling
local success, err = pcall(function()
    -- Your code
end)
if not success then
    print("Error:", err)
end
```

### Search Issues

Check if others have encountered the same issue:
- Developer forum
- GitHub issues
- Stack Overflow (tag: mosis)

### Contact Support

If you're still stuck:
1. Gather error messages and logs
2. Create minimal reproduction case
3. Submit through developer portal support

## See Also

- [FAQ](faq.md) - Frequently asked questions
- [Lua API Reference](api/lua-api.md) - API documentation
- [UI Design Guide](guides/ui-design.md) - Styling reference
