From 4ff0c79c68276bdbd52931300f22e83285e7523e Mon Sep 17 00:00:00 2001 From: Russell Nizamov Date: Mon, 18 May 2026 16:16:50 -0700 Subject: [PATCH] chore: add project documentation, templates, and CI configuration --- .github/ISSUE_TEMPLATE/bug_report.md | 32 +++++ .github/ISSUE_TEMPLATE/feature_request.md | 23 ++++ .github/pull_request_template.md | 16 +++ .github/workflows/ci.yml | 29 +++++ CONTRIBUTING.md | 31 +++++ LICENSE | 21 +++ README.md | 151 ++++++++++++++++++---- SECURITY.md | 26 ++++ docs/portfolio.md | 69 ++++++++++ docs/screenshots/.gitkeep | 1 + 10 files changed, 373 insertions(+), 26 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/ci.yml create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 SECURITY.md create mode 100644 docs/portfolio.md create mode 100644 docs/screenshots/.gitkeep diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..5e0483f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,32 @@ +--- +name: Bug report +about: Report a reproducible problem in JobOps +title: "Bug: " +labels: bug +assignees: "" +--- + +## Description + + +## Steps To Reproduce + +1. +2. +3. + +## Expected Behavior + + +## Actual Behavior + + +## Environment + +- Platform: +- Node version: +- Expo version: + +## Additional Context + + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..02e00ca --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,23 @@ +--- +name: Feature request +about: Suggest an improvement for the local-first job-search workflow +title: "Feature: " +labels: enhancement +assignees: "" +--- + +## Problem + + +## Proposed Solution + + +## Scope + +- [ ] Keeps data local-first +- [ ] Does not require accounts, cloud sync, analytics, scraping, paid APIs, external AI services, or a backend +- [ ] Fits job-search operations, resume tracking, follow-ups, backups, or dashboard workflows + +## Additional Context + + diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..48dfbdf --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,16 @@ +## Summary + +- + +## Changes + +- + +## Testing + +- [ ] `npm run typecheck` +- [ ] `npm test` + +## Notes + +- diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..8a2dcb4 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +name: CI + +on: + push: + pull_request: + +jobs: + test: + name: Typecheck and test + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Typecheck + run: npm run typecheck + + - name: Test + run: npm test diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..e2bdc58 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,31 @@ +# Contributing + +Thanks for your interest in JobOps. + +This is a portfolio project, so contributions should stay focused on the current scope: local-first job-search tracking, resume version tracking, follow-up workflows, backup import/export, and privacy-aware design. + +## Local Setup + +Use Node.js 20.19.4 or newer. + +```bash +npm install +npm run typecheck +npm test +``` + +## Guidelines + +- Keep changes small and focused. +- Do not add backend services, cloud sync, analytics, scraping, authentication, paid APIs, or external AI services. +- Update tests when changing parsing, persistence, backup, recommendation, or screen behavior. +- Keep README and portfolio copy aligned with features that exist in the code. + +## Pull Requests + +Before opening a pull request, run: + +```bash +npm run typecheck +npm test +``` diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..391dfc9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 neezzzy + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 32b5c56..df5518e 100644 --- a/README.md +++ b/README.md @@ -1,53 +1,111 @@ # JobOps -JobOps is a local-first Expo app for tracking job applications, resume versions, follow-ups, notes, and job posting details. It keeps job search work organized on the device without accounts, cloud sync, analytics, or external AI services. +Track your job search like an operations pipeline. -## Setup +JobOps is a local-first Expo, React Native, and TypeScript app for organizing job applications, resume versions, follow-ups, notes, and job posting details without accounts, cloud sync, analytics, scraping, external AI services, paid APIs, or a backend. -Use Node.js 20.19.4 or newer. +## Overview -```bash -npm install -npm run web -``` +JobOps treats a job search as an operational workflow instead of a loose set of notes. It gives applicants a structured place to track opportunities, monitor application status, manage resume versions, plan follow-ups, and preserve job posting details locally on their device. -Useful commands: +The project is designed as a practical portfolio example for workflow systems, privacy-aware local tools, and lightweight operational dashboards. -```bash -npm run android -npm run ios -npm run typecheck -npm test -``` +## Problem + +Job searches often spread across browser tabs, spreadsheets, resumes, calendar reminders, saved job descriptions, and scattered notes. That makes it easy to lose context, miss follow-ups, reuse the wrong resume version, or forget what was submitted for a specific role. + +Many tools also assume accounts, cloud sync, analytics, or backend services. For a personal job-search tracker, a local-first model can be a better fit. + +## Solution -## Features +JobOps provides a structured local workspace for job-search operations: -- Clickable dashboard with application totals, status counts, follow-ups, recent jobs, and practical recommendations. -- Job board grouped by status with search and quick status changes. -- Create, edit, delete, and review applications with saved status history. -- Resume versions with TXT/PDF document attachment through the device file manager. -- TXT resume uploads can fill basic resume fields from the file content; PDF uploads save file details for reference. +- Track each application through a status pipeline. +- Save job posting details, notes, role highlights, requirements, salary text, and work mode. +- Attach resume document metadata and track resume versions. +- Create and complete follow-up reminders. +- Export and import backups from Settings. +- Review dashboard totals, status counts, recent jobs, follow-ups, and recommendations. + +## Key Features + +- Dashboard with application totals, status counts, follow-ups, recent jobs, and practical recommendations. +- Job board grouped by application status with search and quick status changes. +- Application create, edit, delete, and detail screens with saved status history. +- Resume version tracking with TXT/PDF document attachment through the device file manager. +- TXT resume uploads can fill basic resume fields from file content; PDF uploads save file details for reference. - Follow-up reminders with date editing and completion. - Local job description helper for role highlights, salary text, work mode, and requirements. - Plain-language backup export/import from Settings. - Optional demo data for trying the app quickly. - Light and dark mode through the device color scheme. -## Project Structure +## Tech Stack + +- Expo +- React Native +- TypeScript +- Expo Router +- SQLite through `expo-sqlite` +- Jest and Testing Library for React Native + +## Local-First Privacy + +JobOps stores structured data locally in `jobops.db` through `expo-sqlite`. Resume document references are stored as local file metadata. + +The app does not use: + +- Accounts or authentication +- Cloud sync +- Analytics or tracking +- Job scraping +- External AI APIs +- Paid APIs +- A backend service + +Backups are exported and imported from Settings using a plain backup file format. The app keeps the format compatible internally while avoiding technical wording in the user interface. + +## Architecture / Project Structure - `app/`: Expo Router routes and tab navigation. -- `src/screens/`: Screen-level UI. -- `src/components/`: Shared UI components and theme. +- `src/screens/`: Screen-level UI for dashboard, jobs, applications, resumes, reminders, and settings. +- `src/components/`: Shared UI components and theme primitives. - `src/db/`: SQLite schema, migrations, and database access. - `src/services/`: Import/export, parsing, recommendations, seed data, and document helpers. - `src/types/`: Shared TypeScript types. - `src/utils/`: Small reusable utilities. +- `assets/`: App icons, splash assets, and fonts. -## Data and Privacy +## Screenshots -JobOps stores structured data locally in `jobops.db` through `expo-sqlite`. Resume document references are stored as local file metadata. The app does not use accounts, authentication, tracking, scraping, cloud sync, paid APIs, external AI APIs, or a backend. +Screenshots can be added here after the UI is finalized. -Backups are exported and imported from Settings using a plain backup file format. The app keeps the format compatible internally while avoiding technical wording in the user interface. +| Screen | Placeholder | +| --- | --- | +| Dashboard | Add screenshot to `docs/screenshots/dashboard.png` | +| Job Board | Add screenshot to `docs/screenshots/job-board.png` | +| Application Detail | Add screenshot to `docs/screenshots/application-detail.png` | +| Resume Versions | Add screenshot to `docs/screenshots/resume-versions.png` | +| Settings / Backup | Add screenshot to `docs/screenshots/settings-backup.png` | + +## Setup + +Use Node.js 20.19.4 or newer. + +```bash +npm install +npm run web +``` + +## Useful Commands + +```bash +npm run android +npm run ios +npm run web +npm run typecheck +npm test +``` ## Testing @@ -59,3 +117,44 @@ npm test ``` Tests cover parsing helpers, recommendations, backup validation, utility behavior, and key screen rendering. + +## Portfolio Case Study + +### Problem + +Job applications involve many small operational details: application status, follow-up timing, resume versions, saved posting context, and notes from each opportunity. Without a focused workflow, those details can become fragmented across tools. + +### Solution + +JobOps brings those details into one local app organized around an application pipeline. The dashboard summarizes activity, the job board groups applications by status, detail screens preserve context, and reminders keep follow-ups visible. + +### Technical Approach + +The app uses Expo Router for navigation, React Native components for cross-platform UI, TypeScript types for application and resume data, and SQLite persistence through `expo-sqlite`. Services handle import/export, document picking, resume parsing, job posting parsing, recommendations, and seed data. Tests focus on core helpers, backup validation, utility behavior, and important screen rendering paths. + +### Impact + +JobOps demonstrates how a small local-first application can support a real workflow without requiring user accounts, backend infrastructure, cloud sync, external AI services, or scraping. It presents job-search tracking as a practical operations system with clear data ownership. + +### Future Improvements + +- Add finalized screenshots for the public README. +- Expand test coverage around more application editing and reminder flows. +- Add more backup validation cases as the data model grows. +- Improve accessibility review across forms and dashboard cards. +- Add optional notification scheduling if supported by the target platform setup. + +## Roadmap + +- Finalize screenshot assets for portfolio presentation. +- Continue strengthening tests for key user flows. +- Refine dashboard recommendations as more workflow states are added. +- Keep backup import/export compatible as the schema evolves. +- Review mobile accessibility and keyboard behavior. + +## Notes for Reviewers + +- This is a portfolio project focused on local-first workflow design. +- The app intentionally avoids accounts, authentication, cloud sync, analytics, scraping, external AI APIs, paid APIs, and backend services. +- Demo data is optional and intended only to make the app easier to explore. +- The repository includes CI for typechecking and tests, but no deployment workflow. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..0a8b292 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,26 @@ +# Security + +JobOps is a portfolio project for a local-first Expo and React Native app. It does not use accounts, authentication, backend services, cloud sync, analytics, scraping, paid APIs, or external AI services. + +## Reporting Issues + +If you find a security or privacy issue, please do not open a public issue with sensitive details. + +Report it by contacting the repository owner through GitHub. Include: + +- A short description of the issue. +- Steps to reproduce, if available. +- Any affected files or flows. +- Whether local user data could be exposed, modified, or lost. + +## Scope + +Relevant reports include: + +- Local data exposure risks. +- Backup import/export validation issues. +- Unsafe file handling. +- Dependency security concerns. +- Misleading privacy behavior compared with the README. + +This project does not run a hosted service, so server-side availability, account takeover, and cloud infrastructure reports are out of scope. diff --git a/docs/portfolio.md b/docs/portfolio.md new file mode 100644 index 0000000..e9169f5 --- /dev/null +++ b/docs/portfolio.md @@ -0,0 +1,69 @@ +# JobOps Portfolio Metadata + +## Portfolio Card Title + +JobOps + +## One-Line Subtitle + +Track your job search like an operations pipeline. + +## Short Project Description + +JobOps is a local-first Expo, React Native, and TypeScript app for tracking job applications, resume versions, follow-ups, notes, job posting details, and backup files without accounts, cloud sync, analytics, scraping, external AI services, paid APIs, or a backend. + +## Tech Stack + +- Expo +- React Native +- TypeScript +- Expo Router +- SQLite through `expo-sqlite` +- Jest +- Testing Library for React Native + +## Skills Demonstrated + +- Business workflow design +- Local-first application architecture +- SQLite data modeling and migrations +- Operational dashboard design +- Resume and job posting data organization +- Backup export/import workflows +- Privacy-aware product decisions +- TypeScript application structure +- React Native screen and component development +- Automated tests for services and screens + +## Case Study Copy + +### Problem + +Job seekers often manage applications across spreadsheets, browser tabs, notes, calendar reminders, and multiple resume files. That creates operational friction and makes it harder to track status, follow-ups, resume versions, and saved job posting context. + +### Solution + +JobOps organizes the job search as a local operations pipeline. Applications are grouped by status, follow-ups are tracked as workflow items, resume versions are saved with document metadata, and job posting details can be preserved for review. + +### Technical Approach + +The app uses Expo Router, React Native, TypeScript, and local SQLite persistence through `expo-sqlite`. The codebase separates screen UI, shared components, database access, migrations, services, types, and utilities. Services handle parsing helpers, recommendations, backup import/export, seed data, and document handling. + +### Impact + +JobOps demonstrates a practical local-first workflow tool that keeps personal job-search data on the device. It shows how operational dashboards and structured workflows can be applied to an everyday business process without relying on accounts, cloud sync, scraping, external AI APIs, paid APIs, or backend infrastructure. + +### Future Improvements + +- Add finalized screenshots to the README and portfolio page. +- Expand tests around application editing and reminder workflows. +- Continue improving backup validation as the schema evolves. +- Review accessibility across forms, buttons, dashboard cards, and list views. + +## GitHub Repo Description Suggestion + +Local-first job search operations app for tracking applications, resume versions, follow-ups, and backups. + +## GitHub Topics Suggestion + +expo, react-native, typescript, sqlite, job-search, local-first, productivity, portfolio-project, workflow-tools diff --git a/docs/screenshots/.gitkeep b/docs/screenshots/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/docs/screenshots/.gitkeep @@ -0,0 +1 @@ +