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. This project was developed for the Innovate with Ballerina 2025 competition.
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 run
Backend 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.local
file 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/{yourorgname}/oauth2/token"
NEXT_PUBLIC_AUTH_ASGARDEO_LOGOUT_URL="https://api.asgardeo.io/t/{yourorgname}/oidc/logout"
NEXT_PUBLIC_AUTH_ASGARDEO_POST_LOGOUT_REDIRECT_URL="http://localhost:3000/auth/sign-out"
- Configure Backend Authentication - In your
service.bal
file, update the JWT validator configuration:
auth: [
{
jwtValidatorConfig: {
issuer: "https://api.asgardeo.io/t/{yourorgname}/oauth2/token",
audience: ["your-client-id"],
signatureConfig: {
jwksConfig: {
url: "https://api.asgardeo.io/t/{yourorgname}/oauth2/jwks"
}
}
}
}
]
npm run dev
Frontend 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.py
News 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 - Cloud storage integration for file uploads
- JWT Authentication - Service-level JWT validation with WSO2 Asgardeo OIDC
- External HTTP Client - Integration with weather, currency, and AI APIs
- Modular Architecture - Organized service modules with proper separation of concerns