NomadPage is a platform designed to support digital nomads who plan to live and work from Sri Lanka. Our goal is to create a centralized hub for all the resources nomads need.
The platform simplifies the relocation experience by bringing essential information into one place, allowing digital nomads to easily access everything they need through a single system tailored specifically for Sri Lanka.
We built this solution as part of the Innovate with Ballerina competition organized by the University of Moratuwa in partnership with WSO2.
Frontend: Next.js 15, Tailwind CSS, Shadcn/ui
Backend: Ballerina, PostgreSQL, AWS S3
Additional Services: Flask, BeautifulSoup4 (for news scraping)
Before you start, make sure you have installed:
- Node.js v20+ and npm
- Ballerina
- Python
- PostgreSQL (or Supabase for easier setup)
- Asgardeo Account (for authentication)
- AWS Account (for S3 file storage)
git clone https://github.com/<username>/iwb25-075-octopipers.git
cd iwb25-075-octopipers- Create a new PostgreSQL database (or Supabase project).
- Run the schema file to create tables:
service/resources/schema.sql- AWS S3 → Create a bucket, IAM user, and note down credentials.
- Perplexity API → Get your API key from perplexity.ai.
- OpenWeather API → Get your API key from openweathermap.org.
In the service/ root directory:
[service.utils]
dbHost = "database-host"
dbUser = "database-username"
dbPassword = "database-password"
dbPort = 5432
dbName = "database-name"
accessKeyId = "aws-access-key"
secretAccessKey = "aws-secret-key"
region = "aws-region"
bucketName = "s3-bucket-name"
[service.city_guide]
perplexityApiKey = "perplexity-api-key"
[service.tools]
openWeatherApi = "openweathermap-api-key"cd service
bal runBackend available at: http://localhost:8080
cd webapp
npm install- Create a new app in Asgardeo Console.
- Collect:
- Client ID
- Client Secret
- Organization Name
- Application Name
- Create a
.env.localfile inwebapp/:
AUTH_SECRET=your-secret-key
ASGARDEO_CLIENT_ID=your-client-id
ASGARDEO_CLIENT_SECRET=your-client-secret
AUTH_ASGARDEO_ISSUER="https://api.asgardeo.io/t/<org-name>/oauth2/token"
NEXT_PUBLIC_AUTH_ASGARDEO_LOGOUT_URL="https://api.asgardeo.io/t/<org-name>/oidc/logout"
NEXT_PUBLIC_AUTH_ASGARDEO_POST_LOGOUT_REDIRECT_URL="http://localhost:3000/auth/sign-out"- Configure Backend Authentication
Update the JWT validator configuration in
service.bal:
auth: [
{
jwtValidatorConfig: {
issuer: "https://api.asgardeo.io/t/<org-name>/oauth2/token",
audience: ["your-client-id"],
signatureConfig: {
jwksConfig: {
url: "https://api.asgardeo.io/t/<org-name>/oauth2/jwks"
}
}
}
}
]npm run devFrontend available at: http://localhost:3000
This service scrapes latest news from newswire.lk and provides live updates.
cd newswired
python -m venv venv
# On Windows
venv\Scripts\activate
# On macOS/Linux
source venv/bin/activate
pip install -r requirements.txt
python app.pyNews scraper runs at: http://localhost:5000/latest-news
- Backend (Ballerina):
http://localhost:8080 - Frontend (Next.js):
http://localhost:3000 - News Scraper (Flask):
http://localhost:5000/latest-news - WebSocket Services:
ws://localhost:9091(incidents),ws://localhost:9090(chat)
- City Rank - Rankings and insights for Sri Lankan cities
- Incident Report Map - Report and view local incidents
- Meetups - Connect with local groups and communities
- Find Remote Jobs - Search and apply for online opportunities
- Co-working Places - Discover work-friendly spaces
- Utility Tools - Currency conversion, time zones, weather, and latest news
- HTTP - RESTful API endpoints with resource functions
- WebSocket - Real-time bidirectional communication for chat , meetups and incidents
- PostgreSQL Connector - Database connectivity with connection pooling
- AWS S3 Connector
- JWT - Service-level JWT validation with WSO2 Asgardeo OIDC