Sifa professional network API (Fastify, AT Protocol, Jetstream) sifa.id/
at main 2484 lines 62 kB view raw
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});