justapply 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 shreyassuman2
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,49 @@
1
- # Temporary Holding Version
1
+ # JustApply
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ See which job applications actually got a reply.
4
+
5
+ JustApply turns your tracker exports into one clean dashboard: how many applications heard back, who replied, what's still waiting, and which days you applied. It also has a notebook for online assessments, so you can see which topics keep tripping you up.
6
+
7
+ Everything runs on your own computer. Nothing is uploaded anywhere.
8
+
9
+ ## Run it
10
+
11
+ You need [Node.js](https://nodejs.org) 18 or newer.
12
+
13
+ ```bash
14
+ npx justapply
15
+ ```
16
+
17
+ That starts JustApply at `http://localhost:4545` and opens it in your browser. Press `Ctrl+C` in the terminal to stop it.
18
+
19
+ Then drop in your exports:
20
+
21
+ - **Simplify:** Tracker → Export to CSV
22
+ - **ApplyTwin:** export your applications as CSV
23
+
24
+ You can load both; duplicates are merged. Load a newer export any time and JustApply shows what's new.
25
+
26
+ Options: `npx justapply --port 4546` uses a different port, and `--no-open` skips opening the browser.
27
+
28
+ ## What it does
29
+
30
+ - **Counts only real applications.** Saved, skipped and unfinished rows are left out.
31
+ - **Merges duplicates** across both files using each posting's ID, so the same job is never counted twice.
32
+ - **Funnel:** heard back, screens, offers, rejections, and what's still waiting or ghosted (no reply after 30 days).
33
+ - **Heard back list, waiting clock, and an applying calendar.** Click a day to see what you applied to.
34
+ - **Edit statuses** for updates your tracker doesn't have yet.
35
+ - **OA notebook:** log each assessment's questions by topic and how they went, plus what went well, what went wrong and what to do next time. Weak topics rise to the top.
36
+ - **Download your applications as a clean CSV.**
37
+
38
+ ## Your data
39
+
40
+ Your data is saved in your browser, tied to `localhost:4545`, so keep using the same port. To keep it safe for the long term:
41
+
42
+ - **Auto-save to a file** (Chrome, Edge, Arc, Brave): ⋯ menu → Auto-save to a file. Put it in iCloud Drive or Dropbox and it's backed up and synced.
43
+ - **Backups:** ⋯ menu → Download backup, and Restore from backup on any machine.
44
+
45
+ In Chrome you can also click the install icon in the address bar to give JustApply its own window and Dock icon. It works offline.
46
+
47
+ ## License
48
+
49
+ MIT. Bundled libraries are listed in `vendor/LICENSES.md`.
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env node
2
+ // JustApply launcher: serves the app from this package on your own computer and opens it in your browser.
3
+ // No dependencies, nothing leaves your machine. Usage: npx justapply [--port 4545] [--no-open]
4
+ 'use strict';
5
+ const http = require('http');
6
+ const fs = require('fs');
7
+ const path = require('path');
8
+ const { exec } = require('child_process');
9
+
10
+ const ROOT = path.join(__dirname, '..');
11
+ const args = process.argv.slice(2);
12
+ if (args.includes('-h') || args.includes('--help')) {
13
+ console.log('Usage: npx justapply [--port <number>] [--no-open]\n\nStarts JustApply at http://localhost:4545 and opens it in your browser.\nKeep the same port: your browser saves your data per address.');
14
+ process.exit(0);
15
+ }
16
+ const portArg = args.indexOf('--port');
17
+ const PORT = portArg >= 0 ? Number(args[portArg + 1]) : Number(process.env.PORT) || 4545;
18
+ const OPEN = !args.includes('--no-open');
19
+ const URL_ = `http://localhost:${PORT}/`;
20
+
21
+ const TYPES = {
22
+ '.html': 'text/html; charset=utf-8', '.js': 'text/javascript; charset=utf-8', '.css': 'text/css; charset=utf-8',
23
+ '.json': 'application/json', '.webmanifest': 'application/manifest+json', '.svg': 'image/svg+xml',
24
+ '.png': 'image/png', '.ico': 'image/x-icon',
25
+ };
26
+ // Only these files are ever served.
27
+ const ALLOWED = /^\/(index\.html|manifest\.webmanifest|sw\.js|icons\/[\w.-]+|vendor\/[\w.-]+)$/;
28
+
29
+ const server = http.createServer((req, res) => {
30
+ let url;
31
+ try { url = new URL(req.url, URL_); } catch { res.writeHead(400).end(); return; }
32
+ let p = decodeURIComponent(url.pathname);
33
+ if (p === '/__justapply') { res.writeHead(200, { 'Content-Type': 'text/plain' }).end('justapply'); return; }
34
+ if (p === '/') p = '/index.html';
35
+ if (!ALLOWED.test(p)) { res.writeHead(404).end('Not found'); return; }
36
+ const file = path.join(ROOT, p);
37
+ if (!file.startsWith(ROOT + path.sep)) { res.writeHead(403).end(); return; }
38
+ fs.readFile(file, (err, data) => {
39
+ if (err) { res.writeHead(404).end('Not found'); return; }
40
+ res.writeHead(200, {
41
+ 'Content-Type': TYPES[path.extname(file)] || 'application/octet-stream',
42
+ 'Cache-Control': /index\.html|sw\.js/.test(p) ? 'no-cache' : 'public, max-age=3600',
43
+ 'X-Content-Type-Options': 'nosniff',
44
+ });
45
+ res.end(data);
46
+ });
47
+ });
48
+
49
+ function openBrowser() {
50
+ if (!OPEN) return;
51
+ const cmd = process.platform === 'darwin' ? `open "${URL_}"` : process.platform === 'win32' ? `start "" "${URL_}"` : `xdg-open "${URL_}"`;
52
+ exec(cmd, () => {});
53
+ }
54
+
55
+ server.on('error', (err) => {
56
+ if (err.code !== 'EADDRINUSE') { console.error(err.message); process.exit(1); }
57
+ // Something already has the port. If it's JustApply (another terminal), just open it.
58
+ http.get(URL_ + '__justapply', (r) => {
59
+ let body = ''; r.on('data', c => body += c); r.on('end', () => {
60
+ if (body === 'justapply') { console.log(`JustApply is already running at ${URL_}`); openBrowser(); process.exit(0); }
61
+ portBusy();
62
+ });
63
+ }).on('error', portBusy);
64
+ });
65
+ function portBusy() {
66
+ console.error(`Port ${PORT} is in use by another program. Try: npx justapply --port 4546\n(Your data is saved per address, so keep using the same port afterwards.)`);
67
+ process.exit(1);
68
+ }
69
+
70
+ server.listen(PORT, '127.0.0.1', () => {
71
+ console.log(`\n JustApply is running at ${URL_}\n\n Your data stays in this browser on this computer. Press Ctrl+C to stop.\n`);
72
+ openBrowser();
73
+ });
74
+ process.on('SIGINT', () => { console.log('\nStopped.'); process.exit(0); });
Binary file
Binary file
Binary file
package/icons/icon.svg ADDED
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><rect width="512" height="512" rx="112" fill="#f0efec"/><path d="M118 250l276-118-82 262-64-90z" fill="#141414"/><path d="M248 304l146-172-180 146z" fill="#3987e5"/><path d="M248 304l-4 82 50-52z" fill="#5b9bea"/></svg>
Binary file
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><rect width="512" height="512" fill="#f0efec"/><g transform="translate(256 256) scale(0.74) translate(-256 -256)"><path d="M118 250l276-118-82 262-64-90z" fill="#141414"/><path d="M248 304l146-172-180 146z" fill="#3987e5"/><path d="M248 304l-4 82 50-52z" fill="#5b9bea"/></g></svg>