diff --git a/README.md b/README.md
index 4442c0f..d954119 100644
--- a/README.md
+++ b/README.md
@@ -96,4 +96,14 @@ Complete documentation is available in the MkDocs site, including:
- Map application setup and usage
- Troubleshooting guides
-Visit http://localhost:4000 after starting services to access the full documentation.
\ No newline at end of file
+Visit http://localhost:4000 after starting services to access the full documentation.
+
+## Licensing
+
+This project is licensed under the Apache License 2.0 - https://opensource.org/license/apache-2-0
+
+## AI Disclaimer
+
+This project used AI tools to assist in its creation and large amounts of the boilerplate code was reviewed using AI. AI tools (although not activated or connected) are pre-installed in the Coder docker image. See `docker.code-server` for more details.
+
+While these tools can help generate code and documentation, they may also introduce errors or inaccuracies. Users should review and test all content to ensure it meets their requirements and standards.
\ No newline at end of file
diff --git a/influence/ADMIN_INLINE_HANDLER_FIX.md b/influence/ADMIN_INLINE_HANDLER_FIX.md
deleted file mode 100644
index 880dc7d..0000000
--- a/influence/ADMIN_INLINE_HANDLER_FIX.md
+++ /dev/null
@@ -1,191 +0,0 @@
-# Response Wall Admin Panel - Inline Handler Fix Summary
-
-## Issue
-Content Security Policy (CSP) violation when clicking buttons in the Response Moderation tab of the admin panel.
-
-## Error Messages
-```
-Refused to execute inline event handler because it violates the following Content Security Policy directive: "script-src-attr 'none'"
-TypeError: window.apiClient.patch is not a function
-```
-
-## Root Causes
-
-### 1. Inline Event Handlers (CSP Violation)
-The admin panel's Response Moderation tab was using inline `onclick` handlers:
-```javascript
-
-```
-
-This violates:
-- Browser Content Security Policy (CSP)
-- Project development guidelines in `instruct.md`: **"No inline event handlers. Always use addEventListener in JS files."**
-
-### 2. Missing API Client Methods
-The `APIClient` class only had `get()` and `post()` methods, but admin operations needed `patch()`, `put()`, and `delete()`.
-
-## Solutions Implemented
-
-### Fix 1: Removed All Inline Handlers in admin.js
-
-**Before:**
-```javascript
-
-```
-
-**After:**
-```javascript
-
-```
-
-### Fix 2: Added Event Delegation
-
-Created new `setupResponseActionListeners()` method in `AdminPanel` class:
-
-```javascript
-setupResponseActionListeners() {
- const container = document.getElementById('admin-responses-container');
- if (!container) return;
-
- // Remove old listener if exists to avoid duplicates
- const oldListener = container._responseActionListener;
- if (oldListener) {
- container.removeEventListener('click', oldListener);
- }
-
- // Create new listener with event delegation
- const listener = (e) => {
- const target = e.target;
- const action = target.dataset.action;
- const responseId = target.dataset.responseId;
-
- if (!action || !responseId) return;
-
- switch (action) {
- case 'approve-response':
- this.approveResponse(parseInt(responseId));
- break;
- case 'reject-response':
- this.rejectResponse(parseInt(responseId));
- break;
- case 'verify-response':
- const isVerified = target.dataset.verified === 'true';
- this.toggleVerified(parseInt(responseId), isVerified);
- break;
- case 'delete-response':
- this.deleteResponse(parseInt(responseId));
- break;
- }
- };
-
- // Store listener reference and add it
- container._responseActionListener = listener;
- container.addEventListener('click', listener);
-}
-```
-
-This method is called at the end of `renderAdminResponses()` to set up listeners after the HTML is rendered.
-
-### Fix 3: Added Missing HTTP Methods to api-client.js
-
-```javascript
-async put(endpoint, data) {
- return this.makeRequest(endpoint, {
- method: 'PUT',
- body: JSON.stringify(data)
- });
-}
-
-async patch(endpoint, data) {
- return this.makeRequest(endpoint, {
- method: 'PATCH',
- body: JSON.stringify(data)
- });
-}
-
-async delete(endpoint) {
- return this.makeRequest(endpoint, {
- method: 'DELETE'
- });
-}
-```
-
-## Buttons Fixed
-
-All response moderation buttons now use proper event delegation:
-
-1. **Approve** - `data-action="approve-response"`
-2. **Reject** - `data-action="reject-response"`
-3. **Mark as Verified** - `data-action="verify-response" data-verified="true"`
-4. **Remove Verification** - `data-action="verify-response" data-verified="false"`
-5. **Unpublish** - `data-action="reject-response"` (reuses reject action)
-6. **Delete** - `data-action="delete-response"`
-
-## Files Modified
-
-1. **app/public/js/admin.js**
- - Modified `renderAdminResponses()` - Replaced inline onclick with data attributes
- - Added `setupResponseActionListeners()` - Event delegation implementation
- - Total changes: ~85 lines modified/added
-
-2. **app/public/js/api-client.js**
- - Added `put()` method
- - Added `patch()` method
- - Added `delete()` method
- - Total changes: ~18 lines added
-
-## Benefits of This Approach
-
-### 1. Security
-- ✅ Complies with Content Security Policy (CSP)
-- ✅ Prevents script injection attacks
-- ✅ Follows modern web security best practices
-
-### 2. Performance
-- ✅ Single event listener instead of N listeners (one per button)
-- ✅ Better memory usage
-- ✅ Faster page rendering
-
-### 3. Maintainability
-- ✅ Follows project coding standards (instruct.md)
-- ✅ Centralized event handling logic
-- ✅ Easy to add new actions without HTML changes
-
-### 4. Reliability
-- ✅ Prevents duplicate listeners
-- ✅ Clean listener removal/re-attachment
-- ✅ Works with dynamically rendered content
-
-## Testing Checklist
-
-- [x] Load admin panel → Response Moderation tab
-- [x] Click "Approve" button → Should approve response without CSP error
-- [x] Click "Reject" button → Should reject response
-- [x] Click "Mark as Verified" → Should add verification badge
-- [x] Click "Remove Verification" → Should remove badge
-- [x] Click "Delete" → Should delete response after confirmation
-- [x] Filter responses by status → Should reload list
-- [x] No console errors related to inline handlers
-- [x] No CSP violations
-
-## Lessons Learned
-
-1. **Always Follow Project Guidelines**: The instruct.md file explicitly prohibits inline event handlers - following it from the start would have prevented this issue
-
-2. **Complete API Client**: When building a REST client, implement all HTTP methods (GET, POST, PUT, PATCH, DELETE) from the beginning
-
-3. **Event Delegation for Dynamic Content**: When rendering content dynamically with buttons/links, always use event delegation on a parent container
-
-4. **CSP is Your Friend**: Content Security Policy errors point to real security issues - fix them rather than disabling CSP
-
-## Related Documentation
-
-- See `instruct.md` - Development Rules section: "No inline event handlers"
-- See `RESPONSE_WALL_FIXES.md` - Full list of all Response Wall bug fixes
-- See `RESPONSE_WALL_USAGE.md` - How to use the Response Wall feature
diff --git a/influence/RESPONSE_WALL_FIXES.md b/influence/RESPONSE_WALL_FIXES.md
deleted file mode 100644
index 5bf05f5..0000000
--- a/influence/RESPONSE_WALL_FIXES.md
+++ /dev/null
@@ -1,181 +0,0 @@
-# Response Wall Bug Fixes
-
-## Issues Identified and Fixed
-
-### 1. **TypeError: responses.filter is not a function**
-**Error Location**: `app/controllers/responses.js:292` in `getResponseStats()`
-
-**Root Cause**: The `getRepresentativeResponses()` method in `nocodb.js` was returning the raw NocoDB API response object `{list: [...], pageInfo: {...}}` instead of an array. The controller code expected an array and tried to call `.filter()` on an object.
-
-**Fix Applied**: Modified `getRepresentativeResponses()` to extract the `list` array from the response and normalize each item:
-
-```javascript
-async getRepresentativeResponses(params = {}) {
- if (!this.tableIds.representativeResponses) {
- throw new Error('Representative responses table not configured');
- }
- const result = await this.getAll(this.tableIds.representativeResponses, params);
- // NocoDB returns {list: [...]} or {pageInfo: {...}, list: [...]}
- const list = result.list || [];
- return list.map(item => this.normalizeResponse(item));
-}
-```
-
-### 2. **TypeError: responses.map is not a function**
-**Error Location**: `app/controllers/responses.js:51` in `getCampaignResponses()`
-
-**Root Cause**: Same as issue #1 - the method was returning an object instead of an array.
-
-**Fix Applied**: Same fix as above ensures an array is always returned.
-
-### 3. **Database Error: "A value is required for this field" (code 23502)**
-**Error Location**: NocoDB database constraint violation when creating a response
-
-**Root Cause**: The `campaign_id` field was being set to `null` or `undefined`. Investigation revealed that:
-- The campaign object from NocoDB uses `Id` (capital I) as the primary key field
-- The controller was trying to access `campaign.id` (lowercase) which returned `undefined`
-- NocoDB's representative_responses table has `campaign_id` marked as required (`"rqd": true`)
-
-**Fix Applied**:
-1. Updated `submitResponse()` controller to check multiple possible field names:
-```javascript
-campaign_id: campaign.Id || campaign.id || campaign['Campaign ID'],
-```
-
-2. Added validation in `createRepresentativeResponse()` to fail fast if campaign_id is missing:
-```javascript
-if (!responseData.campaign_id) {
- throw new Error('Campaign ID is required for creating a response');
-}
-```
-
-3. Added debug logging to track the campaign_id value:
-```javascript
-console.log('Submitting response with campaign_id:', newResponse.campaign_id, 'from campaign:', campaign);
-```
-
-### 4. **Array Handling in Response Upvotes**
-**Potential Issue**: The `getResponseUpvotes()` method had the same array vs object issue
-
-**Fix Applied**: Updated the method to return a normalized array:
-```javascript
-async getResponseUpvotes(params = {}) {
- if (!this.tableIds.responseUpvotes) {
- throw new Error('Response upvotes table not configured');
- }
- const result = await this.getAll(this.tableIds.responseUpvotes, params);
- // NocoDB returns {list: [...]} or {pageInfo: {...}, list: [...]}
- const list = result.list || [];
- return list.map(item => this.normalizeUpvote(item));
-}
-```
-
-## Files Modified
-
-1. **app/services/nocodb.js**
- - Modified `getRepresentativeResponses()` - Extract and normalize list
- - Modified `getResponseUpvotes()` - Extract and normalize list
- - Modified `createRepresentativeResponse()` - Add campaign_id validation and logging
-
-2. **app/controllers/responses.js**
- - Modified `submitResponse()` - Handle multiple campaign ID field name variations (ID, Id, id)
- - Added debug logging for campaign_id
-
-3. **app/public/js/admin.js**
- - Modified `renderAdminResponses()` - Removed all inline onclick handlers, replaced with data-action attributes
- - Added `setupResponseActionListeners()` - Event delegation for response moderation buttons
- - Follows instruct.md guidelines: "No inline event handlers. Always use addEventListener in JS files."
-
-4. **app/public/js/api-client.js**
- - Added `put()` method for HTTP PUT requests
- - Added `patch()` method for HTTP PATCH requests
- - Added `delete()` method for HTTP DELETE requests
- - These methods were missing and causing errors in admin panel operations
-
-## Testing
-
-After applying these fixes, test the following:
-
-1. **Load Response Wall** - Visit `http://localhost:3333/response-wall.html?campaign=test-page`
- - Stats should load without errors
- - Response list should load without errors
-
-2. **Submit Response** - Fill out and submit the response form
- - Should successfully create a response in pending status
- - Should return a success message
- - Check logs for "Submitting response with campaign_id: [number]"
-
-3. **Upvote Response** - Click the upvote button on an approved response
- - Should increment the upvote count
- - Should prevent duplicate upvotes
-
-4. **Admin Moderation** - Visit `http://localhost:3333/admin.html` → Response Moderation tab
- - Should see pending responses
- - Should be able to approve/reject responses
-
-## Deployment
-
-The application container has been restarted with:
-```bash
-docker compose restart app
-```
-
-All fixes are now live and ready for testing.
-
-## Root Cause Analysis
-
-The main issue was a misunderstanding of NocoDB's API response structure:
-- **Expected**: Array of records directly
-- **Actual**: Object with `{list: [records], pageInfo: {...}}`
-
-This is a common pattern in REST APIs for pagination support. The fix ensures all service methods return properly normalized arrays for consistent usage throughout the application.
-
-The secondary issue was field naming inconsistency:
-- **NocoDB Primary Key**: Uses `ID` (all caps) not `Id` or `id`
-- **Application Code**: Expected `id` (lowercase)
-
-The fix handles all three variations to ensure compatibility: `campaign.ID || campaign.Id || campaign.id`
-
-### 5. **CSP Violation: Inline Event Handlers in Admin Panel**
-**Error**: "Refused to execute inline event handler because it violates the following Content Security Policy directive: 'script-src-attr 'none''"
-
-**Root Cause**: The `renderAdminResponses()` method in admin.js was using inline `onclick` handlers like:
-```javascript
-