Sifa professional network API (Fastify, AT Protocol, Jetstream)
sifa.id/
1import 'dotenv/config';
2import { createDb, type Database } from '../src/db/index.js';
3import { canonicalSkills, unresolvedSkills } from '../src/db/schema/index.js';
4import { normalizeSkillName, createSlug } from '../src/services/skill-normalization.js';
5import { isNull, sql } from 'drizzle-orm';
6import { logger } from '../src/logger.js';
7
8interface SkillSeed {
9 canonicalName: string;
10 slug: string;
11 category: string;
12 aliases: string[];
13 wikidataId?: string;
14}
15
16const SKILLS: SkillSeed[] = [
17 // ──────────────────────────────────────────────────
18 // Technical
19 // ──────────────────────────────────────────────────
20 {
21 canonicalName: '.NET Framework',
22 slug: 'dot-net-framework',
23 category: 'technical',
24 aliases: ['.net', 'dot-net', '.net framework', '.net core', 'asp.net core', 'asp.net mvc'],
25 },
26 {
27 canonicalName: '3D Visualization',
28 slug: '3d-visualization',
29 category: 'technical',
30 aliases: ['3dexperience'],
31 },
32 {
33 canonicalName: 'ABAP',
34 slug: 'abap',
35 category: 'technical',
36 aliases: ['abap-oo', 'sap abap'],
37 },
38 {
39 canonicalName: 'AJAX',
40 slug: 'ajax',
41 category: 'technical',
42 aliases: ['async', 'asynchronous work'],
43 },
44 {
45 canonicalName: 'AT Protocol',
46 slug: 'at-protocol',
47 category: 'technical',
48 aliases: ['atproto', 'at protocol', 'authenticated transfer protocol'],
49 },
50 {
51 canonicalName: 'AWS',
52 slug: 'aws',
53 category: 'technical',
54 aliases: ['amazon web services', 'amazon aws', 'amazon web services (aws)'],
55 wikidataId: 'Q456157',
56 },
57 {
58 canonicalName: 'Accessibility',
59 slug: 'accessibility',
60 category: 'technical',
61 aliases: [
62 'a11y',
63 'wcag',
64 'web accessibility',
65 'accessibility (a11y)',
66 'app accessibility',
67 'it accessibility',
68 'web content accessibility guidelines (wcag)',
69 ],
70 },
71 {
72 canonicalName: 'ActionScript',
73 slug: 'actionscript',
74 category: 'technical',
75 aliases: ['flash', 'actionscript 3'],
76 },
77 {
78 canonicalName: 'ActivityPub',
79 slug: 'activitypub',
80 category: 'technical',
81 aliases: ['fediverse'],
82 },
83 {
84 canonicalName: 'Adonis.js',
85 slug: 'adonis-js',
86 category: 'technical',
87 aliases: ['adonisjs'],
88 },
89 {
90 canonicalName: 'Advanced Custom Fields',
91 slug: 'acf',
92 category: 'technical',
93 aliases: ['advanced custom fields (acf)'],
94 },
95 {
96 canonicalName: 'Android Development',
97 slug: 'android-development',
98 category: 'technical',
99 aliases: ['android studio', 'android app development', 'jetpack compose'],
100 },
101 {
102 canonicalName: 'Angular',
103 slug: 'angular',
104 category: 'technical',
105 aliases: ['angularjs', 'angular2'],
106 wikidataId: 'Q28925578',
107 },
108 {
109 canonicalName: 'Apache',
110 slug: 'apache',
111 category: 'technical',
112 aliases: ['apache http server'],
113 },
114 {
115 canonicalName: 'Apache Kafka',
116 slug: 'apache-kafka',
117 category: 'technical',
118 aliases: ['kafka'],
119 },
120 {
121 canonicalName: 'Arduino',
122 slug: 'arduino',
123 category: 'technical',
124 aliases: ['arduino programming'],
125 wikidataId: 'Q2029106',
126 },
127 {
128 canonicalName: 'Artificial Intelligence',
129 slug: 'artificial-intelligence',
130 category: 'technical',
131 aliases: ['artificial intelligence (ai)'],
132 },
133 {
134 canonicalName: 'Assembly',
135 slug: 'assembly',
136 category: 'technical',
137 aliases: ['asm', 'assembly language'],
138 },
139 {
140 canonicalName: 'Augmented Reality',
141 slug: 'augmented-reality',
142 category: 'technical',
143 aliases: ['ar', 'augmented reality (ar)', 'mixed reality'],
144 },
145 {
146 canonicalName: 'Automation',
147 slug: 'automation',
148 category: 'technical',
149 aliases: ['business process automation'],
150 },
151 {
152 canonicalName: 'Blockchain',
153 slug: 'blockchain',
154 category: 'technical',
155 aliases: ['web3', 'non-fungible tokens (nfts)', 'peer-to-peer'],
156 },
157 {
158 canonicalName: 'C',
159 slug: 'c',
160 category: 'technical',
161 aliases: ['c (programming language)'],
162 wikidataId: 'Q15777',
163 },
164 {
165 canonicalName: 'C#',
166 slug: 'c-sharp',
167 category: 'technical',
168 aliases: ['csharp', 'c sharp', 'dotnet'],
169 wikidataId: 'Q2370',
170 },
171 {
172 canonicalName: 'C++',
173 slug: 'c-plus-plus',
174 category: 'technical',
175 aliases: ['cpp'],
176 wikidataId: 'Q2407',
177 },
178 {
179 canonicalName: 'CAD',
180 slug: 'cad',
181 category: 'technical',
182 aliases: [
183 'computer-aided design',
184 'computer-aided design (cad)',
185 'autocad',
186 'autodesk fusion 360',
187 'onshape',
188 ],
189 },
190 {
191 canonicalName: 'CI/CD',
192 slug: 'ci-cd',
193 category: 'technical',
194 aliases: ['continuous integration', 'continuous deployment', 'github actions'],
195 },
196 {
197 canonicalName: 'CSS',
198 slug: 'css',
199 category: 'technical',
200 aliases: ['css3', 'cascading style sheets', 'bootstrap'],
201 wikidataId: 'Q46441',
202 },
203 {
204 canonicalName: 'ChromeOS',
205 slug: 'chromeos',
206 category: 'technical',
207 aliases: ['chrome os'],
208 },
209 {
210 canonicalName: 'Cloud Computing',
211 slug: 'cloud-computing',
212 category: 'technical',
213 aliases: ['cloud infrastructure'],
214 },
215 {
216 canonicalName: 'Cloudflare',
217 slug: 'cloudflare',
218 category: 'technical',
219 aliases: ['cloudflare workers'],
220 },
221 {
222 canonicalName: 'Computer Vision',
223 slug: 'computer-vision',
224 category: 'technical',
225 aliases: ['image recognition', 'object detection', 'pattern recognition'],
226 },
227 {
228 canonicalName: 'Concurrency',
229 slug: 'concurrency',
230 category: 'technical',
231 aliases: ['multithreading', 'multiprocessing'],
232 },
233 {
234 canonicalName: 'CouchDB',
235 slug: 'couchdb',
236 category: 'technical',
237 aliases: ['couchdb'],
238 },
239 {
240 canonicalName: 'Cryptography',
241 slug: 'cryptography',
242 category: 'technical',
243 aliases: ['encryption', 'public key infrastructure'],
244 },
245 {
246 canonicalName: 'D3.js',
247 slug: 'd3-js',
248 category: 'technical',
249 aliases: ['d3'],
250 },
251 {
252 canonicalName: 'Data Integrity',
253 slug: 'data-integrity',
254 category: 'technical',
255 aliases: ['data quality', 'data governance', 'data management'],
256 },
257 {
258 canonicalName: 'Data Science',
259 slug: 'data-science',
260 category: 'technical',
261 aliases: ['data analysis', 'data analytics', 'data engineering'],
262 },
263 {
264 canonicalName: 'Databases',
265 slug: 'databases',
266 category: 'technical',
267 aliases: [
268 'database administration',
269 'database troubleshooting',
270 'database management',
271 'relational databases',
272 'orm',
273 ],
274 },
275 {
276 canonicalName: 'Decentralized Identity',
277 slug: 'decentralized-identity',
278 category: 'technical',
279 aliases: [
280 'openid for verifiable credentials',
281 'openid for verifiable presentations',
282 'presentation exchange',
283 ],
284 },
285 {
286 canonicalName: 'Deno',
287 slug: 'deno',
288 category: 'technical',
289 aliases: ['deno runtime'],
290 },
291 {
292 canonicalName: 'DevOps',
293 slug: 'devops',
294 category: 'technical',
295 aliases: ['site reliability engineering', 'platform engineering', 'devx'],
296 },
297 {
298 canonicalName: 'Django',
299 slug: 'django',
300 category: 'technical',
301 aliases: ['django rest framework'],
302 wikidataId: 'Q170584',
303 },
304 {
305 canonicalName: 'Docker',
306 slug: 'docker',
307 category: 'technical',
308 aliases: ['containers', 'containerization', 'docker products'],
309 wikidataId: 'Q15206305',
310 },
311 {
312 canonicalName: 'Dreamweaver',
313 slug: 'dreamweaver',
314 category: 'technical',
315 aliases: ['adobe dreamweaver'],
316 },
317 {
318 canonicalName: 'Drupal',
319 slug: 'drupal',
320 category: 'technical',
321 aliases: ['drupal cms'],
322 },
323 {
324 canonicalName: 'ETL',
325 slug: 'etl',
326 category: 'technical',
327 aliases: ['extract, transform, load (etl)', 'datastage'],
328 },
329 {
330 canonicalName: 'Elasticsearch',
331 slug: 'elasticsearch',
332 category: 'technical',
333 aliases: ['elastic', 'elk stack'],
334 },
335 {
336 canonicalName: 'Electron',
337 slug: 'electron',
338 category: 'technical',
339 aliases: ['electron.js', 'electronjs'],
340 },
341 {
342 canonicalName: 'Embedded Systems',
343 slug: 'embedded-systems',
344 category: 'technical',
345 aliases: ['yocto', 'embedded c++'],
346 },
347 {
348 canonicalName: 'Express.js',
349 slug: 'express-js',
350 category: 'technical',
351 aliases: ['expressjs'],
352 },
353 {
354 canonicalName: 'FastAPI',
355 slug: 'fastapi',
356 category: 'technical',
357 aliases: ['fast api'],
358 },
359 {
360 canonicalName: 'Figma',
361 slug: 'figma',
362 category: 'technical',
363 aliases: ['figma (software)'],
364 },
365 {
366 canonicalName: 'Firebase',
367 slug: 'firebase',
368 category: 'technical',
369 aliases: ['google firebase'],
370 },
371 {
372 canonicalName: 'Flutter',
373 slug: 'flutter',
374 category: 'technical',
375 aliases: ['flutter sdk', 'flutter development'],
376 },
377 {
378 canonicalName: 'Forgejo',
379 slug: 'forgejo',
380 category: 'technical',
381 aliases: ['forgejo git'],
382 },
383 {
384 canonicalName: 'Functional Programming',
385 slug: 'functional-programming',
386 category: 'technical',
387 aliases: ['fp', 'programmation fonctionnelle'],
388 },
389 {
390 canonicalName: 'Generative AI',
391 slug: 'generative-ai',
392 category: 'technical',
393 aliases: [
394 'gen ai',
395 'llm',
396 'large language models',
397 'ai building',
398 'generative ai for cybersecurity',
399 'ai development',
400 'ai code generation',
401 ],
402 },
403 {
404 canonicalName: 'Git',
405 slug: 'git',
406 category: 'technical',
407 aliases: ['version control', 'github', 'gitlab', 'monorepo'],
408 wikidataId: 'Q186055',
409 },
410 {
411 canonicalName: 'Go',
412 slug: 'go',
413 category: 'technical',
414 aliases: ['golang', 'go (programming language)'],
415 wikidataId: 'Q37227',
416 },
417 {
418 canonicalName: 'Google Cloud',
419 slug: 'google-cloud',
420 category: 'technical',
421 aliases: ['gcp', 'google cloud platform', 'google cloud platform (gcp)'],
422 wikidataId: 'Q21048343',
423 },
424 {
425 canonicalName: 'Google Workspace',
426 slug: 'google-workspace',
427 category: 'technical',
428 aliases: ['google apps', 'g suite'],
429 },
430 {
431 canonicalName: 'GraphQL',
432 slug: 'graphql',
433 category: 'technical',
434 aliases: ['gql', 'apollo graphql'],
435 wikidataId: 'Q25104949',
436 },
437 {
438 canonicalName: 'HTML',
439 slug: 'html',
440 category: 'technical',
441 aliases: ['html5', 'html 5', 'xhtml', 'semantic markup'],
442 wikidataId: 'Q8811',
443 },
444 {
445 canonicalName: 'Hardware Management',
446 slug: 'hardware-management',
447 category: 'technical',
448 aliases: [
449 'hardware compatibility testing',
450 'hardware and software lifecycle management',
451 'hardware lifecycle',
452 'it asset management',
453 'computer hardware troubleshooting',
454 'computer hardware',
455 ],
456 },
457 {
458 canonicalName: 'Hono',
459 slug: 'hono',
460 category: 'technical',
461 aliases: ['hono framework'],
462 },
463 {
464 canonicalName: 'Industrial Automation',
465 slug: 'industrial-automation',
466 category: 'technical',
467 aliases: ['automation engineering', 'plc programming'],
468 },
469 {
470 canonicalName: 'Internet of Things',
471 slug: 'internet-of-things',
472 category: 'technical',
473 aliases: [
474 'iot',
475 'internet of things (iot)',
476 'internet of vehicles (iov)',
477 'home automation',
478 'smart home',
479 ],
480 },
481 {
482 canonicalName: 'JIRA',
483 slug: 'jira',
484 category: 'technical',
485 aliases: ['jira software', 'atlassian jira'],
486 },
487 {
488 canonicalName: 'JSON',
489 slug: 'json',
490 category: 'technical',
491 aliases: ['json format'],
492 },
493 {
494 canonicalName: 'Java',
495 slug: 'java',
496 category: 'technical',
497 aliases: ['java se', 'java ee', 'java enterprise edition'],
498 wikidataId: 'Q251',
499 },
500 {
501 canonicalName: 'JavaScript',
502 slug: 'javascript',
503 category: 'technical',
504 aliases: ['js', 'ecmascript', 'es6'],
505 wikidataId: 'Q2005',
506 },
507 {
508 canonicalName: 'Joomla',
509 slug: 'joomla',
510 category: 'technical',
511 aliases: ['joomla cms'],
512 },
513 {
514 canonicalName: 'Julia',
515 slug: 'julia',
516 category: 'technical',
517 aliases: ['julia (programming language)'],
518 },
519 {
520 canonicalName: 'Jupyter',
521 slug: 'jupyter',
522 category: 'technical',
523 aliases: ['jupyter notebooks', 'jupyter lab'],
524 },
525 {
526 canonicalName: 'KeyShot',
527 slug: 'keyshot',
528 category: 'technical',
529 aliases: ['keyshot rendering'],
530 },
531 {
532 canonicalName: 'Kotlin',
533 slug: 'kotlin',
534 category: 'technical',
535 aliases: ['kt'],
536 wikidataId: 'Q3816023',
537 },
538 {
539 canonicalName: 'Kubernetes',
540 slug: 'kubernetes',
541 category: 'technical',
542 aliases: ['k8s'],
543 wikidataId: 'Q22661306',
544 },
545 {
546 canonicalName: 'LaTeX',
547 slug: 'latex',
548 category: 'technical',
549 aliases: ['latex typesetting'],
550 wikidataId: 'Q5310',
551 },
552 {
553 canonicalName: 'Laravel',
554 slug: 'laravel',
555 category: 'technical',
556 aliases: ['laravel framework'],
557 },
558 {
559 canonicalName: 'Linux',
560 slug: 'linux',
561 category: 'technical',
562 aliases: ['linux administration', 'unix', 'linux system administration', 'linux & bash'],
563 wikidataId: 'Q388',
564 },
565 {
566 canonicalName: 'MATLAB',
567 slug: 'matlab',
568 category: 'technical',
569 aliases: ['matlab simulink'],
570 },
571 {
572 canonicalName: 'Machine Learning',
573 slug: 'machine-learning',
574 category: 'technical',
575 aliases: ['ml', 'deep learning'],
576 wikidataId: 'Q2539',
577 },
578 {
579 canonicalName: 'Magento',
580 slug: 'magento',
581 category: 'technical',
582 aliases: ['adobe commerce', 'magento ecommerce', 'magento 2'],
583 },
584 {
585 canonicalName: 'Microservices',
586 slug: 'microservices',
587 category: 'technical',
588 aliases: ['microservice architecture'],
589 },
590 {
591 canonicalName: 'Microsoft Azure',
592 slug: 'microsoft-azure',
593 category: 'technical',
594 aliases: ['azure'],
595 wikidataId: 'Q725967',
596 },
597 {
598 canonicalName: 'Microsoft Excel',
599 slug: 'microsoft-excel',
600 category: 'technical',
601 aliases: ['excel', 'ms excel'],
602 },
603 {
604 canonicalName: 'Microsoft Office',
605 slug: 'microsoft-office',
606 category: 'technical',
607 aliases: ['microsoft 365', 'ms office', 'microsoft word', 'microsoft access'],
608 },
609 {
610 canonicalName: 'Microsoft SQL Server',
611 slug: 'microsoft-sql-server',
612 category: 'technical',
613 aliases: ['mssql', 'sql server'],
614 },
615 {
616 canonicalName: 'Mobile Application Development',
617 slug: 'mobile-app-development',
618 category: 'technical',
619 aliases: ['mobile applications', 'mobile platforms', 'mobile application development'],
620 },
621 {
622 canonicalName: 'MongoDB',
623 slug: 'mongodb',
624 category: 'technical',
625 aliases: ['mongo'],
626 wikidataId: 'Q1165204',
627 },
628 {
629 canonicalName: 'MySQL',
630 slug: 'mysql',
631 category: 'technical',
632 aliases: ['mariadb'],
633 wikidataId: 'Q850',
634 },
635 {
636 canonicalName: 'NestJS',
637 slug: 'nestjs',
638 category: 'technical',
639 aliases: ['nest.js'],
640 },
641 {
642 canonicalName: 'Next.js',
643 slug: 'next-js',
644 category: 'technical',
645 aliases: ['nextjs', 'next'],
646 wikidataId: 'Q56062623',
647 },
648 {
649 canonicalName: 'Nginx',
650 slug: 'nginx',
651 category: 'technical',
652 aliases: ['nginx server'],
653 },
654 {
655 canonicalName: 'Nim',
656 slug: 'nim',
657 category: 'technical',
658 aliases: ['nim-lang'],
659 },
660 {
661 canonicalName: 'Nix',
662 slug: 'nix',
663 category: 'technical',
664 aliases: ['nixos', 'nix package manager'],
665 },
666 {
667 canonicalName: 'Node.js',
668 slug: 'node-js',
669 category: 'technical',
670 aliases: ['nodejs', 'node'],
671 wikidataId: 'Q756100',
672 },
673 {
674 canonicalName: 'Nuxt.js',
675 slug: 'nuxt-js',
676 category: 'technical',
677 aliases: ['nuxtjs'],
678 },
679 {
680 canonicalName: 'OAuth',
681 slug: 'oauth',
682 category: 'technical',
683 aliases: ['openid connect', 'multi-factor authentication'],
684 },
685 {
686 canonicalName: 'Object-Oriented Programming',
687 slug: 'object-oriented-programming',
688 category: 'technical',
689 aliases: [
690 'oop',
691 'programmation orientée objet (poo)',
692 'object oriented design',
693 'object-oriented programming (oop)',
694 'oop',
695 ],
696 },
697 {
698 canonicalName: 'Objective-C',
699 slug: 'objective-c',
700 category: 'technical',
701 aliases: ['objc'],
702 },
703 {
704 canonicalName: 'PHP',
705 slug: 'php',
706 category: 'technical',
707 aliases: ['php8', 'doctrine', 'twig'],
708 wikidataId: 'Q59',
709 },
710 {
711 canonicalName: 'Perl',
712 slug: 'perl',
713 category: 'technical',
714 aliases: ['perl5'],
715 },
716 {
717 canonicalName: 'PostgreSQL',
718 slug: 'postgresql',
719 category: 'technical',
720 aliases: ['postgres', 'pg', 'psql'],
721 wikidataId: 'Q192490',
722 },
723 {
724 canonicalName: 'Postman',
725 slug: 'postman',
726 category: 'technical',
727 aliases: ['postman api'],
728 },
729 {
730 canonicalName: 'PrestaShop',
731 slug: 'prestashop',
732 category: 'technical',
733 aliases: ['prestashop ecommerce'],
734 },
735 {
736 canonicalName: 'Progressive Web Apps',
737 slug: 'progressive-web-apps',
738 category: 'technical',
739 aliases: [
740 'pwa',
741 'progressive web applications (pwas)',
742 'progressive web applications',
743 'progressive web app',
744 ],
745 },
746 {
747 canonicalName: 'Pydantic',
748 slug: 'pydantic',
749 category: 'technical',
750 aliases: ['pydantic validation'],
751 },
752 {
753 canonicalName: 'Python',
754 slug: 'python',
755 category: 'technical',
756 aliases: [
757 'py',
758 'python3',
759 'python (programming language)',
760 'python for cybersecurity',
761 'python (langage de programmation)',
762 'jinja',
763 'mypy',
764 ],
765 wikidataId: 'Q28865',
766 },
767 {
768 canonicalName: 'Quality Assurance',
769 slug: 'quality-assurance',
770 category: 'technical',
771 aliases: [
772 'qa',
773 'quality assurance (qa)',
774 'software testing',
775 'regression testing',
776 'defect tracking',
777 'test automation',
778 'testing',
779 'automatisation des tests',
780 ],
781 },
782 {
783 canonicalName: 'R',
784 slug: 'r',
785 category: 'technical',
786 aliases: ['r (programming language)', 'r (lenguaje de programación)', 'r markdown', 'rstudio'],
787 },
788 {
789 canonicalName: 'REST APIs',
790 slug: 'rest-apis',
791 category: 'technical',
792 aliases: ['restful', 'rest', 'api design', 'rest api', 'web services'],
793 },
794 {
795 canonicalName: 'React',
796 slug: 'react',
797 category: 'technical',
798 aliases: ['reactjs', 'react.js'],
799 wikidataId: 'Q19399674',
800 },
801 {
802 canonicalName: 'React Native',
803 slug: 'react-native',
804 category: 'technical',
805 aliases: ['react native development'],
806 },
807 {
808 canonicalName: 'Redis',
809 slug: 'redis',
810 category: 'technical',
811 aliases: ['valkey', 'redis streams'],
812 wikidataId: 'Q2136322',
813 },
814 {
815 canonicalName: 'Redux',
816 slug: 'redux',
817 category: 'technical',
818 aliases: ['redux.js', 'mobx'],
819 },
820 {
821 canonicalName: 'Remix',
822 slug: 'remix',
823 category: 'technical',
824 aliases: ['remix.run'],
825 },
826 {
827 canonicalName: 'Requirements Analysis',
828 slug: 'requirements-analysis',
829 category: 'technical',
830 aliases: ['system requirements', 'requirements engineering', 'requirements gathering'],
831 },
832 {
833 canonicalName: 'Revit',
834 slug: 'revit',
835 category: 'technical',
836 aliases: ['autodesk revit'],
837 },
838 {
839 canonicalName: 'Ruby',
840 slug: 'ruby',
841 category: 'technical',
842 aliases: ['rb'],
843 wikidataId: 'Q161053',
844 },
845 {
846 canonicalName: 'Ruby on Rails',
847 slug: 'ruby-on-rails',
848 category: 'technical',
849 aliases: ['rails', 'ror'],
850 },
851 {
852 canonicalName: 'Rust',
853 slug: 'rust',
854 category: 'technical',
855 aliases: ['rust-lang', 'rust (programming language)'],
856 wikidataId: 'Q575650',
857 },
858 {
859 canonicalName: 'SAP',
860 slug: 'sap',
861 category: 'technical',
862 aliases: [
863 'sap erp',
864 'sap ewm',
865 'sap fiori',
866 'sap hana',
867 'sap solution manager',
868 'sap ui5',
869 'sap-implementierung',
870 'sap-produkte',
871 's/4 hana migration',
872 ],
873 },
874 {
875 canonicalName: 'SASS',
876 slug: 'sass-css',
877 category: 'technical',
878 aliases: ['scss'],
879 },
880 {
881 canonicalName: 'SDLC',
882 slug: 'sdlc',
883 category: 'technical',
884 aliases: [
885 'software development life cycle',
886 'software development life cycle (sdlc)',
887 'software development lifecycle',
888 'software lifecycle',
889 ],
890 },
891 {
892 canonicalName: 'SQL',
893 slug: 'sql',
894 category: 'technical',
895 aliases: [
896 'structured query language',
897 'sql (structured query language)',
898 'sql for data retrieval',
899 ],
900 wikidataId: 'Q47607',
901 },
902 {
903 canonicalName: 'SQLite',
904 slug: 'sqlite',
905 category: 'technical',
906 aliases: ['sqlite3'],
907 },
908 {
909 canonicalName: 'Salesforce',
910 slug: 'salesforce',
911 category: 'technical',
912 aliases: ['salesforce.com', 'salesforce crm'],
913 },
914 {
915 canonicalName: 'Shell Scripting',
916 slug: 'shell-scripting',
917 category: 'technical',
918 aliases: ['bash scripting', 'bash', 'shell', 'awk'],
919 },
920 {
921 canonicalName: 'Shopware',
922 slug: 'shopware',
923 category: 'technical',
924 aliases: ['shopware 6'],
925 },
926 {
927 canonicalName: 'SketchUp',
928 slug: 'sketchup',
929 category: 'technical',
930 aliases: ['google sketchup', 'trimble sketchup'],
931 },
932 {
933 canonicalName: 'Software Engineering',
934 slug: 'software-engineering',
935 category: 'technical',
936 aliases: [
937 'software development',
938 'programming',
939 'software design',
940 'programutveckling',
941 'programmering',
942 'code refactoring',
943 'refactoring',
944 ],
945 },
946 {
947 canonicalName: 'SolidWorks',
948 slug: 'solidworks',
949 category: 'technical',
950 aliases: ['solid works'],
951 },
952 {
953 canonicalName: 'Spring Framework',
954 slug: 'spring-framework',
955 category: 'technical',
956 aliases: ['spring', 'spring boot', 'framework spring'],
957 wikidataId: 'Q856079',
958 },
959 {
960 canonicalName: 'Spryker',
961 slug: 'spryker',
962 category: 'technical',
963 aliases: ['spryker cloud commerce os'],
964 },
965 {
966 canonicalName: 'Storybook',
967 slug: 'storybook',
968 category: 'technical',
969 aliases: ['storybook ui'],
970 },
971 {
972 canonicalName: 'SugarCRM',
973 slug: 'sugarcrm',
974 category: 'technical',
975 aliases: ['sugarcrm platform'],
976 },
977 {
978 canonicalName: 'Svelte',
979 slug: 'svelte',
980 category: 'technical',
981 aliases: ['sveltekit', 'svelte.js'],
982 },
983 {
984 canonicalName: 'Swift',
985 slug: 'swift',
986 category: 'technical',
987 aliases: ['swift5'],
988 wikidataId: 'Q17118377',
989 },
990 {
991 canonicalName: 'Symfony',
992 slug: 'symfony',
993 category: 'technical',
994 aliases: ['symfony framework'],
995 },
996 {
997 canonicalName: 'System Administration',
998 slug: 'system-administration',
999 category: 'technical',
1000 aliases: [
1001 'infrastructure management',
1002 'infrastructure development',
1003 'operating systems',
1004 'solaris',
1005 ],
1006 },
1007 {
1008 canonicalName: 'System Deployment',
1009 slug: 'system-deployment',
1010 category: 'technical',
1011 aliases: ['deployment automation', 'system balancing', 'infrastructure improvement'],
1012 },
1013 {
1014 canonicalName: 'System Integration',
1015 slug: 'system-integration',
1016 category: 'technical',
1017 aliases: ['integration', 'api integration', 'enterprise integration', 'systems integration'],
1018 },
1019 {
1020 canonicalName: 'Systems Design',
1021 slug: 'systems-design',
1022 category: 'technical',
1023 aliases: [
1024 'system design',
1025 'software architecture',
1026 'system architecture',
1027 'antifragile systems design',
1028 'distributed systems',
1029 'architecture',
1030 'architecture mvc',
1031 'uml',
1032 ],
1033 },
1034 {
1035 canonicalName: 'TCL',
1036 slug: 'tcl',
1037 category: 'technical',
1038 aliases: ['tcl/tk'],
1039 },
1040 {
1041 canonicalName: 'Tailwind CSS',
1042 slug: 'tailwind-css',
1043 category: 'technical',
1044 aliases: ['tailwind', 'tailwindcss'],
1045 },
1046 {
1047 canonicalName: 'Technical Documentation',
1048 slug: 'technical-documentation',
1049 category: 'technical',
1050 aliases: ['documentation', 'api documentation', 'developer documentation'],
1051 },
1052 {
1053 canonicalName: 'Technical Training',
1054 slug: 'technical-training',
1055 category: 'technical',
1056 aliases: ['it training', 'technology training', 'technical support readiness'],
1057 },
1058 {
1059 canonicalName: 'Terraform',
1060 slug: 'terraform',
1061 category: 'technical',
1062 aliases: ['iac', 'infrastructure as code'],
1063 wikidataId: 'Q21051411',
1064 },
1065 {
1066 canonicalName: 'Test-Driven Development',
1067 slug: 'test-driven-development',
1068 category: 'technical',
1069 aliases: ['tdd', 'unit testing', 'automated testing'],
1070 },
1071 {
1072 canonicalName: 'TypeScript',
1073 slug: 'typescript',
1074 category: 'technical',
1075 aliases: ['ts'],
1076 wikidataId: 'Q978185',
1077 },
1078 {
1079 canonicalName: 'Unity',
1080 slug: 'unity',
1081 category: 'technical',
1082 aliases: ['unity3d', 'unity game engine'],
1083 wikidataId: 'Q177984',
1084 },
1085 {
1086 canonicalName: 'Visual Studio',
1087 slug: 'visual-studio',
1088 category: 'technical',
1089 aliases: ['visual studio code', 'microsoft visual studio code', 'eclipse'],
1090 },
1091 {
1092 canonicalName: 'Vite',
1093 slug: 'vite',
1094 category: 'technical',
1095 aliases: ['vitejs'],
1096 },
1097 {
1098 canonicalName: 'Vue.js',
1099 slug: 'vue-js',
1100 category: 'technical',
1101 aliases: ['vue', 'vuejs'],
1102 wikidataId: 'Q24589705',
1103 },
1104 {
1105 canonicalName: 'Web Development',
1106 slug: 'web-development',
1107 category: 'technical',
1108 aliases: [
1109 'frontend development',
1110 'backend development',
1111 'fullstack development',
1112 'full-stack development',
1113 'web dev',
1114 'web application development',
1115 'front-end',
1116 'front-end development',
1117 'back-end web development',
1118 'html/css/js',
1119 'web 2.0',
1120 'développement full-stack',
1121 ],
1122 },
1123 {
1124 canonicalName: 'Web Scraping',
1125 slug: 'web-scraping',
1126 category: 'technical',
1127 aliases: ['scraping'],
1128 },
1129 {
1130 canonicalName: 'WebAssembly',
1131 slug: 'webassembly',
1132 category: 'technical',
1133 aliases: ['wasm'],
1134 },
1135 {
1136 canonicalName: 'Webpack',
1137 slug: 'webpack',
1138 category: 'technical',
1139 aliases: ['babel', 'babel.js', 'build tools'],
1140 },
1141 {
1142 canonicalName: 'Windows Administration',
1143 slug: 'windows-administration',
1144 category: 'technical',
1145 aliases: ['windows server', 'active directory', 'microsoft windows'],
1146 },
1147 {
1148 canonicalName: 'WordPress',
1149 slug: 'wordpress',
1150 category: 'technical',
1151 aliases: ['wordpress development', 'wordpress cms'],
1152 wikidataId: 'Q13166',
1153 },
1154 {
1155 canonicalName: 'XML',
1156 slug: 'xml',
1157 category: 'technical',
1158 aliases: ['extensible markup language', 'xslt', 'xsd'],
1159 },
1160 {
1161 canonicalName: 'Zustand',
1162 slug: 'zustand',
1163 category: 'technical',
1164 aliases: ['state management'],
1165 },
1166 {
1167 canonicalName: 'dbt',
1168 slug: 'dbt',
1169 category: 'technical',
1170 aliases: ['data build tool', 'data build tool (dbt)'],
1171 },
1172 {
1173 canonicalName: 'iOS Development',
1174 slug: 'ios-development',
1175 category: 'technical',
1176 aliases: [
1177 'ios',
1178 'ios development',
1179 'ios-entwicklung',
1180 'iphone application development',
1181 'iphone',
1182 'ipad',
1183 'cocoa',
1184 ],
1185 },
1186 {
1187 canonicalName: 'jQuery',
1188 slug: 'jquery',
1189 category: 'technical',
1190 aliases: [],
1191 },
1192 {
1193 canonicalName: 'macOS',
1194 slug: 'macos',
1195 category: 'technical',
1196 aliases: ['mac os', 'os x', 'mac os x'],
1197 },
1198 {
1199 canonicalName: 'n8n',
1200 slug: 'n8n',
1201 category: 'technical',
1202 aliases: ['n8n.io'],
1203 },
1204 {
1205 canonicalName: 'pandas',
1206 slug: 'pandas',
1207 category: 'technical',
1208 aliases: ['pandas (software)', 'pandas library'],
1209 },
1210
1211 // ──────────────────────────────────────────────────
1212 // Business
1213 // ──────────────────────────────────────────────────
1214 {
1215 canonicalName: 'A/B Testing',
1216 slug: 'a-b-testing',
1217 category: 'business',
1218 aliases: ['split testing', 'multivariate testing', 'experimentation', 'a/b test'],
1219 },
1220 {
1221 canonicalName: 'Agile',
1222 slug: 'agile',
1223 category: 'business',
1224 aliases: [
1225 'scrum',
1226 'kanban',
1227 'agile methodology',
1228 'agile application development',
1229 'user stories',
1230 ],
1231 },
1232 {
1233 canonicalName: 'Agile Methodologies',
1234 slug: 'agile-methodologies',
1235 category: 'business',
1236 aliases: ['agile project management', 'agile practices', 'agile frameworks'],
1237 },
1238 {
1239 canonicalName: 'Analytics',
1240 slug: 'analytics',
1241 category: 'business',
1242 aliases: ['business analytics', 'product analytics'],
1243 },
1244 {
1245 canonicalName: 'Blogging',
1246 slug: 'blogging',
1247 category: 'business',
1248 aliases: ['blog writing', 'content publishing'],
1249 },
1250 {
1251 canonicalName: 'Business Analysis',
1252 slug: 'business-analysis',
1253 category: 'business',
1254 aliases: ['ba', 'requirements analysis'],
1255 },
1256 {
1257 canonicalName: 'Business Networking',
1258 slug: 'business-networking',
1259 category: 'business',
1260 aliases: ['professional networking', 'relationship building', 'business alignment'],
1261 },
1262 {
1263 canonicalName: 'CRM',
1264 slug: 'crm',
1265 category: 'business',
1266 aliases: ['customer relationship management', 'customer relationship management (crm)'],
1267 },
1268 {
1269 canonicalName: 'Change Management',
1270 slug: 'change-management',
1271 category: 'business',
1272 aliases: ['organizational change'],
1273 },
1274 {
1275 canonicalName: 'Compliance Management',
1276 slug: 'compliance-management',
1277 category: 'business',
1278 aliases: ['regulatory compliance', 'governance', 'grc'],
1279 },
1280 {
1281 canonicalName: 'Consulting',
1282 slug: 'consulting',
1283 category: 'business',
1284 aliases: ['it consulting', 'management consulting'],
1285 },
1286 {
1287 canonicalName: 'Content Management',
1288 slug: 'content-management',
1289 category: 'business',
1290 aliases: [
1291 'cms',
1292 'web content management',
1293 'content management systems',
1294 'content management systems (cms)',
1295 ],
1296 },
1297 {
1298 canonicalName: 'Content Strategy',
1299 slug: 'content-strategy',
1300 category: 'business',
1301 aliases: ['digital communication strategy', 'message development', 'creative strategy'],
1302 },
1303 {
1304 canonicalName: 'Conversion Optimization',
1305 slug: 'conversion-optimization',
1306 category: 'business',
1307 aliases: [
1308 'cro',
1309 'conversion rate optimization',
1310 'e-commerce optimization',
1311 'ecommerce optimization',
1312 ],
1313 },
1314 {
1315 canonicalName: 'Crisis Communications',
1316 slug: 'crisis-communications',
1317 category: 'business',
1318 aliases: ['crisis management', 'reputation management'],
1319 },
1320 {
1321 canonicalName: 'Customer Experience',
1322 slug: 'customer-experience',
1323 category: 'business',
1324 aliases: ['cx', 'customer experience management', 'customer analysis', 'client relations'],
1325 },
1326 {
1327 canonicalName: 'Customer Service',
1328 slug: 'customer-service',
1329 category: 'business',
1330 aliases: ['customer support', 'client services'],
1331 },
1332 {
1333 canonicalName: 'Customer Success',
1334 slug: 'customer-success',
1335 category: 'business',
1336 aliases: ['customer success management', 'csm'],
1337 },
1338 {
1339 canonicalName: 'Data Visualization',
1340 slug: 'data-visualization',
1341 category: 'business',
1342 aliases: ['data viz', 'dashboards', 'business intelligence visualization'],
1343 },
1344 {
1345 canonicalName: 'Digital Strategy',
1346 slug: 'digital-strategy',
1347 category: 'business',
1348 aliases: ['digital transformation', 'digital business strategy', 'online strategy'],
1349 },
1350 {
1351 canonicalName: 'E-commerce',
1352 slug: 'e-commerce',
1353 category: 'business',
1354 aliases: ['ecommerce', 'e-business', 'online retail', 'online commerce', 'e commerce'],
1355 },
1356 {
1357 canonicalName: 'Email Marketing',
1358 slug: 'email-marketing',
1359 category: 'business',
1360 aliases: ['mailchimp', 'email migration'],
1361 },
1362 {
1363 canonicalName: 'Entrepreneurship',
1364 slug: 'entrepreneurship',
1365 category: 'business',
1366 aliases: ['startup', 'founder', 'entrepreneur', 'business development', 'business ideas'],
1367 },
1368 {
1369 canonicalName: 'Financial Services',
1370 slug: 'financial-services',
1371 category: 'business',
1372 aliases: [
1373 'banking',
1374 'financial industry',
1375 'fintech',
1376 'billing systems',
1377 'payment systems',
1378 'telecommunications billing',
1379 'telecoms billing',
1380 ],
1381 },
1382 {
1383 canonicalName: 'Financial Systems',
1384 slug: 'financial-systems',
1385 category: 'business',
1386 aliases: [
1387 'financial management systems',
1388 'erp',
1389 'enterprise resource planning',
1390 'financial software',
1391 ],
1392 },
1393 {
1394 canonicalName: 'Growth Hacking',
1395 slug: 'growth-hacking',
1396 category: 'business',
1397 aliases: ['growth strategy', 'user acquisition', 'viral marketing'],
1398 },
1399 {
1400 canonicalName: 'IT Consulting',
1401 slug: 'it-consulting',
1402 category: 'business',
1403 aliases: ['technology consulting', 'digital consulting'],
1404 },
1405 {
1406 canonicalName: 'Insurance',
1407 slug: 'insurance',
1408 category: 'business',
1409 aliases: ['insurance brokerage', 'insurance industry'],
1410 },
1411 {
1412 canonicalName: 'Inventory Management',
1413 slug: 'inventory-management',
1414 category: 'business',
1415 aliases: ['stock replenishment', 'supply ordering'],
1416 },
1417 {
1418 canonicalName: 'Knowledge Management',
1419 slug: 'knowledge-management',
1420 category: 'business',
1421 aliases: ['knowledge base management', 'organizational learning', 'documentation management'],
1422 },
1423 {
1424 canonicalName: 'Lean',
1425 slug: 'lean',
1426 category: 'business',
1427 aliases: [
1428 'lean transformation',
1429 'lean manufacturing',
1430 'lean methodology',
1431 'lean start-up',
1432 'lean thinking',
1433 ],
1434 },
1435 {
1436 canonicalName: 'Management',
1437 slug: 'management',
1438 category: 'business',
1439 aliases: [
1440 'general management',
1441 'operations management',
1442 'team management',
1443 'engineering management',
1444 'it management',
1445 ],
1446 },
1447 {
1448 canonicalName: 'Manufacturing',
1449 slug: 'manufacturing',
1450 category: 'business',
1451 aliases: ['production management', 'manufacturing operations'],
1452 },
1453 {
1454 canonicalName: 'Market Research',
1455 slug: 'market-research',
1456 category: 'business',
1457 aliases: ['market analysis', 'competitive analysis'],
1458 },
1459 {
1460 canonicalName: 'Marketing',
1461 slug: 'marketing',
1462 category: 'business',
1463 aliases: ['digital marketing', 'content marketing', 'tag management'],
1464 },
1465 {
1466 canonicalName: 'Marketing Strategy',
1467 slug: 'marketing-strategy',
1468 category: 'business',
1469 aliases: ['go-to-market strategy', 'marketing planning', 'growth marketing'],
1470 },
1471 {
1472 canonicalName: 'Nonprofits',
1473 slug: 'nonprofits',
1474 category: 'business',
1475 aliases: ['nonprofit management', 'volunteer management', 'fundraising'],
1476 },
1477 {
1478 canonicalName: 'Online Marketing',
1479 slug: 'online-marketing',
1480 category: 'business',
1481 aliases: ['internet marketing', 'web marketing'],
1482 },
1483 {
1484 canonicalName: 'Performance Management',
1485 slug: 'performance-management',
1486 category: 'business',
1487 aliases: ['kpi management', 'okr', 'objectives and key results'],
1488 },
1489 {
1490 canonicalName: 'Process Improvement',
1491 slug: 'process-improvement',
1492 category: 'business',
1493 aliases: [
1494 'business process improvement',
1495 'workflow optimization',
1496 'operational efficiency',
1497 'root cause analysis (rca)',
1498 'root cause analysis',
1499 ],
1500 },
1501 {
1502 canonicalName: 'Product Development',
1503 slug: 'product-development',
1504 category: 'business',
1505 aliases: ['new product development', 'npd', 'produktentwicklung'],
1506 },
1507 {
1508 canonicalName: 'Product Lifecycle Management',
1509 slug: 'product-lifecycle-management',
1510 category: 'business',
1511 aliases: ['plm tools'],
1512 },
1513 {
1514 canonicalName: 'Product Management',
1515 slug: 'product-management',
1516 category: 'business',
1517 aliases: [
1518 'product owner',
1519 'product strategy',
1520 'product planning',
1521 'product discovery',
1522 'product training',
1523 'technical product training',
1524 ],
1525 },
1526 {
1527 canonicalName: 'Project Management',
1528 slug: 'project-management',
1529 category: 'business',
1530 aliases: ['pm', 'project planning'],
1531 },
1532 {
1533 canonicalName: 'Public Relations',
1534 slug: 'public-relations',
1535 category: 'business',
1536 aliases: ['strategic communications'],
1537 },
1538 {
1539 canonicalName: 'Recruiting',
1540 slug: 'recruiting',
1541 category: 'business',
1542 aliases: ['recruiting and hiring', 'talent acquisition', 'hiring'],
1543 },
1544 {
1545 canonicalName: 'Resource Management',
1546 slug: 'resource-management',
1547 category: 'business',
1548 aliases: ['capacity planning', 'workforce planning'],
1549 },
1550 {
1551 canonicalName: 'Revenue Management',
1552 slug: 'revenue-management',
1553 category: 'business',
1554 aliases: ['revenue growth optimization', 'revenue optimization'],
1555 },
1556 {
1557 canonicalName: 'Risk Assessment',
1558 slug: 'risk-assessment',
1559 category: 'business',
1560 aliases: ['risk management', 'risk analysis', 'cost-benefit analysis'],
1561 },
1562 {
1563 canonicalName: 'SEO',
1564 slug: 'seo',
1565 category: 'business',
1566 aliases: ['search engine optimization', 'technical seo', 'on-page seo', 'seo strategy'],
1567 },
1568 {
1569 canonicalName: 'SaaS',
1570 slug: 'saas',
1571 category: 'business',
1572 aliases: ['software as a service', 'saas & cloud solutions expertise'],
1573 },
1574 {
1575 canonicalName: 'Sales',
1576 slug: 'sales',
1577 category: 'business',
1578 aliases: [
1579 'sales management',
1580 'b2b sales',
1581 'account management',
1582 'sales strategy & pipeline development',
1583 ],
1584 },
1585 {
1586 canonicalName: 'Service Level Management',
1587 slug: 'service-level-management',
1588 category: 'business',
1589 aliases: [
1590 'sla management',
1591 'service-level agreements',
1592 'service level agreement',
1593 'service-level agreements (sla)',
1594 ],
1595 },
1596 {
1597 canonicalName: 'Six Sigma',
1598 slug: 'six-sigma',
1599 category: 'business',
1600 aliases: ['design of experiments (doe)', 'experimental design'],
1601 },
1602 {
1603 canonicalName: 'Social Media',
1604 slug: 'social-media',
1605 category: 'business',
1606 aliases: ['social networks', 'social platforms'],
1607 },
1608 {
1609 canonicalName: 'Social Media Marketing',
1610 slug: 'social-media-marketing',
1611 category: 'business',
1612 aliases: ['smm', 'social advertising'],
1613 },
1614 {
1615 canonicalName: 'Software Project Management',
1616 slug: 'software-project-management',
1617 category: 'business',
1618 aliases: [
1619 'web project management',
1620 'it project management',
1621 'technical project management',
1622 'project coordination',
1623 ],
1624 },
1625 {
1626 canonicalName: 'Strategic Planning',
1627 slug: 'strategic-planning',
1628 category: 'business',
1629 aliases: ['strategy', 'business strategy'],
1630 },
1631 {
1632 canonicalName: 'Telecommunications',
1633 slug: 'telecommunications',
1634 category: 'business',
1635 aliases: ['telecom'],
1636 },
1637 {
1638 canonicalName: 'Training & Development',
1639 slug: 'training-and-development',
1640 category: 'business',
1641 aliases: [
1642 'training needs analysis',
1643 'training evaluation',
1644 'learning management',
1645 'learning management systems',
1646 'learning strategy development',
1647 'e-learning',
1648 'blended learning',
1649 'curriculum development',
1650 'needs analysis',
1651 'enablement program design & delivery',
1652 'data analysis & learning impact assessment',
1653 'generative ai for learning and development',
1654 'technical education leadership',
1655 ],
1656 },
1657 {
1658 canonicalName: 'Vendor Management',
1659 slug: 'vendor-management',
1660 category: 'business',
1661 aliases: ['supplier management', 'partner management', 'procurement'],
1662 },
1663 {
1664 canonicalName: 'Web Analytics',
1665 slug: 'web-analytics',
1666 category: 'business',
1667 aliases: ['google analytics', 'digital analytics', 'web tracking'],
1668 },
1669 {
1670 canonicalName: 'Workplace Safety',
1671 slug: 'workplace-safety',
1672 category: 'business',
1673 aliases: ['occupational safety', 'osha'],
1674 },
1675 {
1676 canonicalName: 'Writing',
1677 slug: 'writing',
1678 category: 'business',
1679 aliases: ['business writing', 'professional writing'],
1680 },
1681
1682 // ──────────────────────────────────────────────────
1683 // Creative
1684 // ──────────────────────────────────────────────────
1685 {
1686 canonicalName: 'Adobe Creative Suite',
1687 slug: 'adobe-creative-suite',
1688 category: 'creative',
1689 aliases: ['adobe creative cloud', 'creative suite'],
1690 },
1691 {
1692 canonicalName: 'Adobe Illustrator',
1693 slug: 'adobe-illustrator',
1694 category: 'creative',
1695 aliases: ['illustrator', 'ai'],
1696 },
1697 {
1698 canonicalName: 'Adobe InDesign',
1699 slug: 'adobe-indesign',
1700 category: 'creative',
1701 aliases: ['indesign'],
1702 },
1703 {
1704 canonicalName: 'Adobe Photoshop',
1705 slug: 'adobe-photoshop',
1706 category: 'creative',
1707 aliases: ['photoshop', 'ps'],
1708 },
1709 {
1710 canonicalName: 'Adobe Premiere Pro',
1711 slug: 'adobe-premiere-pro',
1712 category: 'creative',
1713 aliases: ['premiere pro', 'premiere'],
1714 },
1715 {
1716 canonicalName: 'Affinity Designer',
1717 slug: 'affinity-designer',
1718 category: 'creative',
1719 aliases: [],
1720 },
1721 {
1722 canonicalName: 'Affinity Photo',
1723 slug: 'affinity-photo',
1724 category: 'creative',
1725 aliases: [],
1726 },
1727 {
1728 canonicalName: 'Architectural Design',
1729 slug: 'architectural-design',
1730 category: 'creative',
1731 aliases: ['building architecture', 'architectural drafting'],
1732 },
1733 {
1734 canonicalName: 'Audio Engineering',
1735 slug: 'audio-engineering',
1736 category: 'creative',
1737 aliases: ['producing', 'podcasting', 'media production management'],
1738 },
1739 {
1740 canonicalName: 'Branding',
1741 slug: 'branding',
1742 category: 'creative',
1743 aliases: ['brand strategy', 'brand development', 'branding & identity'],
1744 },
1745 {
1746 canonicalName: 'Content Design',
1747 slug: 'content-design',
1748 category: 'creative',
1749 aliases: ['ux writing'],
1750 },
1751 {
1752 canonicalName: 'Copywriting',
1753 slug: 'copywriting',
1754 category: 'creative',
1755 aliases: ['content writing', 'technical writing', 'web content writing'],
1756 },
1757 {
1758 canonicalName: 'Design Leadership',
1759 slug: 'design-leadership',
1760 category: 'creative',
1761 aliases: ['design advocacy', 'design coaching', 'design management'],
1762 },
1763 {
1764 canonicalName: 'Design Operations',
1765 slug: 'design-operations',
1766 category: 'creative',
1767 aliases: ['designops', 'design ops'],
1768 },
1769 {
1770 canonicalName: 'Design Systems',
1771 slug: 'design-systems',
1772 category: 'creative',
1773 aliases: ['design tokens', 'component libraries'],
1774 },
1775 {
1776 canonicalName: 'Design Thinking',
1777 slug: 'design-thinking',
1778 category: 'creative',
1779 aliases: ['design strategy', 'design practice', 'human-centered design'],
1780 },
1781 {
1782 canonicalName: 'Digital Illustration',
1783 slug: 'digital-illustration',
1784 category: 'creative',
1785 aliases: ['illustration', 'digital art'],
1786 },
1787 {
1788 canonicalName: 'Digital Publishing',
1789 slug: 'digital-publishing',
1790 category: 'creative',
1791 aliases: ['electronic publishing', 'epub'],
1792 },
1793 {
1794 canonicalName: 'Graphic Design',
1795 slug: 'graphic-design',
1796 category: 'creative',
1797 aliases: ['visual design', 'design production', 'icon design', 'design', 'designs'],
1798 },
1799 {
1800 canonicalName: 'Information Architecture',
1801 slug: 'information-architecture',
1802 category: 'creative',
1803 aliases: ['ia', 'content architecture'],
1804 },
1805 {
1806 canonicalName: 'Interaction Design',
1807 slug: 'interaction-design',
1808 category: 'creative',
1809 aliases: ['ixd'],
1810 },
1811 {
1812 canonicalName: 'Level Design',
1813 slug: 'level-design',
1814 category: 'creative',
1815 aliases: ['level design / map design', 'map design', 'game level design'],
1816 },
1817 {
1818 canonicalName: 'Logo Design',
1819 slug: 'logo-design',
1820 category: 'creative',
1821 aliases: ['brand identity design'],
1822 },
1823 {
1824 canonicalName: 'Motion Graphics',
1825 slug: 'motion-graphics',
1826 category: 'creative',
1827 aliases: ['animation', 'after effects'],
1828 },
1829 {
1830 canonicalName: 'Photography',
1831 slug: 'photography',
1832 category: 'creative',
1833 aliases: ['photo editing', 'digital photography'],
1834 },
1835 {
1836 canonicalName: 'Product Design',
1837 slug: 'product-design',
1838 category: 'creative',
1839 aliases: ['product design support'],
1840 },
1841 {
1842 canonicalName: 'Prototyping',
1843 slug: 'prototyping',
1844 category: 'creative',
1845 aliases: ['rapid prototyping', 'prototype development', 'origami'],
1846 },
1847 {
1848 canonicalName: 'Service Design',
1849 slug: 'service-design',
1850 category: 'creative',
1851 aliases: ['service design thinking'],
1852 },
1853 {
1854 canonicalName: 'Sketching',
1855 slug: 'sketching',
1856 category: 'creative',
1857 aliases: ['freehand sketching', 'concept sketching'],
1858 },
1859 {
1860 canonicalName: 'UI Design',
1861 slug: 'ui-design',
1862 category: 'creative',
1863 aliases: ['user interface design', 'ui', 'android design'],
1864 },
1865 {
1866 canonicalName: 'UX Design',
1867 slug: 'ux-design',
1868 category: 'creative',
1869 aliases: [
1870 'user experience design',
1871 'ux',
1872 'ux research',
1873 'user experience design (ued)',
1874 'user experience (ux)',
1875 'user-centered design',
1876 'lean ux',
1877 'user journeys',
1878 'customer journey mapping',
1879 ],
1880 },
1881 {
1882 canonicalName: 'Usability',
1883 slug: 'usability',
1884 category: 'creative',
1885 aliases: [
1886 'usability testing',
1887 'user testing',
1888 'usability research',
1889 'user experience testing',
1890 'user experience',
1891 'hci',
1892 'human-computer interaction',
1893 ],
1894 },
1895 {
1896 canonicalName: 'User Research',
1897 slug: 'user-research',
1898 category: 'creative',
1899 aliases: ['design research', 'user testing research'],
1900 },
1901 {
1902 canonicalName: 'Video Production',
1903 slug: 'video-production',
1904 category: 'creative',
1905 aliases: ['video editing', 'web video', 'ffmpeg', 'video processing'],
1906 },
1907 {
1908 canonicalName: 'Web Design',
1909 slug: 'web-design',
1910 category: 'creative',
1911 aliases: ['website design'],
1912 },
1913 {
1914 canonicalName: 'Wireframing',
1915 slug: 'wireframing',
1916 category: 'creative',
1917 aliases: ['wireframes', 'mockups'],
1918 },
1919
1920 // ──────────────────────────────────────────────────
1921 // Interpersonal
1922 // ──────────────────────────────────────────────────
1923 {
1924 canonicalName: 'Communication',
1925 slug: 'communication',
1926 category: 'interpersonal',
1927 aliases: ['public speaking', 'presentation skills', 'presentations'],
1928 },
1929 {
1930 canonicalName: 'Conflict Resolution',
1931 slug: 'conflict-resolution',
1932 category: 'interpersonal',
1933 aliases: ['mediation', 'negotiation', 'dispute resolution'],
1934 },
1935 {
1936 canonicalName: 'Cross-functional Leadership',
1937 slug: 'cross-functional-leadership',
1938 category: 'interpersonal',
1939 aliases: [
1940 'cross-functional team leadership',
1941 'cross-functional management',
1942 'matrix management',
1943 'global cross-functional team leadership',
1944 ],
1945 },
1946 {
1947 canonicalName: 'Czech',
1948 slug: 'czech',
1949 category: 'interpersonal',
1950 aliases: ['čeština'],
1951 },
1952 {
1953 canonicalName: 'English',
1954 slug: 'english',
1955 category: 'interpersonal',
1956 aliases: ['english language', 'english proficiency'],
1957 },
1958 {
1959 canonicalName: 'French',
1960 slug: 'french',
1961 category: 'interpersonal',
1962 aliases: ['français', 'french language'],
1963 },
1964 {
1965 canonicalName: 'German',
1966 slug: 'german',
1967 category: 'interpersonal',
1968 aliases: ['deutsch'],
1969 },
1970 {
1971 canonicalName: 'Human Behavior',
1972 slug: 'human-behavior',
1973 category: 'interpersonal',
1974 aliases: [
1975 'human behaviour',
1976 'behavioral psychology',
1977 'cognitive psychology',
1978 'psychology',
1979 'social psychology',
1980 'consumer behavior',
1981 'human factors',
1982 ],
1983 },
1984 {
1985 canonicalName: 'Leadership',
1986 slug: 'leadership',
1987 category: 'interpersonal',
1988 aliases: [
1989 'team leadership',
1990 'people management',
1991 'strategic leadership',
1992 'leadership development',
1993 ],
1994 },
1995 {
1996 canonicalName: 'Mentoring',
1997 slug: 'mentoring',
1998 category: 'interpersonal',
1999 aliases: ['coaching', 'mentorship'],
2000 },
2001 {
2002 canonicalName: 'Motivation',
2003 slug: 'motivation',
2004 category: 'interpersonal',
2005 aliases: ['self-motivation', 'team motivation'],
2006 },
2007 {
2008 canonicalName: 'Persuasion',
2009 slug: 'persuasion',
2010 category: 'interpersonal',
2011 aliases: ['influence', 'influencing skills', 'convincing people'],
2012 },
2013 {
2014 canonicalName: 'Problem Solving',
2015 slug: 'problem-solving',
2016 category: 'interpersonal',
2017 aliases: ['analytical thinking', 'critical thinking', 'analytical skills', 'troubleshooting'],
2018 },
2019 {
2020 canonicalName: 'Research',
2021 slug: 'research',
2022 category: 'interpersonal',
2023 aliases: [
2024 'research skills',
2025 'qualitative research',
2026 'quantitative research',
2027 'technical research',
2028 ],
2029 },
2030 {
2031 canonicalName: 'Spanish',
2032 slug: 'spanish',
2033 category: 'interpersonal',
2034 aliases: ['espagnol', 'español', 'spanish language'],
2035 },
2036 {
2037 canonicalName: 'Stakeholder Management',
2038 slug: 'stakeholder-management',
2039 category: 'interpersonal',
2040 aliases: [
2041 'stakeholder communication',
2042 'executive communication',
2043 'stakeholder engagement',
2044 'senior stakeholder management',
2045 ],
2046 },
2047 {
2048 canonicalName: 'Teaching',
2049 slug: 'teaching',
2050 category: 'interpersonal',
2051 aliases: [
2052 'instruction',
2053 'training',
2054 'education',
2055 'lecturing',
2056 'university lecturing',
2057 'assistant teaching',
2058 'training delivery',
2059 'delivering workshops',
2060 'classroom management',
2061 ],
2062 },
2063 {
2064 canonicalName: 'Team Collaboration',
2065 slug: 'team-collaboration',
2066 category: 'interpersonal',
2067 aliases: ['teamwork', 'cross-functional collaboration', 'collaboration', 'virtual teams'],
2068 },
2069 {
2070 canonicalName: 'Technical Leadership',
2071 slug: 'technical-leadership',
2072 category: 'interpersonal',
2073 aliases: ['tech lead', 'engineering leadership', 'technical management'],
2074 },
2075
2076 // ──────────────────────────────────────────────────
2077 // Community
2078 // ──────────────────────────────────────────────────
2079 {
2080 canonicalName: 'Community Building',
2081 slug: 'community-building',
2082 category: 'community',
2083 aliases: ['building communities', 'community growth', 'audience building'],
2084 },
2085 {
2086 canonicalName: 'Community Design',
2087 slug: 'community-design',
2088 category: 'community',
2089 aliases: ['community design thinking'],
2090 },
2091 {
2092 canonicalName: 'Community Engagement',
2093 slug: 'community-engagement',
2094 category: 'community',
2095 aliases: ['member engagement', 'community activation', 'community outreach'],
2096 },
2097 {
2098 canonicalName: 'Community Management',
2099 slug: 'community-management',
2100 category: 'community',
2101 aliases: ['online community management', 'community operations', 'community mangement'],
2102 },
2103 {
2104 canonicalName: 'Community Strategy',
2105 slug: 'community-strategy',
2106 category: 'community',
2107 aliases: ['community development', 'community program management', 'community programs'],
2108 },
2109 {
2110 canonicalName: 'Content Moderation',
2111 slug: 'content-moderation',
2112 category: 'community',
2113 aliases: ['platform moderation', 'trust and safety', 'content policy enforcement'],
2114 },
2115 {
2116 canonicalName: 'Developer Relations',
2117 slug: 'developer-relations',
2118 category: 'community',
2119 aliases: [
2120 'devrel',
2121 'developer advocacy',
2122 'developer evangelism',
2123 'technology evangelism',
2124 'tech evangelism',
2125 ],
2126 },
2127 {
2128 canonicalName: 'Event Management',
2129 slug: 'event-management',
2130 category: 'community',
2131 aliases: ['event planning', 'conference management', 'meetup organization'],
2132 },
2133 {
2134 canonicalName: 'Open Source',
2135 slug: 'open-source',
2136 category: 'community',
2137 aliases: [
2138 'open source development',
2139 'open source software',
2140 'oss',
2141 'foss',
2142 'open-source contribution',
2143 ],
2144 },
2145 {
2146 canonicalName: 'Platform Integrity',
2147 slug: 'platform-integrity',
2148 category: 'community',
2149 aliases: [
2150 'platform safety',
2151 'platform health',
2152 'platform trust',
2153 'eula enforcement',
2154 'policy enforcement',
2155 'policy administration',
2156 ],
2157 },
2158
2159 // ──────────────────────────────────────────────────
2160 // Security
2161 // ──────────────────────────────────────────────────
2162 {
2163 canonicalName: 'Compliance Frameworks',
2164 slug: 'compliance-frameworks',
2165 category: 'security',
2166 aliases: [
2167 'nist',
2168 'nist cybersecurity framework (csf)',
2169 'iso 27001',
2170 'cissp domains',
2171 'security frameworks',
2172 ],
2173 },
2174 {
2175 canonicalName: 'Computer Forensics',
2176 slug: 'computer-forensics',
2177 category: 'security',
2178 aliases: ['digital forensics', 'forensic analysis', 'malware analysis', 'malware detection'],
2179 },
2180 {
2181 canonicalName: 'Cybersecurity',
2182 slug: 'cybersecurity',
2183 category: 'security',
2184 aliases: [
2185 'cyber security',
2186 'information security',
2187 'infosec',
2188 'information security (infosec)',
2189 'account security',
2190 'cia triad',
2191 ],
2192 },
2193 {
2194 canonicalName: 'Digital Rights Management',
2195 slug: 'digital-rights-management',
2196 category: 'security',
2197 aliases: ['drm', 'digital rights management (drm)', 'content rights management'],
2198 },
2199 {
2200 canonicalName: 'Endpoint Management',
2201 slug: 'endpoint-management',
2202 category: 'security',
2203 aliases: ['device management', 'mdm', 'mobile device management', 'endpoint security'],
2204 },
2205 {
2206 canonicalName: 'ITSM',
2207 slug: 'itsm',
2208 category: 'security',
2209 aliases: [
2210 'it service management',
2211 'information technology service management (itsm)',
2212 'service desk',
2213 'help desk',
2214 ],
2215 },
2216 {
2217 canonicalName: 'Identity and Access Management',
2218 slug: 'identity-and-access-management',
2219 category: 'security',
2220 aliases: [
2221 'iam',
2222 'identity and access management (iam)',
2223 'access management',
2224 'privileged access management',
2225 'pam',
2226 ],
2227 },
2228 {
2229 canonicalName: 'Incident Response',
2230 slug: 'incident-response',
2231 category: 'security',
2232 aliases: ['incident management', 'incident resolution', 'security incident management'],
2233 },
2234 {
2235 canonicalName: 'Intrusion Detection',
2236 slug: 'intrusion-detection',
2237 category: 'security',
2238 aliases: ['ids', 'intrusion detection systems (ids)', 'intrusion prevention', 'ips'],
2239 },
2240 {
2241 canonicalName: 'Medical Devices',
2242 slug: 'medical-devices',
2243 category: 'security',
2244 aliases: [
2245 'medical device regulation (mdr)',
2246 'medical device regulation',
2247 'iec 62304',
2248 'iso 13485',
2249 'mdr compliance',
2250 'medical device r&d',
2251 ],
2252 },
2253 {
2254 canonicalName: 'Network Administration',
2255 slug: 'network-administration',
2256 category: 'security',
2257 aliases: [
2258 'network management',
2259 'network infrastructure',
2260 'networking',
2261 'remote access',
2262 'secure remote access',
2263 ],
2264 },
2265 {
2266 canonicalName: 'Network Security',
2267 slug: 'network-security',
2268 category: 'security',
2269 aliases: ['network protection', 'firewall management', 'network defense', 'perimeter security'],
2270 },
2271 {
2272 canonicalName: 'OSINT',
2273 slug: 'osint',
2274 category: 'security',
2275 aliases: ['open source intelligence'],
2276 },
2277 {
2278 canonicalName: 'Packet Analysis',
2279 slug: 'packet-analysis',
2280 category: 'security',
2281 aliases: ['wireshark', 'tcpdump', 'network analysis', 'suricata', 'packet capture'],
2282 },
2283 {
2284 canonicalName: 'Penetration Testing',
2285 slug: 'penetration-testing',
2286 category: 'security',
2287 aliases: ['pen testing', 'ethical hacking', 'security testing'],
2288 },
2289 {
2290 canonicalName: 'Public Safety',
2291 slug: 'public-safety',
2292 category: 'security',
2293 aliases: ['public safety communications', 'emergency management'],
2294 },
2295 {
2296 canonicalName: 'Remote Monitoring and Management',
2297 slug: 'remote-monitoring-management',
2298 category: 'security',
2299 aliases: [
2300 'rmm',
2301 'remote management & monitoring (rmm)',
2302 'remote monitoring & management (rmm)',
2303 'kaseya',
2304 'connectwise',
2305 'autotask',
2306 'it glue',
2307 ],
2308 },
2309 {
2310 canonicalName: 'SIEM',
2311 slug: 'siem',
2312 category: 'security',
2313 aliases: [
2314 'security information and event management',
2315 'siem (security information and event management)',
2316 'splunk',
2317 'chronicle',
2318 ],
2319 },
2320 {
2321 canonicalName: 'Security Auditing',
2322 slug: 'security-auditing',
2323 category: 'security',
2324 aliases: [
2325 'security audit',
2326 'security auditing (internal)',
2327 'internal audits',
2328 'audit documentation',
2329 'compliance auditing',
2330 ],
2331 },
2332 {
2333 canonicalName: 'Technical Support',
2334 slug: 'technical-support',
2335 category: 'security',
2336 aliases: [
2337 'it support',
2338 'helpdesk',
2339 'technical troubleshooting',
2340 'application support',
2341 'desktop support',
2342 ],
2343 },
2344 {
2345 canonicalName: 'Threat Intelligence',
2346 slug: 'threat-intelligence',
2347 category: 'security',
2348 aliases: ['cyber threat intelligence', 'threat analysis', 'threat intelligence (transferable)'],
2349 },
2350 {
2351 canonicalName: 'Vulnerability Management',
2352 slug: 'vulnerability-management',
2353 category: 'security',
2354 aliases: ['vulnerability assessment', 'patch management', 'security patching'],
2355 },
2356 {
2357 canonicalName: 'Wazuh',
2358 slug: 'wazuh',
2359 category: 'security',
2360 aliases: ['wazuh siem'],
2361 },
2362];
2363
2364async function seedSkills(db: Database) {
2365 logger.info({ count: SKILLS.length }, 'Seeding canonical skills');
2366
2367 let inserted = 0;
2368 let updated = 0;
2369
2370 for (const skill of SKILLS) {
2371 const result = await db
2372 .insert(canonicalSkills)
2373 .values({
2374 canonicalName: skill.canonicalName,
2375 slug: skill.slug,
2376 category: skill.category,
2377 aliases: skill.aliases,
2378 wikidataId: skill.wikidataId ?? null,
2379 })
2380 .onConflictDoUpdate({
2381 target: canonicalSkills.slug,
2382 set: {
2383 aliases: skill.aliases,
2384 category: skill.category,
2385 wikidataId: skill.wikidataId ?? null,
2386 updatedAt: new Date(),
2387 },
2388 });
2389
2390 if (result.rowCount && result.rowCount > 0) {
2391 // Can't distinguish insert from update via rowCount alone, but both are 1
2392 inserted++;
2393 }
2394 }
2395
2396 // Check how many were truly new vs updated
2397 updated = 0; // logged as total upserted
2398 logger.info({ upserted: inserted }, 'Skill seeding complete');
2399}
2400
2401/**
2402 * Re-resolve unresolved skills against the updated canonical skills list.
2403 * For each unresolved skill, check slug match then alias match.
2404 * If matched, mark as resolved.
2405 */
2406async function resolveUnresolvedSkills(db: Database) {
2407 const pending = await db
2408 .select()
2409 .from(unresolvedSkills)
2410 .where(isNull(unresolvedSkills.resolvedAt));
2411
2412 logger.info({ count: pending.length }, 'Attempting to resolve unresolved skills');
2413
2414 let resolved = 0;
2415 let remaining = 0;
2416
2417 for (const skill of pending) {
2418 const normalized = normalizeSkillName(skill.rawName);
2419 const slug = createSlug(skill.rawName);
2420
2421 // 1. Check slug match
2422 const bySlug = await db
2423 .select()
2424 .from(canonicalSkills)
2425 .where(sql`${canonicalSkills.slug} = ${slug}`)
2426 .limit(1);
2427
2428 if (bySlug[0]) {
2429 await db
2430 .update(unresolvedSkills)
2431 .set({
2432 resolvedAt: new Date(),
2433 resolvedToId: bySlug[0].id,
2434 })
2435 .where(sql`${unresolvedSkills.id} = ${skill.id}`);
2436 resolved++;
2437 continue;
2438 }
2439
2440 // 2. Check alias match
2441 const byAlias = await db
2442 .select()
2443 .from(canonicalSkills)
2444 .where(sql`${normalized} = ANY(${canonicalSkills.aliases})`)
2445 .limit(1);
2446
2447 if (byAlias[0]) {
2448 await db
2449 .update(unresolvedSkills)
2450 .set({
2451 resolvedAt: new Date(),
2452 resolvedToId: byAlias[0].id,
2453 })
2454 .where(sql`${unresolvedSkills.id} = ${skill.id}`);
2455 resolved++;
2456 continue;
2457 }
2458
2459 remaining++;
2460 logger.debug({ rawName: skill.rawName, normalized }, 'Still unresolved');
2461 }
2462
2463 logger.info({ resolved, remaining }, 'Unresolved skill resolution complete');
2464}
2465
2466async function main() {
2467 const databaseUrl = process.env.DATABASE_URL;
2468 if (!databaseUrl) {
2469 logger.error('DATABASE_URL environment variable is required');
2470 process.exit(1);
2471 }
2472
2473 const db = createDb(databaseUrl);
2474
2475 await seedSkills(db);
2476 await resolveUnresolvedSkills(db);
2477
2478 await db.$client.end();
2479}
2480
2481main().catch((error: unknown) => {
2482 logger.error(error, 'Failed to seed skills');
2483 process.exit(1);
2484});