Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.md
Original file line number Diff line number Diff line change
@@ -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


23 changes: 23 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.md
Original file line number Diff line number Diff line change
@@ -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


16 changes: 16 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
## Summary

-

## Changes

-

## Testing

- [ ] `npm run typecheck`
- [ ] `npm test`

## Notes

-
29 changes: 29 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -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
31 changes: 31 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -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
```
21 changes: 21 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -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.
151 changes: 125 additions & 26 deletions README.md
Original file line number Diff line number Diff line change
@@ -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

Expand All @@ -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.
26 changes: 26 additions & 0 deletions SECURITY.md
Original file line number Diff line number Diff line change
@@ -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.
Loading
Loading