PV
Paolo Villanueva
Aspiring Full-Stack Web Developer & Software Engineer
React
PHP
Node.js
MySQL
Python
Java
📍 Bohol, Philippines · 2 yrs exp · 10+ projects · ● Open to Work
// HeroActivity.java — Entry point of Paolo Villanueva portfolio
// Package: com.paolodev • Version: 1.0.0 • API Level: 33
package com.paolodev;
import android.app.Activity;
import android.os.Bundle;
import com.paolodev.skills.*;
import com.paolodev.projects.*;
/**
* ╔═══════════════════════════════════════════════════╗
* ║ PAOLO VILLANUEVA — WEB DEVELOPER ║
* ║ "To predict the future is to create it" ║
* ╚═══════════════════════════════════════════════════╝
* win with clean code + beautiful UI.
*/
@SuppressWarnings("HireThisDev")
public class HeroActivity extends Activity {
private final String name = "Paolo Villanueva";
private final String role = "Web Developer";
private final String location = "Bohol, Philippines 🇵🇭";
private final int yearsExp = 2;
private final int projects = 10;
private final boolean openToWork = true; // ← always true
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Every client is the hero. I'm their guide.
Log.d("HERO", "Hi. I build web apps that actually work.");
Log.d("HERO", "Clean code. Beautiful UI. Real results.");
defineProblem(); // → AboutMe.java
offerSolution(); // → AboutMe.java
setContentView(R.layout.activity_hire_me);
}
// GitHub → github.com/Pawlo7777777
// LinkedIn → linkedin.com/in/paolo-villanueva
// Email → paolovillanueva7777777@gmail.com
}
// ── Desktop: click tabs above • Mobile: use bottom nav ──
package com.paolodev;
@DeveloperProfile(yearsActive = 2, openToWork = true)
public class AboutMe implements Me {
public Problem defineProblem() {
String external = "Your business deserves a great website.
But building one is slow, expensive,
and most devs don't understand your vision.";
String internal = "You feel like you're paying for code
no one can maintain — and it still
doesn't look the way you imagined.";
String philosophical = "Great solutions are built
for impact, not just investment.";
return new Problem(external, internal, philosophical);
}
public List<String> agitate() {
return Arrays.asList(
"→ Missed deadlines from devs who overpromise",
"→ Websites that look bad on mobile",
"→ Code you can't understand or maintain",
"→ Clients who ghost after taking your money",
"→ Hours lost explaining your idea from scratch"
);
}
public Solution offerSolution() {
Guide guide = new Guide("Paolo Villanueva");
guide.setEmpathy("I've shipped 10+ apps. I know how it feels.");
guide.setAuthority("2 years building full-stack web systems.");
return guide.buildSolution("Clean, maintainable code — on time.");
}
public SkillSet getSkills() {
return SkillSet.builder()
.add("HTML / CSS / JS", 95)
.add("Tailwind CSS", 92)
.add("ReactJS", 90)
.add("MySQL / MongoDB", 88)
.add("PHP", 85)
.add("UI/UX Design", 82)
.add("Node.js / Express", 78)
.add("Java (Android)", 75)
.add("Python / NumPy / CompVis", 70)
.build();
}
private final String[] facts = {
"Fueled by 5 cups of coffee per day",
"Based in beautiful Bohol",
"IT graduate with hands-on project experience",
"Always learning — currently exploring PHP frameworks",
"10 happy clients and counting"
};
}
/* ── SKILL METERS — rendered by IDE plugin ── */
// These are the results. You could be next.
package com.paolodev;
public class Projects {
public LinkedList<Project> launchProjects() {
LinkedList<Project> portfolio = new LinkedList<>();
⬛ FuneralServicesManagement.javaWeb System
portfolio.add(new Project()
.setTitle("Funeral Services Management")
.setImpact("Real-time inventory + secure PayMongo payments")
.setStack("React", "PHP", "MySQL", "WebSocket", "PayMongo")
.setResult("Admin dashboard handling many records daily"));
⬛ HireLokal (Flutter Android)Flutter App
portfolio.add(new Project()
.setTitle("HireLokal — Local Jobs Platform")
.setImpact("Connecting Bohol freelancers with local businesses. Job posts, real-time chat, portfolio showcase.")
.setStack("Flutter (Dart)", "Firebase Auth", "Cloud Firestore", "Provider")
.setResult("In development — local job matching for Bohol freelancers"));
⬛ Barangay Bulletin App (Flutter)Flutter App
portfolio.add(new Project()
.setTitle("Barangay Bulletin — Digital Announcements")
.setImpact("Community hub for official announcements, emergency alerts, document requests, and events calendar.")
.setStack("Flutter", "Firebase Realtime DB", "Push Notifications", "PDF export")
.setResult("In development — digital announcements for Bohol communities"));
⬛ WasteDetectionManagement.pyAI / ML
portfolio.add(new Project()
.setTitle("Waste Detection Management")
.setImpact("Computer-vision waste classifier — 4 categories")
.setStack("Python", "TensorFlow", "Pandas", "NumPy")
.setResult("Automated sorting with tracking & reports"));
⬛ NSTPMonitoringApp.java (Android)Android
portfolio.add(new Project()
.setTitle("NSTP Monitoring App")
.setImpact("Native Android + Firebase real-time QR scanner")
.setStack("Java", "Firebase", "ZXing")
.setResult("Offline-capable mobile attendance companion"));
return portfolio;
}
}
// Flutter native Android apps: HireLokal (jobs) + Barangay Bulletin (civic info).
<!-- res/layout/activity_main.xml -->
<!-- Layout for Paolo's portfolio main screen -->
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/bg_dark"
tools:context=".HeroActivity">
<!-- ── Hero header card ── -->
<com.google.android.material.card.MaterialCardView
android:id="@+id/heroCard"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="16dp"
app:cardBackgroundColor="@color/surface"
app:cardCornerRadius="12dp"
app:cardElevation="4dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="20dp"
android:gravity="center_vertical">
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/avatarImage"
android:layout_width="72dp"
android:layout_height="72dp"
android:src="@drawable/paolo_avatar"
app:civ_border_color="@color/accent_blue"
app:civ_border_width="2dp" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginStart="16dp"
android:orientation="vertical">
<TextView
android:id="@+id/tvName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/dev_name"
android:textAppearance="@style/TextAppearance.Headline6"
android:textColor="@color/text_bright" />
<TextView
android:id="@+id/tvRole"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/dev_role"
android:textColor="@color/keyword_orange"
android:textSize="12sp" />
<TextView
android:id="@+id/tvOpenToWork"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:background="@drawable/badge_green"
android:text="● Open to Work"
android:textColor="@color/run_green"
android:textSize="10sp"
android:paddingHorizontal="8dp" />
</LinearLayout>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<!-- ── Bottom Navigation ── -->
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottomNav"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:menu="@menu/bottom_nav_menu"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<!-- AndroidManifest.xml -->
<!-- Declares permissions, activities, and app metadata -->
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.paolodev"
android:versionCode="1"
android:versionName="1.0.0">
<!-- ── Permissions ── -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" /> <!-- QR scanning -->
<uses-permission android:name="android.permission.VIBRATE" /> <!-- scan feedback -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<application
android:name=".PortfolioApp"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.PaoloDev.DarkIDE"
android:networkSecurityConfig="@xml/network_security_config">
<!-- ── Activities ── -->
<activity
android:name=".HeroActivity"
android:exported="true"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".AboutMe" android:exported="false" />
<activity android:name=".Projects" android:exported="false" />
<activity android:name=".ContactMe" android:exported="false" />
<!-- ── Firebase / EmailJS metadata ── -->
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="@string/default_notification_channel_id" />
<!-- ── File Provider (for sharing exports) ── -->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.paolodev.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>
</manifest>
// build.gradle (Module: app)
// Groovy DSL — Android Gradle Plugin 8.x
plugins {
id 'com.android.application'
id 'com.google.gms.google-services' // Firebase
id 'kotlin-android'
id 'kotlin-kapt'
}
android {
namespace 'com.paolodev'
compileSdk 34
defaultConfig {
applicationId "com.paolodev"
minSdk 24
targetSdk 34
versionCode 1
versionName "1.0.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
applicationIdSuffix ".debug"
versionNameSuffix "-debug"
debuggable true
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
buildFeatures {
viewBinding true
buildConfig true
}
}
dependencies {
// ── AndroidX Core ──────────────────────────────────
implementation 'androidx.core:core-ktx:1.12.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.navigation:navigation-fragment-ktx:2.7.5'
implementation 'androidx.navigation:navigation-ui-ktx:2.7.5'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2'
// ── Material Design ────────────────────────────────
implementation 'com.google.android.material:material:1.11.0'
// ── Firebase ───────────────────────────────────────
implementation platform('com.google.firebase:firebase-bom:32.7.0')
implementation 'com.google.firebase:firebase-auth-ktx'
implementation 'com.google.firebase:firebase-firestore-ktx'
implementation 'com.google.firebase:firebase-storage-ktx'
// ── Networking ─────────────────────────────────────
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0'
// ── Image Loading ──────────────────────────────────
implementation 'com.github.bumptech.glide:glide:4.16.0'
kapt 'com.github.bumptech.glide:compiler:4.16.0'
implementation 'de.hdodenhof:circleimageview:3.1.0'
// ── QR / Barcode ───────────────────────────────────
implementation 'com.journeyapps:zxing-android-embedded:4.3.0'
// ── Testing ────────────────────────────────────────
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}
// package.json — front-end workspace (React + Vite)
// Manages all web dependencies for Paolo's portfolio apps
{
"name": "paolodev-portfolio",
"version": "1.0.0",
"description": "Portfolio — Paolo Villanueva",
"author": "Paolo Villanueva <paolovillanueva7777777@gmail.com>",
"license": "MIT",
"private": true,
"scripts": {
"dev": "vite", // start dev server
"build": "vite build", // production bundle
"preview": "vite preview", // preview build
"lint": "eslint src --ext .jsx,.js",
"format": "prettier --write src/",
"test": "vitest run"
},
"dependencies": {
// ── React core ──────────────────────────────────
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-router-dom": "^6.22.0",
// ── Styling ─────────────────────────────────────
"tailwindcss": "^3.4.0",
"@headlessui/react": "^1.7.18",
"framer-motion": "^11.0.3",
// ── Networking ──────────────────────────────────
"axios": "^1.6.7",
"@emailjs/browser": "^4.3.3",
// ── QR / Utils ──────────────────────────────────
"qrcode.react": "^3.1.0",
"react-webcam": "^7.2.0",
"date-fns": "^3.3.1"
},
"devDependencies": {
"vite": "^5.1.0",
"@vitejs/plugin-react": "^4.2.1",
"eslint": "^8.57.0",
"eslint-plugin-react": "^7.33.2",
"prettier": "^3.2.5",
"vitest": "^1.3.0",
"autoprefixer": "^10.4.17",
"postcss": "^8.4.35"
},
"engines": {
"node": ">=18.0.0",
"npm": ">=9.0.0"
},
"keywords": [
"portfolio", "react", "php", "mysql",
"full-stack", "web-developer", "bohol", "philippines"
]
}
📱 Paolo Villanueva — Portfolio
● Open to Work
v1.0.0
MIT License
"To predict the future is to create it."
🚀 About
Hi, I'm Paolo Villanueva, a Web Developer based in Bohol, Philippines 🇵🇭.
I build fast, responsive web apps with clean code and beautiful UIs.
2 years of hands-on experience · 10+ shipped projects · always learning.
🛠 Tech Stack
| Layer | Technologies |
| Frontend | React Tailwind CSS HTML/CSS/JS Vite |
| Backend | PHP Node.js Express |
| Database | MySQL MongoDB Firebase |
| Mobile | Java (Android) ZXing QR |
| AI / ML | Python TensorFlow NumPy Pandas |
| Payments | PayMongo |
| Auth | OAuth 2.0 Firebase Auth |
📂 Featured Projects
1. Funeral Services Management System
Real-time inventory management with secure PayMongo payment integration.
React PHP MySQL WebSocket PayMongo
2. NSTP Attendance Monitoring (Web)
QR-code attendance tracking system serving 1,000+ students with OAuth login.
React PHP OAuth MySQL
3. Waste Detection & Management
Computer vision classifier sorting waste into 4 categories with automated reports.
Python TensorFlow Pandas NumPy
4. NSTP Monitoring App (Android)
Offline-capable native Android app with Firebase real-time sync and QR scanning.
Java Firebase ZXing
5. Restaurant Ordering System
End-to-end restaurant platform: orders, table reservations, kitchen display, payments.
React Express.js PayMongo MySQL
⚡ Quick Start
# Clone the repo
git clone https://github.com/Pawlo7777777/jagords.git
cd portfolio
# Install dependencies
npm install
# Start dev server
npm run dev
# Production build
npm run build
📬 Contact
Made with ☕ × 5 in Bohol, Philippines · © 2026 Paolo Villanueva