Modern web application for performing the Johari Window exercise with distributed teams. Features real-time collaboration using Firestore and full cloud deployment.
- Real-time collaboration with Firestore backend
- Multi-user support across different browsers and devices
- Multi-language with hot-reload (Spanish, French, English)
- Dual visualization: classic (4 equal quadrants) and proportional
- 56 adjectives from the original Johari Window
- Unique access codes for participants
- Administrator panel with real-time progress tracking
- Data export and image download
- Live progress updates showing completion status
- HTML5, CSS3, Vanilla JavaScript
- Responsive design
- Real-time updates every 5 seconds
- Node.js + Express API
- Firestore (Google Cloud) for data persistence
- Cloud Run deployment with nginx proxy
- Access the deployed URL or run locally
- Enter participant names (minimum 2)
- Click "Add participant" to add more team members
- Generate unique access codes
- Share codes with the team
- Access participant page with their unique code
- Complete self-assessment (select 5-6 adjectives)
- Evaluate all peers (5-6 adjectives each)
- View progress of other participants in real-time
- See live updates as others complete the exercise
- Access admin panel with administrator code
- View real-time progress of all participants
- See completion status (completed/pending)
- Visualize all generated windows
- Download individual or all images
- Export data to JSON
The app is deployed as a single Cloud Run service with nginx serving the frontend and proxying API calls to the Node.js backend.
# 1. Deploy using the deploy script
./deploy.sh
# It will:
# - Use your default gcloud project
# - Build the container with nginx + backend
# - Deploy to Cloud Run
# - Configure Firestore permissionsPrerequisites:
- Google Cloud Project with billing enabled
- Firestore enabled in Firebase Console
- gcloud CLI installed
# Start local server (backend + frontend)
./start-local.sh
# Access at http://localhost:8080johari-window/
├── index.html # Initial setup
├── participant.html # Participant interface
├── admin.html # Administrator panel
├── css/
│ └── styles.css # Application styles
├── js/
│ ├── i18n.js # Translation system
│ ├── data.js # API client + adjectives
│ ├── johari.js # Calculation algorithm
│ ├── canvas.js # Visualization
│ ├── setup.js # Setup logic
│ ├── participante.js # Participant logic
│ └── admin.js # Admin logic
├── server/
│ ├── server.js # Express API backend
│ ├── package.json # Node.js dependencies
│ └── Dockerfile # Backend container
├── Dockerfile # Frontend + Backend container
├── start.sh # Container startup script
├── deploy.sh # Cloud Run deployment script
└── .gitignore # Git exclusions
GET /api/session- Get current sessionPOST /api/session- Create/update sessionDELETE /api/session- Delete sessionGET /api/participant/:code- Get participant by codePUT /api/participant/:code/self-assessment- Save self-assessmentPUT /api/participant/:code/peer-assessment/:evaluatedCode- Save peer assessment
- Firestore collection:
sessions - Document ID:
current - Schema:
{ "adminCode": "ABCDEF", "participants": [ { "name": "John Doe", "code": "XYZ123", "selfAssessment": [...], "peerAssessments": {...}, "completed": false } ], "createdAt": "2025-01-01T00:00:00Z" }
Edit in js/canvas.js:
const colors = {
open: '#059669', // Green
blind: '#d97706', // Orange
hidden: '#2563eb', // Blue
unknown: '#64748b' // Gray
};Edit in js/i18n.js:
translations: {
es: { ... },
fr: { ... },
en: { ... },
de: { ... } // New language
}Edit in js/data.js:
adjectives: {
es: [ ... ],
fr: [ ... ],
en: [ ... ]
}When deploying to Cloud Run:
GOOGLE_CLOUD_PROJECT- Project ID for Firestore
For local development:
- Set
API_BASE_URLin browser console or edit HTML
Can you use fewer than 2 participants? No, minimum of 2 participants required.
Does it work offline? Only with the default LocalStorage fallback. For multi-user collaboration, Firestore backend is required.
Do codes expire? No, codes are permanent as long as the session isn't reset.
Can the exercise be paused? Yes, each participant can close the browser and continue later with their code.
How does real-time work? The app polls the Firestore backend every 5 seconds to get the latest data.
Is my data secure? Yes, data is stored in Google Cloud Firestore with authentication. You can review your project's security settings in the Firebase Console.
Firestore Free Tier:
- 50K reads/day
- 20K writes/day
- 20K deletes/day
- 1GB storage
For typical usage (10 participants, once per month):
- Reads: ~500 operations
- Writes: ~300 operations
- Storage: <1MB
Cloud Run:
- Free tier: 2 million requests/month
- After that: $0.40 per million requests
- Data is stored in Google Cloud Firestore
- Access controlled by unique codes
- No personal information collected
- Data can be exported and deleted at any time
Based on the Johari Window by Joseph Luft and Harry Ingham (1955).
Free for educational and business use.