Troubleshooting & FAQ
This guide covers common issues and frequently asked questions when developing with the GxP Toolkit.
Installation Issues
pnpm install fails with permission errors
Error:
EACCES: permission denied
Solution:
# Option 1: Use nvm to manage Node.js (recommended)
nvm install 18
nvm use 18
# Option 2: Fix pnpm permissions
pnpm setup
# Follow the instructions to add pnpm global bin to your PATH
gxdev command not found
Error:
zsh: command not found: gxdev
Solutions:
- Global install:
pnpm install -g @gxp-dev/tools
- Or use pnpm dlx:
pnpm dlx gxdev init my-plugin
- Or link locally (for toolkit development):
cd gx-devtools
pnpm link
TUI not available
Error:
TUI not available. Run "pnpm run build:tui" in gx-devtools first.
Solution:
# In the gx-devtools repository
pnpm run build:tui
Development Server Issues
SSL Certificate errors
Error:
NET::ERR_CERT_AUTHORITY_INVALID
Solutions:
- Generate certificates:
pnpm run setup-ssl
# or
gxdev setup-ssl
-
Accept certificate in browser:
- Click "Advanced" → "Proceed to localhost"
- Or add certificate to system keychain
-
Use HTTP instead:
gxdev dev --no-https
pnpm run dev-http
Port already in use
Error:
Error: Port 3060 is already in use
Solutions:
- Find and kill process:
# macOS/Linux
lsof -i :3060
kill -9 <PID>
# Windows
netstat -ano | findstr :3060
taskkill /PID <PID> /F
- Use different port:
# In .env
NODE_PORT=3061
Vite HMR not working
Symptoms:
- Changes don't reflect without refresh
- Console shows HMR disconnect errors
Solutions:
- Check for syntax errors in your Vue files
- Restart dev server:
# In TUI
/stop vite
/dev
# Or Ctrl+C and restart
- Clear Vite cache:
rm -rf node_modules/.vite
pnpm run dev
- Check network - HMR needs WebSocket connection
Build Issues
Build fails with import errors
Error:
Error: Cannot find module '@/components/...'
Solutions:
- Check import paths - ensure they use correct aliases:
// Correct
import MyComponent from '@/components/MyComponent.vue';
// Wrong
import MyComponent from './src/components/MyComponent.vue';
-
Verify vite.config.js has correct aliases
-
Check file exists at the specified path
CSS not included in build
Symptoms:
- Styles missing in production
- Components unstyled
Solutions:
- Use scoped styles:
<style scoped>
.my-class { color: blue; }
</style>
- Import CSS in component:
import './MyComponent.css';
- Check for CSS import errors in terminal
Bundle too large
Problem: Build output is larger than expected
Solutions:
- Analyze bundle:
pnpm exec vite build --mode analyze
- Check for unused dependencies
- Lazy load large components:
const HeavyComponent = defineAsyncComponent(() =>
import('./HeavyComponent.vue')
);
- Ensure Vue/Pinia are externalized (they're provided by platform)
App Manifest Issues
Strings not updating from manifest
Symptoms:
gxp-stringelements show fallback values- Changes to manifest don't reflect
Solutions:
- Check JSON syntax:
cat app-manifest.json | python -m json.tool
- Verify key names match between manifest and template:
// manifest
"strings": {
"default": {
"welcome_title": "Hello" // ← key name
}
}
<!-- template -->
<h1 gxp-string="welcome_title">Fallback</h1> <!-- ← same key -->
- Check console for manifest loading errors:
[GxP Store] Loaded configuration from app-manifest.json
- Ensure file location - manifest must be in project root
Hot reload not working for manifest
Symptoms:
- Must refresh page for manifest changes
Solutions:
- Check Vite HMR is connected
- Look for errors in terminal
- Full refresh sometimes needed for structural changes
Store Issues
Store not reactive
Symptoms:
- UI doesn't update when store changes
- Computed properties don't recalculate
Solutions:
- Use store methods for updates:
// Correct
store.updateString('key', 'value');
// Wrong - not reactive
store.stringsList.key = 'value';
- Access via getters:
// Reactive
const title = computed(() => store.getString('title', 'Default'));
// Not reactive if accessed once
const title = store.getString('title', 'Default');
- Use toRefs for destructuring:
import { storeToRefs } from 'pinia';
const { stringsList, pluginVars } = storeToRefs(store);
API calls failing
Symptoms:
- CORS errors
- 401 Unauthorized
- Network errors
Solutions:
- Check API environment:
# .env
VITE_API_ENV=mock # For local development
- Verify API key (for non-mock environments):
VITE_API_KEY=your_key_here
- Check proxy configuration in vite.config.js
Browser Extension Issues
Extension not loading
Solutions:
- Check extension path:
gxdev ext:install chrome
# Shows the correct path to load
- Enable Developer Mode in browser
- Check for manifest errors in browser console
- Reload extension after code changes
Element highlighting not working
Solutions:
- Ensure you're on dev server URL (localhost:3060)
- Check console for
[GxP Inspector] Loadedmessage - Reload extension:
- Chrome:
chrome://extensions→ Refresh - Firefox:
about:debugging→ Reload
- Chrome:
Vue components not detected
Solutions:
- Ensure Vue is in dev mode
- Check for Vue DevTools conflicts
- Refresh page after extension loads
Socket.IO Issues
Cannot connect to socket server
Error:
Error: Cannot connect to Socket.IO server
Solutions:
- Start socket server:
gxdev dev --with-socket
# or in TUI
/socket
- Check port:
# Default: 3069
# Verify in .env
SOCKET_IO_PORT=3069
- Match protocols - both dev and socket servers should use same (HTTP or HTTPS)
Events not received
Solutions:
- Check event name is exact (case-sensitive)
- Verify socket server is running (check TUI tabs)
- Check channel matches dependency config
- Look for console errors
Event file not found
Error:
Event file not found: MyEvent.json
Solutions:
- Check file exists in
socket-events/ - Verify filename matches event name exactly
- Check JSON syntax
Common FAQs
How do I create a new project?
mkdir my-plugin
cd my-plugin
gxdev init my-plugin
pnpm run dev-http # or pnpm run dev for HTTPS
Where is the final build output?
After running gxdev build:
dist/
├── build/ # Individual build files
│ ├── plugin.es.js
│ ├── plugin.es.css
│ └── ...
└── my-plugin.gxpapp # ← Deployable package
The .gxpapp file is a ZIP archive ready for platform upload.
How do I add a new translatable string?
- Add to manifest:
{
"strings": {
"default": {
"new_string_key": "Your text here"
}
}
}
- Use in template:
<span gxp-string="new_string_key">Default text</span>
Or via CLI:
gxdev datastore add --type string --key new_string_key --value "Your text"
How do I customize runtime files?
# Copy to your project for customization
gxdev publish server.js
gxdev publish gxpPortalConfigStore.js
gxdev publish vite.config.js
How do I test with production API?
# .env
VITE_API_ENV=production
VITE_API_KEY=your_production_key
VITE_API_PROJECT_ID=team/project
How do I scan for hardcoded strings?
gxdev datastore scan-strings --component src/Plugin.vue
This finds text content that should use gxp-string directives.
How do I generate placeholder images?
# Single placeholder
gxdev assets generate --size 400x300 --name hero
# Multiple variants
gxdev assets generate --size 200x200 --name avatar --count 5
Requires ImageMagick to be installed.
How do I access Dev Tools?
Press Ctrl+Shift+D (or Cmd+Shift+D on Mac) while on the dev server page.
Can I use TypeScript?
Yes! The toolkit supports TypeScript:
- Rename files to
.tsor.vuewith<script lang="ts"> - Add tsconfig.json to your project
- Install TypeScript dev dependency
How do I deploy my plugin?
- Build:
gxdev build - Upload
dist/my-plugin.gxpappto GxP admin portal - Configure settings in admin
- Assign to kiosks
Where do I report bugs?
File issues at: https://github.com/gramercytech/gx-devtools/issues
Debug Checklist
When something isn't working, check these in order:
- ✅ Console errors - Browser and terminal
- ✅ Network tab - Failed requests
- ✅ Manifest syntax - Valid JSON
- ✅ Key names - Exact match, case-sensitive
- ✅ Service status - Check TUI tabs
- ✅ Port conflicts - Single instance per port
- ✅ File paths - Correct aliases (@, @layouts, @gx-runtime)
- ✅ Cache - Clear and restart
- ✅ Dependencies - pnpm install complete
- ✅ Node version - 18+ required
Getting Help
- Documentation: You're reading it!
- TUI Help:
/helpcommand - CLI Help:
gxdev --helporgxdev <command> --help - Issues: https://github.com/gramercytech/gx-devtools/issues