iad1tya 1.0.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/README.md +116 -0
- package/bin/index.js +367 -0
- package/data/about.js +41 -0
- package/data/certifications.js +32 -0
- package/data/education.js +30 -0
- package/data/projects.js +127 -0
- package/data/skills.js +52 -0
- package/data/socials.js +32 -0
- package/data/stats.js +15 -0
- package/package.json +43 -0
- package/utils/helpers.js +0 -0
- package/utils/terminal.js +76 -0
package/README.md
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# iad1tya
|
|
2
|
+
|
|
3
|
+
`iad1tya` is a production-style terminal portfolio CLI for Aditya Yadav. It launches as an interactive shell experience with a boot sequence, clean system-style prompts, project showcases, live GitHub stats, and browser-opening commands.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- Interactive terminal experience powered by Node.js and ES modules.
|
|
8
|
+
- Cross-platform support for macOS, Linux, Windows, and WSL.
|
|
9
|
+
- Project, skills, education, certification, and stats views.
|
|
10
|
+
- Live GitHub profile stats fetched with Axios.
|
|
11
|
+
- Browser commands for GitHub, LinkedIn, website, and resume.
|
|
12
|
+
- Polished output using Chalk, Boxen, Gradient String, ora, and cli-table3.
|
|
13
|
+
|
|
14
|
+
## Installation
|
|
15
|
+
|
|
16
|
+
Run the CLI without installing globally:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npx iad1tya
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
For local development in a cloned repo:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm install
|
|
26
|
+
npm link
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Usage
|
|
30
|
+
|
|
31
|
+
Start the CLI:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npx iad1tya
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
After startup, use `help` to list the available commands.
|
|
38
|
+
|
|
39
|
+
## Screenshots
|
|
40
|
+
|
|
41
|
+
Add terminal captures here after running the CLI locally. Good candidates are:
|
|
42
|
+
|
|
43
|
+
- Boot sequence and clean header
|
|
44
|
+
- `projects` output
|
|
45
|
+
- `project echomusic`
|
|
46
|
+
- `github stats`
|
|
47
|
+
- `neofetch`
|
|
48
|
+
|
|
49
|
+
## Command List
|
|
50
|
+
|
|
51
|
+
| Command | Description |
|
|
52
|
+
| --- | --- |
|
|
53
|
+
| `help` | Show every available command |
|
|
54
|
+
| `whoami` | Show the developer intro |
|
|
55
|
+
| `projects` | List all portfolio projects |
|
|
56
|
+
| `project <name>` | Show a detailed project showcase |
|
|
57
|
+
| `skills` | Show categorized skills |
|
|
58
|
+
| `stats` | Show portfolio stats and achievements |
|
|
59
|
+
| `github stats` | Fetch live GitHub profile stats |
|
|
60
|
+
| `socials` | Show clickable profile links |
|
|
61
|
+
| `education` | Show education history |
|
|
62
|
+
| `certifications` | Show certifications and credentials |
|
|
63
|
+
| `resume` | Open the resume / portfolio site |
|
|
64
|
+
| `open github` | Open the GitHub profile in your browser |
|
|
65
|
+
| `open linkedin` | Open the LinkedIn profile in your browser |
|
|
66
|
+
| `open website` | Open the portfolio website in your browser |
|
|
67
|
+
| `clear` | Clear the terminal screen |
|
|
68
|
+
| `sudo hire-aditya` | Display the access granted message |
|
|
69
|
+
| `exit` | Close the CLI |
|
|
70
|
+
|
|
71
|
+
## Publishing
|
|
72
|
+
|
|
73
|
+
The package is configured for npm publishing as a public CLI.
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
npm publish --access public
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Once published, users can run:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
npx iad1tya
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Local Development
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
npm install
|
|
89
|
+
npm run start
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Or link it locally:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
npm link
|
|
96
|
+
iad1tya
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Project Structure
|
|
100
|
+
|
|
101
|
+
```text
|
|
102
|
+
bin/index.js
|
|
103
|
+
data/about.js
|
|
104
|
+
data/projects.js
|
|
105
|
+
data/skills.js
|
|
106
|
+
data/socials.js
|
|
107
|
+
data/education.js
|
|
108
|
+
data/certifications.js
|
|
109
|
+
data/stats.js
|
|
110
|
+
utils/terminal.js
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Notes
|
|
114
|
+
|
|
115
|
+
- The CLI uses a fake shell path and fake filesystem entries to keep the terminal experience consistent.
|
|
116
|
+
- `github stats` makes a live request to the GitHub API and falls back gracefully if the request fails.
|
package/bin/index.js
ADDED
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import process from 'node:process';
|
|
4
|
+
|
|
5
|
+
import axios from 'axios';
|
|
6
|
+
import open from 'open';
|
|
7
|
+
import ora from 'ora';
|
|
8
|
+
import readlineSync from 'readline-sync';
|
|
9
|
+
|
|
10
|
+
import { aboutHighlights, profile } from '../data/about.js';
|
|
11
|
+
import { certifications } from '../data/certifications.js';
|
|
12
|
+
import { education } from '../data/education.js';
|
|
13
|
+
import { portfolioStats, achievements } from '../data/stats.js';
|
|
14
|
+
import { flatSkills, skillCategories } from '../data/skills.js';
|
|
15
|
+
import { projectLookup, projects } from '../data/projects.js';
|
|
16
|
+
import { socials } from '../data/socials.js';
|
|
17
|
+
import {
|
|
18
|
+
buildSystemInfo,
|
|
19
|
+
clearTerminal,
|
|
20
|
+
fakeDirectoryListing,
|
|
21
|
+
fakeWorkingDirectory,
|
|
22
|
+
formatBulletLines,
|
|
23
|
+
formatKeyValueLines,
|
|
24
|
+
hyperlink,
|
|
25
|
+
normalizeCommand,
|
|
26
|
+
printSection,
|
|
27
|
+
renderTable,
|
|
28
|
+
sleep,
|
|
29
|
+
} from '../utils/terminal.js';
|
|
30
|
+
|
|
31
|
+
import pkg from '../package.json' with { type: 'json' };
|
|
32
|
+
|
|
33
|
+
const APP_NAME = 'AdityaOS';
|
|
34
|
+
const APP_VERSION = pkg.version;
|
|
35
|
+
const LAST_LOGIN = new Date().toLocaleString('en-US', {
|
|
36
|
+
weekday: 'short',
|
|
37
|
+
year: 'numeric',
|
|
38
|
+
month: 'short',
|
|
39
|
+
day: 'numeric',
|
|
40
|
+
hour: '2-digit',
|
|
41
|
+
minute: '2-digit',
|
|
42
|
+
second: '2-digit',
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
const COMMANDS = [
|
|
46
|
+
['help', 'show every available command'],
|
|
47
|
+
['whoami', 'show the developer intro'],
|
|
48
|
+
['projects', 'list all portfolio projects'],
|
|
49
|
+
['project <name>', 'show a detailed project showcase'],
|
|
50
|
+
['skills', 'show categorized skills'],
|
|
51
|
+
['stats', 'show portfolio stats and achievements'],
|
|
52
|
+
['github stats', 'fetch live GitHub profile stats'],
|
|
53
|
+
['socials', 'show clickable profile links'],
|
|
54
|
+
['education', 'show education history'],
|
|
55
|
+
['certifications', 'show certifications and credentials'],
|
|
56
|
+
['resume', 'open the resume / portfolio site'],
|
|
57
|
+
['open github', 'open the GitHub profile in your browser'],
|
|
58
|
+
['open linkedin', 'open the LinkedIn profile in your browser'],
|
|
59
|
+
['open website', 'open the portfolio website in your browser'],
|
|
60
|
+
['clear', 'clear the terminal screen'],
|
|
61
|
+
['sudo hire-aditya', 'display the access granted message'],
|
|
62
|
+
['exit', 'close the CLI'],
|
|
63
|
+
];
|
|
64
|
+
|
|
65
|
+
function printWelcomeFrame() {
|
|
66
|
+
printSection(`${APP_NAME} v${APP_VERSION}`, [
|
|
67
|
+
'Minimal terminal portfolio shell',
|
|
68
|
+
'',
|
|
69
|
+
formatKeyValueLines([
|
|
70
|
+
['System ready', 'Type help to begin'],
|
|
71
|
+
['Last login', LAST_LOGIN],
|
|
72
|
+
]),
|
|
73
|
+
]);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function printHelp() {
|
|
77
|
+
console.log(renderTable(['Command', 'Description'], COMMANDS));
|
|
78
|
+
console.log('');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function printWhoAmI() {
|
|
82
|
+
const body = [
|
|
83
|
+
`${profile.name} (${profile.title})`,
|
|
84
|
+
'',
|
|
85
|
+
profile.headline,
|
|
86
|
+
'',
|
|
87
|
+
...profile.summary,
|
|
88
|
+
'',
|
|
89
|
+
'Focus',
|
|
90
|
+
formatBulletLines(profile.focus),
|
|
91
|
+
'',
|
|
92
|
+
'Highlights',
|
|
93
|
+
formatBulletLines(aboutHighlights),
|
|
94
|
+
].join('\n');
|
|
95
|
+
|
|
96
|
+
printSection('whoami', [body]);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function printProjectsList() {
|
|
100
|
+
const rows = projects.map((project) => [project.name, project.status, `${project.short} | ${project.stack.join(', ')}`]);
|
|
101
|
+
console.log(renderTable(['Project', 'Status', 'Highlights'], rows));
|
|
102
|
+
console.log('');
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function printProjectDetails(project) {
|
|
106
|
+
if (!project) {
|
|
107
|
+
printSection('error', ['Project not found. Try one of: echomusic, echotube, meow, netbar, quitty, classifier.']);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const lines = [
|
|
112
|
+
`${project.name} (${project.year})`,
|
|
113
|
+
project.status,
|
|
114
|
+
'',
|
|
115
|
+
project.summary,
|
|
116
|
+
'',
|
|
117
|
+
'Highlights',
|
|
118
|
+
formatBulletLines(project.highlights),
|
|
119
|
+
'',
|
|
120
|
+
'Stack',
|
|
121
|
+
formatBulletLines(project.stack),
|
|
122
|
+
'',
|
|
123
|
+
'Stats',
|
|
124
|
+
formatBulletLines(project.stats),
|
|
125
|
+
];
|
|
126
|
+
|
|
127
|
+
if (project.url) {
|
|
128
|
+
lines.push('', 'Link', hyperlink(project.url, project.url));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
printSection(`project ${project.slug}`, [lines.join('\n')]);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function printSkills() {
|
|
135
|
+
console.log(renderTable(['Category', 'Stack'], skillCategories.map((category) => [category.title, category.skills.join(', ')])));
|
|
136
|
+
console.log('');
|
|
137
|
+
printSection('Flat stack', [flatSkills.join(' · ')]);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function printStats() {
|
|
141
|
+
console.log(renderTable(['Metric', 'Value'], portfolioStats.map((item) => [item.label, item.value])));
|
|
142
|
+
console.log('');
|
|
143
|
+
|
|
144
|
+
printSection('Achievements', [formatBulletLines(achievements)]);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
async function printGitHubStats() {
|
|
148
|
+
const spinner = ora({
|
|
149
|
+
text: 'Fetching live GitHub profile stats',
|
|
150
|
+
}).start();
|
|
151
|
+
|
|
152
|
+
try {
|
|
153
|
+
const { data } = await axios.get('https://api.github.com/users/iad1tya', {
|
|
154
|
+
headers: {
|
|
155
|
+
Accept: 'application/vnd.github+json',
|
|
156
|
+
'User-Agent': 'iad1tya-cli',
|
|
157
|
+
'X-GitHub-Api-Version': '2022-11-28',
|
|
158
|
+
},
|
|
159
|
+
timeout: 10000,
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
spinner.succeed('GitHub stats loaded');
|
|
163
|
+
|
|
164
|
+
console.log(renderTable(['Metric', 'Value'], [
|
|
165
|
+
['Followers', String(data.followers)],
|
|
166
|
+
['Public repos', String(data.public_repos)],
|
|
167
|
+
['Following', String(data.following)],
|
|
168
|
+
]));
|
|
169
|
+
console.log('');
|
|
170
|
+
} catch (error) {
|
|
171
|
+
spinner.fail('Unable to fetch live GitHub stats');
|
|
172
|
+
printSection('GitHub stats', [`Request failed: ${error.message}`]);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function printSocials() {
|
|
177
|
+
console.log(renderTable(['Platform', 'Link'], socials.map((social) => [social.label, hyperlink(social.url, social.url)])));
|
|
178
|
+
console.log('');
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function printEducation() {
|
|
182
|
+
console.log(renderTable(['Year', 'Program', 'Details'], education.map((item) => [
|
|
183
|
+
item.year,
|
|
184
|
+
`${item.title} | ${item.institution}`,
|
|
185
|
+
[item.details, ...(item.coursework.length ? [`Coursework: ${item.coursework.join(', ')}`] : [])].join(' '),
|
|
186
|
+
])));
|
|
187
|
+
console.log('');
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function printCertifications() {
|
|
191
|
+
console.log(renderTable(['Certification', 'Issuer', 'Link'], certifications.map((cert) => [
|
|
192
|
+
cert.title,
|
|
193
|
+
cert.issuer,
|
|
194
|
+
cert.url ? hyperlink(cert.url, cert.url) : 'Not publicly linked',
|
|
195
|
+
])));
|
|
196
|
+
console.log('');
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
async function openExternal(url, label) {
|
|
200
|
+
const spinner = ora({ text: `Opening ${label}` }).start();
|
|
201
|
+
|
|
202
|
+
try {
|
|
203
|
+
await open(url);
|
|
204
|
+
spinner.succeed(`${label} opened`);
|
|
205
|
+
} catch (error) {
|
|
206
|
+
spinner.fail(`Unable to open ${label}`);
|
|
207
|
+
console.log(error.message);
|
|
208
|
+
console.log(url);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
function printPseudoFilesystem() {
|
|
213
|
+
const entries = fakeDirectoryListing();
|
|
214
|
+
console.log(`${fakeWorkingDirectory()}/`);
|
|
215
|
+
console.log(entries.map((entry) => (entry.endsWith('.pdf') ? entry : `${entry}/`)).join('\n'));
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function printNeofetch() {
|
|
219
|
+
const info = buildSystemInfo();
|
|
220
|
+
const systemBox = info.map(([label, value]) => `${label}: ${value}`).join('\n');
|
|
221
|
+
printSection('neofetch', ['aditya@adityaos', '──────────────', systemBox]);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function printAccessGranted() {
|
|
225
|
+
printSection('sudo', ['Access Granted ✅']);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
async function handleCommand(input) {
|
|
229
|
+
const command = normalizeCommand(input);
|
|
230
|
+
|
|
231
|
+
if (!command) {
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if (command === 'help') {
|
|
236
|
+
printHelp();
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
if (command === 'whoami') {
|
|
241
|
+
printWhoAmI();
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
if (command === 'projects') {
|
|
246
|
+
printProjectsList();
|
|
247
|
+
return false;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
if (command.startsWith('project ')) {
|
|
251
|
+
const slug = command.slice('project '.length).replace(/\s+/g, '');
|
|
252
|
+
printProjectDetails(projectLookup[slug]);
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (command === 'skills') {
|
|
257
|
+
printSkills();
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
if (command === 'stats') {
|
|
262
|
+
printStats();
|
|
263
|
+
return false;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
if (command === 'github stats') {
|
|
267
|
+
await printGitHubStats();
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
if (command === 'socials') {
|
|
272
|
+
printSocials();
|
|
273
|
+
return false;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
if (command === 'education') {
|
|
277
|
+
printEducation();
|
|
278
|
+
return false;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
if (command === 'certifications') {
|
|
282
|
+
printCertifications();
|
|
283
|
+
return false;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
if (command === 'resume') {
|
|
287
|
+
await openExternal(profile.links.resume, 'Resume');
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
if (command === 'open github') {
|
|
292
|
+
await openExternal(profile.links.github, 'GitHub');
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
if (command === 'open linkedin') {
|
|
297
|
+
await openExternal(profile.links.linkedin, 'LinkedIn');
|
|
298
|
+
return false;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
if (command === 'open website') {
|
|
302
|
+
await openExternal(profile.links.website, 'Website');
|
|
303
|
+
return false;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (command === 'clear') {
|
|
307
|
+
clearTerminal();
|
|
308
|
+
return false;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
if (command === 'sudo hire-aditya') {
|
|
312
|
+
printAccessGranted();
|
|
313
|
+
return false;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
if (command === 'exit') {
|
|
317
|
+
console.log('Session closed.');
|
|
318
|
+
return true;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
printSection('error', [`Unknown command: ${input.trim()}`, 'Type help to see the available commands.']);
|
|
322
|
+
return false;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
async function bootSequence() {
|
|
326
|
+
clearTerminal();
|
|
327
|
+
|
|
328
|
+
const bootSpinner = ora({ text: 'Booting AdityaOS shell' }).start();
|
|
329
|
+
await sleep(300);
|
|
330
|
+
bootSpinner.succeed('Boot sequence initialized');
|
|
331
|
+
|
|
332
|
+
const moduleSpinner = ora({ text: 'Loading portfolio modules' }).start();
|
|
333
|
+
await sleep(300);
|
|
334
|
+
moduleSpinner.succeed('Modules loaded');
|
|
335
|
+
|
|
336
|
+
const profileSpinner = ora({ text: 'Syncing portfolio metadata' }).start();
|
|
337
|
+
await sleep(250);
|
|
338
|
+
profileSpinner.succeed('Portfolio metadata ready');
|
|
339
|
+
|
|
340
|
+
printWelcomeFrame();
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
async function main() {
|
|
344
|
+
process.on('SIGINT', () => {
|
|
345
|
+
console.log('\nInterrupted. Use exit to close cleanly.');
|
|
346
|
+
process.exit(0);
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
await bootSequence();
|
|
350
|
+
|
|
351
|
+
while (true) {
|
|
352
|
+
const input = readlineSync.question('> ', {
|
|
353
|
+
limit: false,
|
|
354
|
+
keepWhitespace: false,
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
const shouldExit = await handleCommand(input);
|
|
358
|
+
if (shouldExit) {
|
|
359
|
+
break;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
main().catch((error) => {
|
|
365
|
+
console.error('Fatal error:', error);
|
|
366
|
+
process.exit(1);
|
|
367
|
+
});
|
package/data/about.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export const profile = {
|
|
2
|
+
name: 'Aditya Yadav',
|
|
3
|
+
handle: 'iad1tya',
|
|
4
|
+
title: "Android · iOS/macOS · Open Source · B.Tech CSE '27",
|
|
5
|
+
location: 'Vadodara, India',
|
|
6
|
+
headline:
|
|
7
|
+
'I build software that reaches real users, ships independently, and feels native on every platform it touches.',
|
|
8
|
+
summary: [
|
|
9
|
+
"I'm a B.Tech Computer Science student in my sixth semester at Parul University.",
|
|
10
|
+
"I work across the full product lifecycle independently: spot a gap, design a solution, build it, release it, and grow a community around it.",
|
|
11
|
+
"I care deeply about native performance and honest UX — software that does not drain your battery, spy on you, or get in your way.",
|
|
12
|
+
],
|
|
13
|
+
focus: [
|
|
14
|
+
'Android apps with strong product instincts',
|
|
15
|
+
'macOS utilities with native SwiftUI experiences',
|
|
16
|
+
'Open-source shipping, distribution, and growth',
|
|
17
|
+
'Practical AI/ML features that solve real problems',
|
|
18
|
+
],
|
|
19
|
+
links: {
|
|
20
|
+
email: 'hello@iad1tya.cyou',
|
|
21
|
+
github: 'https://github.com/iad1tya',
|
|
22
|
+
linkedin: 'https://linkedin.com/in/iad1tya',
|
|
23
|
+
website: 'https://iad1tya.cyou',
|
|
24
|
+
resume: 'https://iad1tya.cyou',
|
|
25
|
+
},
|
|
26
|
+
achievements: [
|
|
27
|
+
{ label: 'Echo Music downloads', value: '300k+' },
|
|
28
|
+
{ label: 'GitHub stars total', value: '1.2k+' },
|
|
29
|
+
{ label: 'Revenue in first 2 months', value: '$2000+' },
|
|
30
|
+
{ label: 'Releases shipped', value: '19' },
|
|
31
|
+
{ label: 'Community members', value: '4k+' },
|
|
32
|
+
{ label: 'Total repo forks', value: '36' },
|
|
33
|
+
],
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export const aboutHighlights = [
|
|
37
|
+
'Ships software that reaches real users.',
|
|
38
|
+
'Has built two paid macOS apps and an Android music client with real adoption.',
|
|
39
|
+
'Works independently from discovery to release and community growth.',
|
|
40
|
+
'Prefers native-feeling experiences over generic cross-platform templates.',
|
|
41
|
+
];
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export const certifications = [
|
|
2
|
+
{
|
|
3
|
+
title: 'Intro to Model Context Protocol (MCP)',
|
|
4
|
+
issuer: 'Anthropic',
|
|
5
|
+
url: 'https://verify.skilljar.com/c/h74fmqa8yo47',
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
title: 'AZ-900: Azure Fundamentals',
|
|
9
|
+
issuer: 'Microsoft',
|
|
10
|
+
url: null,
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
title: 'AWS Cloud Practitioner',
|
|
14
|
+
issuer: 'Amazon Web Services',
|
|
15
|
+
url: 'https://iad1tya.cyou/assets/AWSCloud.jpeg',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
title: 'OCI AI Foundations',
|
|
19
|
+
issuer: 'Oracle',
|
|
20
|
+
url: 'https://catalog-education.oracle.com/ords/certview/sharebadge?id=3F9FEE0B20EC8EDFBE90B9CACBE1DC08AF8811A8F5D44AB4F2418577D5795A91',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
title: 'AI Fundamentals with IBM SkillsBuild',
|
|
24
|
+
issuer: 'Cisco',
|
|
25
|
+
url: 'https://www.credly.com/badges/80f5e265-3a59-4d42-8653-dacf23b980dd/public_url',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
title: 'Artificial Intelligence Fundamentals',
|
|
29
|
+
issuer: 'IBM',
|
|
30
|
+
url: 'https://www.credly.com/badges/5b64370e-88f4-4bb2-bc3a-d7f518cd28c4/public_url',
|
|
31
|
+
},
|
|
32
|
+
];
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export const education = [
|
|
2
|
+
{
|
|
3
|
+
year: '2023 - 2027',
|
|
4
|
+
title: 'B.Tech Computer Science & Engineering',
|
|
5
|
+
institution: 'Parul University, Vadodara',
|
|
6
|
+
details: 'Semester VI · CGPA 6.81 · 0 backlogs · A+ in DAA Lab and Software Engineering Lab',
|
|
7
|
+
coursework: [
|
|
8
|
+
'Design and Analysis of Algorithms',
|
|
9
|
+
'Software Engineering',
|
|
10
|
+
'Theory of Computation',
|
|
11
|
+
'Enterprise Programming (Java)',
|
|
12
|
+
'Data Analytics and Visualization',
|
|
13
|
+
'AWS Fundamentals',
|
|
14
|
+
],
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
year: '2023',
|
|
18
|
+
title: 'Class 12 — ISC',
|
|
19
|
+
institution: "St. Mary's School, Bhadohi, Uttar Pradesh",
|
|
20
|
+
details: 'Schooling completed with science stream foundations.',
|
|
21
|
+
coursework: [],
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
year: '2021',
|
|
25
|
+
title: 'Class 10 — ICSE',
|
|
26
|
+
institution: "St. Mary's School, Bhadohi, Uttar Pradesh",
|
|
27
|
+
details: 'Secondary education completed.',
|
|
28
|
+
coursework: [],
|
|
29
|
+
},
|
|
30
|
+
];
|
package/data/projects.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
export const projects = [
|
|
2
|
+
{
|
|
3
|
+
slug: 'echomusic',
|
|
4
|
+
name: 'Echo Music',
|
|
5
|
+
year: '2025 - Present',
|
|
6
|
+
status: 'Open source',
|
|
7
|
+
url: 'https://echomusic.fun/',
|
|
8
|
+
short: 'Open-source Android music player with YouTube Music streaming and serious real-world traction.',
|
|
9
|
+
summary:
|
|
10
|
+
'Open-source Android music client with ad-free streaming via the YouTube Music InnerTube API, word-by-word synced lyrics, offline playback, Spotify playlist import, Discord and Last.fm scrobbling, Android Dynamic Island support, Echo Find song recognition, and AI-powered lyrics translation.',
|
|
11
|
+
highlights: [
|
|
12
|
+
'300k+ downloads',
|
|
13
|
+
'Spotify playlist import',
|
|
14
|
+
'Word-by-word synced lyrics',
|
|
15
|
+
'Offline downloads and playback',
|
|
16
|
+
'Last.fm support',
|
|
17
|
+
'AI-powered lyrics translation',
|
|
18
|
+
'Echo Find audio fingerprinting',
|
|
19
|
+
],
|
|
20
|
+
stack: ['Kotlin', 'Jetpack Compose', 'Media3', 'Firebase', 'Room DB'],
|
|
21
|
+
stats: ['300k+ downloads', '1k+ GitHub stars', '3k+ Discord community'],
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
slug: 'echotube',
|
|
25
|
+
name: 'EchoTube',
|
|
26
|
+
year: '2026 - Present',
|
|
27
|
+
status: 'Active',
|
|
28
|
+
url: 'https://echotube.fun/',
|
|
29
|
+
short: 'Privacy-first Android YouTube client with an on-device recommendation engine.',
|
|
30
|
+
summary:
|
|
31
|
+
'Privacy-first Android YouTube client with no Google account requirement and all data kept on-device. The app ships Echo Brain, a local recommendation engine that learns from watch, skip, and like signals, detects topic fatigue, prevents feed collapse, and explains every recommendation.',
|
|
32
|
+
highlights: [
|
|
33
|
+
'On-device recommendation engine',
|
|
34
|
+
'No Google account required',
|
|
35
|
+
'SponsorBlock and DeArrow support',
|
|
36
|
+
'Background playback and PiP',
|
|
37
|
+
'Chromecast support',
|
|
38
|
+
'VP9 / AV1 downloads',
|
|
39
|
+
'Gesture controls',
|
|
40
|
+
],
|
|
41
|
+
stack: ['Kotlin', 'JavaScript', 'Java', 'Jetpack Compose', 'Media3', 'Firebase'],
|
|
42
|
+
stats: ['44k+ downloads', '145 stars'],
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
slug: 'meow',
|
|
46
|
+
name: 'Meow',
|
|
47
|
+
year: '2026',
|
|
48
|
+
status: 'Paid macOS app',
|
|
49
|
+
url: 'https://meow.pixelsphere.app/',
|
|
50
|
+
short: 'macOS live wallpaper engine tuned for low CPU usage and polished native playback.',
|
|
51
|
+
summary:
|
|
52
|
+
'Closed-source paid macOS live wallpaper engine. Built to beat battery-hungry competitors, Meow maintains under 1% CPU usage during active playback through deeply optimized native rendering pipelines.',
|
|
53
|
+
highlights: [
|
|
54
|
+
'Under 1% CPU usage',
|
|
55
|
+
'Live wallpaper playback',
|
|
56
|
+
'Native macOS rendering pipeline',
|
|
57
|
+
'500+ downloads at launch',
|
|
58
|
+
'Self-published product',
|
|
59
|
+
],
|
|
60
|
+
stack: ['Swift', 'SwiftUI', 'AVFoundation', 'macOS native rendering'],
|
|
61
|
+
stats: ['500+ downloads', 'Closed source', 'Discontinued'],
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
slug: 'netbar',
|
|
65
|
+
name: 'NetBar',
|
|
66
|
+
year: '2026',
|
|
67
|
+
status: 'Paid app',
|
|
68
|
+
url: 'https://netbar.xyz/',
|
|
69
|
+
short: 'Native macOS menu bar network monitor with real-time throughput in a minimal footprint.',
|
|
70
|
+
summary:
|
|
71
|
+
'Lightweight native macOS menu bar utility that displays real-time upload and download speeds without a dashboard or unnecessary chrome. Built as a self-published product and designed to feel invisible until needed.',
|
|
72
|
+
highlights: [
|
|
73
|
+
'Real-time upload/download speeds',
|
|
74
|
+
'Menu bar first design',
|
|
75
|
+
'Native macOS utility',
|
|
76
|
+
'Self-published product',
|
|
77
|
+
'No dashboard bloat',
|
|
78
|
+
],
|
|
79
|
+
stack: ['Swift', 'SwiftUI', 'macOS networking APIs'],
|
|
80
|
+
stats: ['Paid app', 'Self-published'],
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
slug: 'quitty',
|
|
84
|
+
name: 'Quitty',
|
|
85
|
+
year: '2026',
|
|
86
|
+
status: 'Discontinued',
|
|
87
|
+
url: 'https://quitty.iad1tya.cyou/',
|
|
88
|
+
short: 'SwiftUI macOS process manager with RAM awareness and safe-list protection.',
|
|
89
|
+
summary:
|
|
90
|
+
'Native SwiftUI macOS process manager with real-time RAM monitoring, one-click process termination, memory-sorted listing, background daemon visibility, safe-list protection, and launch-at-login support.',
|
|
91
|
+
highlights: [
|
|
92
|
+
'Real-time RAM monitoring',
|
|
93
|
+
'One-click process termination',
|
|
94
|
+
'Memory-sorted process list',
|
|
95
|
+
'Background daemon visibility',
|
|
96
|
+
'Safe-list protection',
|
|
97
|
+
'Launch at login support',
|
|
98
|
+
],
|
|
99
|
+
stack: ['Swift', 'SwiftUI', 'macOS 14.6+'],
|
|
100
|
+
stats: ['Discontinued', 'Native app'],
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
slug: 'classifier',
|
|
104
|
+
name: 'Custom Image Classifier',
|
|
105
|
+
year: '2025',
|
|
106
|
+
status: 'ML platform',
|
|
107
|
+
url: null,
|
|
108
|
+
short: 'No-code CNN image trainer with GPU acceleration and structured training feedback.',
|
|
109
|
+
summary:
|
|
110
|
+
'Browser-based no-code machine learning training platform for custom CNN image classifiers. The workflow includes CUDA GPU acceleration, real-time training monitoring, auto data augmentation, checkpointing, and confidence score visualisations.',
|
|
111
|
+
highlights: [
|
|
112
|
+
'No-code image classifier training',
|
|
113
|
+
'CNN-based image training',
|
|
114
|
+
'CUDA GPU acceleration',
|
|
115
|
+
'Real-time training monitoring',
|
|
116
|
+
'Auto augmentation',
|
|
117
|
+
'Checkpointing',
|
|
118
|
+
],
|
|
119
|
+
stack: ['Python', 'PyTorch', 'Flask', 'OpenCV', 'CUDA'],
|
|
120
|
+
stats: ['Custom 3-layer CNN', 'Browser-based'],
|
|
121
|
+
},
|
|
122
|
+
];
|
|
123
|
+
|
|
124
|
+
export const projectLookup = projects.reduce((lookup, project) => {
|
|
125
|
+
lookup[project.slug] = project;
|
|
126
|
+
return lookup;
|
|
127
|
+
}, {});
|
package/data/skills.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export const skillCategories = [
|
|
2
|
+
{
|
|
3
|
+
title: 'Mobile and native',
|
|
4
|
+
skills: ['Kotlin', 'Jetpack Compose', 'Media3', 'Swift', 'SwiftUI', 'AVFoundation', 'Android', 'macOS'],
|
|
5
|
+
},
|
|
6
|
+
{
|
|
7
|
+
title: 'Languages',
|
|
8
|
+
skills: ['Python', 'JavaScript', 'Java', 'Kotlin', 'Swift'],
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
title: 'Backend and web',
|
|
12
|
+
skills: ['Next.js', 'Flask', 'Django', 'React', 'React Native', 'REST APIs'],
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
title: 'Machine learning and vision',
|
|
16
|
+
skills: ['PyTorch', 'OpenCV', 'CUDA', 'Custom CNNs'],
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
title: 'Data and services',
|
|
20
|
+
skills: ['Firebase', 'Room DB', 'MySQL', 'MongoDB'],
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
title: 'Tooling and delivery',
|
|
24
|
+
skills: ['Git', 'Open source shipping', 'Product growth', 'Self-publishing'],
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
export const flatSkills = [
|
|
29
|
+
'Kotlin',
|
|
30
|
+
'Swift / SwiftUI',
|
|
31
|
+
'Python',
|
|
32
|
+
'JavaScript',
|
|
33
|
+
'Java',
|
|
34
|
+
'Compose',
|
|
35
|
+
'Media3',
|
|
36
|
+
'AVFoundation',
|
|
37
|
+
'Firebase',
|
|
38
|
+
'Room DB',
|
|
39
|
+
'PyTorch',
|
|
40
|
+
'OpenCV',
|
|
41
|
+
'Next.js',
|
|
42
|
+
'Flask / Django',
|
|
43
|
+
'React / RN',
|
|
44
|
+
'REST APIs',
|
|
45
|
+
'MySQL',
|
|
46
|
+
'MongoDB',
|
|
47
|
+
'Git',
|
|
48
|
+
'CUDA',
|
|
49
|
+
'Android',
|
|
50
|
+
'macOS',
|
|
51
|
+
'Web',
|
|
52
|
+
];
|
package/data/socials.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export const socials = [
|
|
2
|
+
{
|
|
3
|
+
label: 'Portfolio',
|
|
4
|
+
value: 'iad1tya.cyou',
|
|
5
|
+
url: 'https://iad1tya.cyou',
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
label: 'GitHub',
|
|
9
|
+
value: 'github.com/iad1tya',
|
|
10
|
+
url: 'https://github.com/iad1tya',
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
label: 'LinkedIn',
|
|
14
|
+
value: 'linkedin.com/in/iad1tya',
|
|
15
|
+
url: 'https://linkedin.com/in/iad1tya',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
label: 'X (Twitter)',
|
|
19
|
+
value: 'twitter.com/xad1tya',
|
|
20
|
+
url: 'https://twitter.com/xad1tya',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
label: 'Instagram',
|
|
24
|
+
value: 'instagram.com/iad1tya',
|
|
25
|
+
url: 'https://instagram.com/iad1tya',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
label: 'Email',
|
|
29
|
+
value: 'hello@iad1tya.cyou',
|
|
30
|
+
url: 'mailto:hello@iad1tya.cyou',
|
|
31
|
+
},
|
|
32
|
+
];
|
package/data/stats.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const portfolioStats = [
|
|
2
|
+
{ label: 'Echo Music downloads', value: '300k+' },
|
|
3
|
+
{ label: 'GitHub stars total', value: '1.2k+' },
|
|
4
|
+
{ label: 'Revenue, first 2 months', value: '$2000+' },
|
|
5
|
+
{ label: 'Releases shipped', value: '19' },
|
|
6
|
+
{ label: 'Community members', value: '4k+' },
|
|
7
|
+
{ label: 'Total repo forks', value: '36' },
|
|
8
|
+
];
|
|
9
|
+
|
|
10
|
+
export const achievements = [
|
|
11
|
+
'Built an Android music client that crossed 300k+ downloads.',
|
|
12
|
+
'Shipped two paid macOS apps that generated $2000+ in the first two months.',
|
|
13
|
+
'Crossed 1.1k+ GitHub stars across open-source projects.',
|
|
14
|
+
'Maintains a product-first approach across Android, macOS, and ML tools.',
|
|
15
|
+
];
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "iad1tya",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Interactive terminal portfolio CLI for Aditya Yadav",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"iad1tya": "bin/index.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./bin/index.js",
|
|
10
|
+
"files": [
|
|
11
|
+
"bin",
|
|
12
|
+
"assets",
|
|
13
|
+
"data",
|
|
14
|
+
"utils",
|
|
15
|
+
"README.md"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"start": "node ./bin/index.js",
|
|
19
|
+
"dev": "node ./bin/index.js"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"cli",
|
|
23
|
+
"portfolio",
|
|
24
|
+
"terminal",
|
|
25
|
+
"aditya",
|
|
26
|
+
"iad1tya"
|
|
27
|
+
],
|
|
28
|
+
"author": "Aditya Yadav",
|
|
29
|
+
"license": "MIT",
|
|
30
|
+
"homepage": "https://iad1tya.cyou",
|
|
31
|
+
"publishConfig": {
|
|
32
|
+
"access": "public"
|
|
33
|
+
},
|
|
34
|
+
"engines": {
|
|
35
|
+
"node": ">=18.18.0"
|
|
36
|
+
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"axios": "^1.8.4",
|
|
39
|
+
"open": "^11.0.0",
|
|
40
|
+
"ora": "^9.4.0",
|
|
41
|
+
"readline-sync": "^1.4.10"
|
|
42
|
+
}
|
|
43
|
+
}
|
package/utils/helpers.js
ADDED
|
File without changes
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import os from 'node:os';
|
|
2
|
+
|
|
3
|
+
export function clearTerminal() {
|
|
4
|
+
process.stdout.write('\x1Bc');
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function sleep(ms) {
|
|
8
|
+
return new Promise((resolve) => {
|
|
9
|
+
setTimeout(resolve, ms);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function normalizeCommand(input) {
|
|
14
|
+
return input.trim().replace(/\s+/g, ' ').toLowerCase();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function hyperlink(label, url) {
|
|
18
|
+
const open = '\u001B]8;;';
|
|
19
|
+
const close = '\u001B]8;;\u0007';
|
|
20
|
+
return `${open}${url}\u0007${label}${close} (${url})`;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function printSection(title, lines = []) {
|
|
24
|
+
console.log(title);
|
|
25
|
+
if (lines.length > 0) {
|
|
26
|
+
console.log(lines.join('\n'));
|
|
27
|
+
}
|
|
28
|
+
console.log('');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function renderTable(headings, rows) {
|
|
32
|
+
const data = [headings, ...rows];
|
|
33
|
+
const widths = headings.map((heading, index) => {
|
|
34
|
+
return Math.max(
|
|
35
|
+
heading.length,
|
|
36
|
+
...rows.map((row) => String(row[index] ?? '').split('\n').reduce((max, line) => Math.max(max, line.length), 0)),
|
|
37
|
+
);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
return data
|
|
41
|
+
.map((row, rowIndex) =>
|
|
42
|
+
row
|
|
43
|
+
.map((cell, index) => String(cell ?? '').split('\n')[0].padEnd(widths[index]))
|
|
44
|
+
.join(' ')
|
|
45
|
+
.trimEnd(),
|
|
46
|
+
)
|
|
47
|
+
.join('\n');
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function formatKeyValueLines(entries) {
|
|
51
|
+
return entries.map(([label, value]) => `${label}: ${value}`).join('\n');
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function formatBulletLines(items, bullet = '•') {
|
|
55
|
+
return items.map((item) => `${bullet} ${item}`).join('\n');
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function buildSystemInfo() {
|
|
59
|
+
return [
|
|
60
|
+
['AdityaOS', 'v1.0.0'],
|
|
61
|
+
['User', 'aditya'],
|
|
62
|
+
['Host', os.hostname()],
|
|
63
|
+
['Kernel', `${os.type()} ${os.release()}`],
|
|
64
|
+
['Shell', process.env.SHELL || 'zsh'],
|
|
65
|
+
['Terminal', process.env.TERM_PROGRAM || 'terminal'],
|
|
66
|
+
['Platform', `${os.platform()} (${os.arch()})`],
|
|
67
|
+
];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function fakeWorkingDirectory() {
|
|
71
|
+
return '/home/aditya';
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function fakeDirectoryListing() {
|
|
75
|
+
return ['projects', 'skills', 'socials', 'resume.pdf'];
|
|
76
|
+
}
|