diff --git a/cc-by-4.0.LICENSE b/cc-by-4.0.LICENSE new file mode 100644 index 0000000..0fb847e --- /dev/null +++ b/cc-by-4.0.LICENSE @@ -0,0 +1,395 @@ +Attribution 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution 4.0 International Public License ("Public License"). To the +extent this Public License may be interpreted as a contract, You are +granted the Licensed Rights in consideration of Your acceptance of +these terms and conditions, and the Licensor grants You such rights in +consideration of benefits the Licensor receives from making the +Licensed Material available under these terms and conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + d. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + e. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + f. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + g. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + h. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + i. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + j. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + k. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + 4. If You Share Adapted Material You produce, the Adapter's + License You apply must not prevent recipients of the Adapted + Material from complying with this Public License. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/website/README.md b/website/README.md index b28211a..56af344 100644 --- a/website/README.md +++ b/website/README.md @@ -1,6 +1,7 @@ -# Website +# AboutCode.org website -This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator. +The AboutCode.org website is built using [Docusaurus](https://docusaurus.io/), +a static website generator. ## Installation @@ -14,7 +15,8 @@ yarn yarn start ``` -This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. +This command starts a local development server and opens up a browser window. +Most changes are reflected live without having to restart the server. ## Build @@ -22,20 +24,10 @@ This command starts a local development server and opens up a browser window. Mo yarn build ``` -This command generates static content into the `build` directory and can be served using any static contents hosting service. +This command generates static content into the `build` directory and can be +served using any static contents hosting service. -## Deployment -Using SSH: +## License -```bash -USE_SSH=true yarn deploy -``` - -Not using SSH: - -```bash -GIT_USER= yarn deploy -``` - -If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. +CC-BY-SA-4.0 diff --git a/website/blog/agentic-scancode-port-case-study/2026-06-23-agentic-rust-port-case-study.md b/website/blog/agentic-scancode-port-case-study/2026-06-23-agentic-rust-port-case-study.md new file mode 100644 index 0000000..68fa2de --- /dev/null +++ b/website/blog/agentic-scancode-port-case-study/2026-06-23-agentic-rust-port-case-study.md @@ -0,0 +1,112 @@ +--- +slug: agentic-scancode-port-case-study +title: An AI agent ported our codebase from Python to Rust +authors: [pombredanne] +tags: [scancode, rust, agent, genai] +hide_table_of_contents: false +--- + +# An AI agent ported our codebase from Python to Rust + +## A case study, not an isolated incident + +ScanCode detects licenses, copyrights, package dependencies, vulnerabilities, and a few more things in both source code and binary files. The use cases include license and security compliance and software supply chain management. It is the product of over a decade of careful design, architecture, and testing by an open source community of over 700 contributors, supporting more than 40,000 automated tests covering license detection alone, and over 90,000 automated tests overall. + +The core module is ScanCode Toolkit, the industry-leading open source code scanning engine. In early 2026, an agentic LLM system ported ScanCode Toolkit, from Python to Rust, published the derived results under a name that infringed the ScanCode trademark, stripped copyright and license notices from both ScanCode and third-party code we vendored and carefully attributed, and started an outreach campaign, without ever engaging the AboutCode community. + +This incident is not isolated. AboutCode (and many other open source projects) are experiencing a steady influx of AI-generated issues and pull requests that are superficially plausible, templated, often duplicating existing reports, and almost never grounded in actual use of the software. Maintainers across the open source ecosystem call this AI slop. It consumes human triage time, degrades signal in issue trackers, and erodes the social contract between users, contributors, and maintainers. The porting incident described in this post is the same phenomenon at a larger scale and with higher stakes. + + + +This article documents what happened technically, what it reveals about the current state of AI-assisted development, and what the open source community needs to do when dealing with AI-generated code. + +## What the agent did + +The porting was driven by an LLM orchestration harness (using OpenCode and an OpenClaw-vibe coded OpenCode plugin). The agent's approach was straightforward: take a mature, well-tested Python codebase and refactor it in Rust. This is not an independent rewrite or inspired by ScanCode as it claims. It is a mechanical translation and it is exactly the kind of task LLMs are well-suited for. + +Why? Code translation is fundamentally like a language translation task, and Large Language Models (LLMs) were originally designed for such language tasks. The extensive ScanCode test suite provided the specification and the guide rails. The agent did not need to understand the algorithms; it only needed to produce code that passed the tests. + +This is worth repeating: A comprehensive test suite, decent documentation, and curated datasets is what makes automated porting possible. It is also what makes a codebase easier to replicate without understanding it. + +The agent's initial approach, using an existing Rust license-detection library, failed to match ScanCode's output quality. The agent then did what any translator would do when a loose paraphrase fails: it copied the original more closely. The final port reproduces ScanCode's core algorithms, code organization, and data-driven architecture in Rust, not because the agent understood them, but because it had enough training data and test feedback to converge on equivalent code. + +## Performance claims + +The Rust port published a "benchmark" that claimed 10x to 100x improvements in performance. Many benchmarks are fundamentally flawed because they are designed to document and assert their own tool's feature or performance superiority to help sell or promote that tool. + +Compiled Rust is capable of outperforming interpreted Python. In the published "benchmarks", the Rust port runs faster than ScanCode, but when checked it returns incorrect results, missing detections and skipping files. ScanCode runs the standard ScanCode test suite faster than the Rust port, even though the Rust port covers fewer tests. After applying optimization similar to what the Rust port did, ScanCode runs as fast or faster than the Rust port, while maintaining correctness, and attribution. + +Testing correctness or speed on a subset does not equate with superiority on the whole. + +This also demonstrates a core problem of AI-assisted software development. The agents replicated ScanCode's structure well enough to pass some tests, but not well enough to pass all tests. The port applied performance optimizations and caching strategies to appear faster, but sacrificing critical data correctness and completeness. + +## License and copyright failures + +ScanCode is Apache-2.0 licensed. The Apache open source license is among the most permissive available, with minimal requirements: + +1. Retain the original NOTICE file. +2. Preserve license and copyright headers, including in modified files. +3. Note changes made to modified files. +4. Do not reuse the project name without permission. + +The port violated all four requirements. Requirements 1 and 4 were partially corrected after ScanCode maintainers reached out. Requirements 2 and 3 were not. + +This impacts more than ScanCode itself and its authors and contributors. ScanCode incorporates code from dozens of other open source projects, each with its own license and copyright. We track all of this meticulously with origin files, per-file copyright headers, and attribution notices. The agent stripped all of it, extending the license violations to every upstream project whose code passed through ScanCode into the port. Note also that the Apache license is not graduated: you either comply or you are not licensed. As of this publication, the port is not compliant. + +The irony is not subtle. ScanCode is the product of the collective expertise of the compliance community, and is a tool that the industry uses to detect exactly this kind of license and copyright violation. + +## LLMs do not track provenance + +The most important technical observation is not about speed or correctness. It is about attribution. + +LLMs, by design, do not track provenance. When an agent translates code, it produces output. It does not record that the output derives from a specific file, authored by a specific contributor, under a specific license. That metadata is not part of the model's output representation. + +This is a structural problem, not a configuration issue. Agents copying from open source projects will strip attribution by default unless explicit post-processing steps are added to detect and preserve license headers and carefully track the code origin and license. No such steps were taken here. The result is that LLM-assisted porting, as currently practiced, is a plagiarism pipeline with no attribution layer. + +This obfuscation is not always passive. In reviewing the commit history and structure of the Rust port, there is evidence that the agent actively worked to distance the output from its source, either directly or steered through prompting. Variable names were changed, comments were rewritten or stripped, additional references to ported code lines added, and the claim of an "independent rewrite merely inspired by ScanCode" was baked into the project's framing from the start, based on evidence found in the generated code and the issue tracker. + +Prompting for originality does not produce originality. The agent was following instructions. If you prompt an agent to produce an "original implementation", it will generate whatever surface-level variation possible while the code underneath remains derived from the original project. It produces the appearance of originality, which is a worse outcome than straightforward copying because it is harder to detect. + +The same dynamic occurs at a smaller scale in everyday AI-assisted development. When a developer uses a code generation tool to produce a utility function, a parser, or a data structure, the generated code may closely reproduce implementation patterns from open source code present in the model's training data, without any indication of that lineage. Most developers do not know to check for this. Most tools do not flag it. + +This is a warning to both sides of the AI-assisted development discussion. For open source developers, your licenses and your contributors' credits are invisible to the agent. For developers producing AI-generated code, the output your tools produce may carry unresolved obligations to authors whose work was used without attribution. + +## This is a case study, not an isolated incident + +This episode is not primarily about one project or one set of actors. It is a preview of a pattern that will repeat across the open source ecosystem. + +The specific conditions that made ScanCode a target are the same conditions that characterize most successful open source projects: a mature codebase, comprehensive tests, plenty of documentation, lots of curated content, large downstream user base, an active community, and a well-known and trusted name. The tools and techniques used are becoming routine with AI-generated commits, contributions, and rewrites: agentic orchestration, automated issue crawling, and targeted community outreach. + +The human and social dimensions of this incident are as important, if not more important, as the technical ones. The agent crawled ScanCode's issue tracker and implemented old, outdated or incorrect features, such as a three-year-old feature request for yum database support, a tool that Fedora deprecated a decade ago and whose repository was archived in March 2026. The agent also reported the development of new features, but these features already exist in other AboutCode open source projects. + +This is what automated development without community context produces: technically functional work that is socially and strategically incoherent, creating mostly useless or redundant technical debt and bypassing the ecosystem domain expertise and collective wisdom needed to select which feature to implement. + +This is one of the less-discussed costs of AI slop at scale. It is not just noise, it is misdirected effort that consumes real resources on both sides. Maintainers spend time triaging and closing low-quality issues. Automated systems spend compute implementing stale or irrelevant features. Neither produces value. And the accumulated technical debt in cluttered issue trackers, undiscovered license violations, and replicated but misunderstood code falls on human maintainers to clean up. + +The community outreach campaign by the Rust port team contacting users to suggest replacing ScanCode reflects the same absence of community understanding. The Rust port developers never engaged ScanCode's public community channels, weekly meetings, or chatting with maintainers, until that campaign began. An automated system optimizing for adoption does not naturally model the trust relationships and collaborative norms that open source communities are built on. + +## Feedback for the community + +The path forward is not to litigate this one case. The path forward is to develop best practices. + +Benchmark suites and clear performance profiles matter more than ever, both to guide legitimate contributors and to provide ground truth against inflated claims. License compliance tooling, including tools like ScanCode, should be routinely applied to AI-generated contributions. Attribution gaps are not always intentional; they are often invisible without explicitly checking. And we are building more open source tools to help ensure open source authors are properly credited for their work. + +To open source maintainers, you should care for and protect the integrity of your brand, copyright, and license. With the cost of code generation reaching zero, this is your key asset. + +To developers using agentic coding tools, license and copyright compliance does not happen automatically. + +If your tooling generates code ported from or inspired by existing projects, you are responsible for the output's obligations. Build attribution checking into your workflow, not as an afterthought. + +AI and ML practitioners and enthusiasts, please understand that the open source projects you train on, benchmark against, and port from are maintained by communities. These communities are composed of people, and have norms, governance structures, contribution pathways, and years of accumulated context and domain expertise. + +Participating in these communities, before, during, and after building on their work, is not a formality. It is how the ecosystem that enables your work is sustained. The performance gains available in ScanCode come from that community's accumulated expertise. + +## Onwards and upwards: Taking the high road + +The open source community's response to AI-generated code cannot be purely defensive. We need to develop shared norms for attribution in agent-assisted development, better tooling for detecting and flagging provenance gaps, and clearer frameworks for what constitutes a derivative work versus an independent implementation. + +We also need practitioners on both sides of this conversation, open source maintainers and AI engineers, to work together to build those frameworks. That is harder than forking and porting a repository. It is also the only approach that scales. + +Building those frameworks begins with the next conversation, and that conversation is open to everyone. + +P.S. Detecting this kind of AI-assisted obfuscated porting is exactly the problem that motivated our recent AI-Generated Code Search project, now integrated into AboutCode MatchCode code matching engine. MatchCode is designed to identify code that has been structurally reproduced across language boundaries. This matches not just token-level similarity but also algorithmic and architectural similarities using fingerprints. If you are a maintainer concerned that your project may have been ported or replicated without attribution, it is worth joining us so we can assist you in running your codebase through MatchCode as a baseline. The tool exists precisely because provenance questions like this one are becoming more common. This is not a silver bullet, but it can help. diff --git a/website/blog/curated-licenses-public-database-scancode-licensedb/ScanCode-LicenseDB-1536x1085.png b/website/blog/curated-licenses-public-database-scancode-licensedb/ScanCode-LicenseDB-1536x1085.png deleted file mode 100644 index 963a81e..0000000 Binary files a/website/blog/curated-licenses-public-database-scancode-licensedb/ScanCode-LicenseDB-1536x1085.png and /dev/null differ diff --git a/website/blog/curated-licenses-public-database-scancode-licensedb/scancode-db-blog.png b/website/blog/curated-licenses-public-database-scancode-licensedb/scancode-db-blog.png deleted file mode 100644 index 088a8d1..0000000 Binary files a/website/blog/curated-licenses-public-database-scancode-licensedb/scancode-db-blog.png and /dev/null differ diff --git a/website/blog/purls-of-wisdom/atom_grey-1024x683.png b/website/blog/purls-of-wisdom/atom_grey-1024x683.png deleted file mode 100644 index 33c0f5a..0000000 Binary files a/website/blog/purls-of-wisdom/atom_grey-1024x683.png and /dev/null differ diff --git a/website/blog/purls-of-wisdom/standards_2x.png b/website/blog/purls-of-wisdom/standards_2x.png deleted file mode 100644 index e04c4b6..0000000 Binary files a/website/blog/purls-of-wisdom/standards_2x.png and /dev/null differ diff --git a/website/blog/tags.yml b/website/blog/tags.yml index e14823c..12fc951 100644 --- a/website/blog/tags.yml +++ b/website/blog/tags.yml @@ -3,6 +3,11 @@ advisories: permalink: /advisories description: advisories tag description +agent: + label: agent + permalink: /agent + description: agent tag description + api: label: api permalink: /api @@ -38,6 +43,11 @@ java: permalink: /java description: java tag description +genai: + label: GenAI + permalink: /genai + description: GenAI tag description + license clarity scoring: label: license clarity scoring permalink: /license clarity scoring @@ -63,6 +73,16 @@ SCA automation: permalink: /SCA automation description: SCA automation tag description +rust: + label: Rust + permalink: /rust + description: Rust tag description + +scancode: + label: ScanCode + permalink: /scancode + description: ScanCode tag description + vcio: label: vcio permalink: /vcio diff --git a/website/docs/getting_started/getting_started-compliance.md b/website/docs/getting_started/getting_started-compliance.md index 551fbe8..7bc87b4 100644 --- a/website/docs/getting_started/getting_started-compliance.md +++ b/website/docs/getting_started/getting_started-compliance.md @@ -39,7 +39,7 @@ reference database for the 2400 licenses detected by ScanCode. It is limited to public license texts but not to only those licenses that meet the OSI definition of open source. ScanCode's objective is to identify licenses regardless of whether they are open source, proprietary or in-between. Each license in the LicenseDB is labelled with a License Category, such as 'Copyleft', 'Permissive' or 'Public Domain'. -There are also other [AboutCode projects](/#scancode-projects) that are components or extensions of ScanCode. +There are also other [AboutCode projects](/projects/) that are components or extensions of ScanCode. ## Apply license usage policies The only feasible way to automate license compliance for third-party software @@ -109,5 +109,3 @@ includes an obligation to provide instructions and tools to build from source. You can use *DejaCode** to track Product packages or components that are subject to source redistribution obligations and their deployment/distribution status. **DejaCode** also provides reports to create a source redistribution checklist in case you receive a request for source. - - diff --git a/website/docs/getting_started/getting_started-getting-started.md b/website/docs/getting_started/getting_started-getting-started.md index 3be029d..e2c27d5 100644 --- a/website/docs/getting_started/getting_started-getting-started.md +++ b/website/docs/getting_started/getting_started-getting-started.md @@ -22,7 +22,7 @@ The use cases are grouped according to 3 major topics: If you already know which AboutCode projects you are interested in you can find project information in the **AboutCode Projects Overview** section of the -home page of this website. Each project card provides comprehensive project +Projects page of this website. Each project card provides comprehensive project information including: - Description - Documentation URL @@ -32,17 +32,17 @@ information including: - Platform The projects are presented in 5 categories: -- [Applications](/#application-projects): These projects offer an application +- [Applications](/projects/): These projects offer an application that you can install in the cloud or a local environment. -- [ScanCode](/#scancode-projects): These projects are components or extensions +- [ScanCode](/projects/): These projects are components or extensions of ScanCode. -- [Package-URL](/#purl-projects): These projects provide tools and data to +- [Package-URL](/projects/): These projects provide tools and data to support the use of the PURL (Package-URL) or VERS (Version Range Specifier) specifications. -- [Inspectors](/#inspectors): AboutCode Inspectors are special-purpose +- [Inspectors](/projects/): AboutCode Inspectors are special-purpose analysis tools. You can run them as a ScanCode Toolkit plugin, as steps in a ScanCode.io pipeline, or from the command line. -- [Libraries](/#libraries): AboutCode libraries are key building blocks for +- [Libraries](/projects/): AboutCode libraries are key building blocks for the AboutCode software and data stack - they have also been incorporated into other major FOSS projects and are available for use by anyone. diff --git a/website/docs/getting_started/getting_started-standards.md b/website/docs/getting_started/getting_started-standards.md new file mode 100644 index 0000000..b2c438c --- /dev/null +++ b/website/docs/getting_started/getting_started-standards.md @@ -0,0 +1,54 @@ +# Software Supply Chain Standards + +AboutCode is leading the way with simple and practical standards like PURL. +PURL is the common identifier across software supply chain standards, +making it possible to correlate and cross-reference data between SBOMs, +vulnerability databases, reports, advisories, attestations, and tools. + +## Standards created by AboutCode + +**Package-URL (PURL)**: a widely used standard to identify software +packages of any type with simple, readable and concise URLs. The PURL +standard is [ECMA-427](https://ecma-tc54.github.io/ECMA-427/). + +**VERS**: (Version Range Specification) is a standard scheme for expressing +version ranges of software packages in a consistent, parseable way across +all package ecosystems. VERS solves the problem of each ecosystem having its +own incompatible version range syntax. It is used in CycloneDX and CSAF to +express affected version ranges in vulnerability advisories and SBOMs. + +## SBOM standards + +**CycloneDX**: (OWASP CycloneDX) is a full-stack Bill of Materials (BOM) +standard ([ECMA-424](https://ecma-international.org/publications-and-standards/standards/ecma-424/)) +that provides advanced supply chain capabilities for cyber risk reduction. +Uses PURL and VERS. AboutCode is a core contributor. + +**SPDX**: (System Package Data Exchange) is a [specification](https://spdx.dev/use/specifications/) +for representing systems with software components as SBOMs +(Software Bill of Materials) and other AI, data and security references. +Uses PURL. Co-founded by AboutCode. + +## Security and vulnerability standards + +**CSAF**: (Common Security Advisory Framework) is an OASIS standard for +machine-readable security advisories. Uses PURL and VERS for product +identification and affected version ranges. + +**OpenVEX**: an implementation of VEX (Vulnerability Exploitability eXchange) +from OpenSSF for communicating vulnerability impact assessments. Uses PURL +for package identification. + +**MITRE CVE Schema**: the CVE Record format used by the MITRE CVE Program +to describe vulnerabilities. Uses PURL to identify affected software packages. + +**OSV**: (Open Source Vulnerabilities) is a distributed vulnerability database +schema from Google. Uses PURL to identify affected packages across ecosystems. + +## Other supply chain standards using PURL + +**CLE**: (Common Lifecycle Enumeration) is a standard for describing software +lifecycle stages. Uses PURL for package identification. + +**TEA**: (Transparent Exchange of Attestations) is a standard for software +supply chain attestations and trust. Uses PURL to reference attested packages. diff --git a/website/docs/intro.md b/website/docs/intro.md deleted file mode 100644 index 88f9571..0000000 --- a/website/docs/intro.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Tutorial Intro - -Let's discover **Docusaurus in less than 5 minutes**. - -## Getting Started - -Get started by **creating a new site**. - -Or **try Docusaurus immediately** with **[docusaurus.new](https://docusaurus.new)**. - -### What you'll need - -- [Node.js](https://nodejs.org/en/download/) version 20.0 or above: - - When installing Node.js, you are recommended to check all checkboxes related to dependencies. - -## Generate a new site - -Generate a new Docusaurus site using the **classic template**. - -The classic template will automatically be added to your project after you run the command: - -```bash -npm init docusaurus@latest my-website classic -``` - -You can type this command into Command Prompt, Powershell, Terminal, or any other integrated terminal of your code editor. - -The command also installs all necessary dependencies you need to run Docusaurus. - -## Start your site - -Run the development server: - -```bash -cd my-website -npm run start -``` - -The `cd` command changes the directory you're working with. In order to work with your newly created Docusaurus site, you'll need to navigate the terminal there. - -The `npm run start` command builds your website locally and serves it through a development server, ready for you to view at http://localhost:3000/. - -Open `docs/intro.md` (this page) and edit some lines: the site **reloads automatically** and displays your changes. diff --git a/website/docs/temp-supporter-home-link.md b/website/docs/temp-supporter-home-link.md deleted file mode 100644 index 80cf832..0000000 --- a/website/docs/temp-supporter-home-link.md +++ /dev/null @@ -1,3 +0,0 @@ -# Temporary demo page - -This page represents the homepage of the supporter whose card the user has just clicked. diff --git a/website/docs/tutorial-basics/_category_.json b/website/docs/tutorial-basics/_category_.json deleted file mode 100644 index 2e6db55..0000000 --- a/website/docs/tutorial-basics/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Tutorial - Basics", - "position": 2, - "link": { - "type": "generated-index", - "description": "5 minutes to learn the most important Docusaurus concepts." - } -} diff --git a/website/docs/tutorial-basics/congratulations.md b/website/docs/tutorial-basics/congratulations.md deleted file mode 100644 index 04771a0..0000000 --- a/website/docs/tutorial-basics/congratulations.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 6 ---- - -# Congratulations! - -You have just learned the **basics of Docusaurus** and made some changes to the **initial template**. - -Docusaurus has **much more to offer**! - -Have **5 more minutes**? Take a look at **[versioning](../tutorial-extras/manage-docs-versions.md)** and **[i18n](../tutorial-extras/translate-your-site.md)**. - -Anything **unclear** or **buggy** in this tutorial? [Please report it!](https://github.com/facebook/docusaurus/discussions/4610) - -## What's next? - -- Read the [official documentation](https://docusaurus.io/) -- Modify your site configuration with [`docusaurus.config.js`](https://docusaurus.io/docs/api/docusaurus-config) -- Add navbar and footer items with [`themeConfig`](https://docusaurus.io/docs/api/themes/configuration) -- Add a custom [Design and Layout](https://docusaurus.io/docs/styling-layout) -- Add a [search bar](https://docusaurus.io/docs/search) -- Find inspirations in the [Docusaurus showcase](https://docusaurus.io/showcase) -- Get involved in the [Docusaurus Community](https://docusaurus.io/community/support) diff --git a/website/docs/tutorial-basics/create-a-blog-post.md b/website/docs/tutorial-basics/create-a-blog-post.md deleted file mode 100644 index 550ae17..0000000 --- a/website/docs/tutorial-basics/create-a-blog-post.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -sidebar_position: 3 ---- - -# Create a Blog Post - -Docusaurus creates a **page for each blog post**, but also a **blog index page**, a **tag system**, an **RSS** feed... - -## Create your first Post - -Create a file at `blog/2021-02-28-greetings.md`: - -```md title="blog/2021-02-28-greetings.md" ---- -slug: greetings -title: Greetings! -authors: - - name: Joel Marcey - title: Co-creator of Docusaurus 1 - url: https://github.com/JoelMarcey - image_url: https://github.com/JoelMarcey.png - - name: Sébastien Lorber - title: Docusaurus maintainer - url: https://sebastienlorber.com - image_url: https://github.com/slorber.png -tags: [greetings] ---- - -Congratulations, you have made your first post! - -Feel free to play around and edit this post as much as you like. -``` - -A new blog post is now available at [http://localhost:3000/blog/greetings](http://localhost:3000/blog/greetings). diff --git a/website/docs/tutorial-basics/create-a-document.md b/website/docs/tutorial-basics/create-a-document.md deleted file mode 100644 index c22fe29..0000000 --- a/website/docs/tutorial-basics/create-a-document.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Create a Document - -Documents are **groups of pages** connected through: - -- a **sidebar** -- **previous/next navigation** -- **versioning** - -## Create your first Doc - -Create a Markdown file at `docs/hello.md`: - -```md title="docs/hello.md" -# Hello - -This is my **first Docusaurus document**! -``` - -A new document is now available at [http://localhost:3000/docs/hello](http://localhost:3000/docs/hello). - -## Configure the Sidebar - -Docusaurus automatically **creates a sidebar** from the `docs` folder. - -Add metadata to customize the sidebar label and position: - -```md title="docs/hello.md" {1-4} ---- -sidebar_label: 'Hi!' -sidebar_position: 3 ---- - -# Hello - -This is my **first Docusaurus document**! -``` - -It is also possible to create your sidebar explicitly in `sidebars.js`: - -```js title="sidebars.js" -export default { - tutorialSidebar: [ - 'intro', - // highlight-next-line - 'hello', - { - type: 'category', - label: 'Tutorial', - items: ['tutorial-basics/create-a-document'], - }, - ], -}; -``` diff --git a/website/docs/tutorial-basics/create-a-page.md b/website/docs/tutorial-basics/create-a-page.md deleted file mode 100644 index 20e2ac3..0000000 --- a/website/docs/tutorial-basics/create-a-page.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Create a Page - -Add **Markdown or React** files to `src/pages` to create a **standalone page**: - -- `src/pages/index.js` → `localhost:3000/` -- `src/pages/foo.md` → `localhost:3000/foo` -- `src/pages/foo/bar.js` → `localhost:3000/foo/bar` - -## Create your first React Page - -Create a file at `src/pages/my-react-page.js`: - -```jsx title="src/pages/my-react-page.js" -import React from 'react'; -import Layout from '@theme/Layout'; - -export default function MyReactPage() { - return ( - -

My React page

-

This is a React page

-
- ); -} -``` - -A new page is now available at [http://localhost:3000/my-react-page](http://localhost:3000/my-react-page). - -## Create your first Markdown Page - -Create a file at `src/pages/my-markdown-page.md`: - -```mdx title="src/pages/my-markdown-page.md" -# My Markdown page - -This is a Markdown page -``` - -A new page is now available at [http://localhost:3000/my-markdown-page](http://localhost:3000/my-markdown-page). diff --git a/website/docs/tutorial-basics/deploy-your-site.md b/website/docs/tutorial-basics/deploy-your-site.md deleted file mode 100644 index 1c50ee0..0000000 --- a/website/docs/tutorial-basics/deploy-your-site.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -sidebar_position: 5 ---- - -# Deploy your site - -Docusaurus is a **static-site-generator** (also called **[Jamstack](https://jamstack.org/)**). - -It builds your site as simple **static HTML, JavaScript and CSS files**. - -## Build your site - -Build your site **for production**: - -```bash -npm run build -``` - -The static files are generated in the `build` folder. - -## Deploy your site - -Test your production build locally: - -```bash -npm run serve -``` - -The `build` folder is now served at [http://localhost:3000/](http://localhost:3000/). - -You can now deploy the `build` folder **almost anywhere** easily, **for free** or very small cost (read the **[Deployment Guide](https://docusaurus.io/docs/deployment)**). diff --git a/website/docs/tutorial-basics/markdown-features.mdx b/website/docs/tutorial-basics/markdown-features.mdx deleted file mode 100644 index 35e0082..0000000 --- a/website/docs/tutorial-basics/markdown-features.mdx +++ /dev/null @@ -1,152 +0,0 @@ ---- -sidebar_position: 4 ---- - -# Markdown Features - -Docusaurus supports **[Markdown](https://daringfireball.net/projects/markdown/syntax)** and a few **additional features**. - -## Front Matter - -Markdown documents have metadata at the top called [Front Matter](https://jekyllrb.com/docs/front-matter/): - -```text title="my-doc.md" -// highlight-start ---- -id: my-doc-id -title: My document title -description: My document description -slug: /my-custom-url ---- -// highlight-end - -## Markdown heading - -Markdown text with [links](./hello.md) -``` - -## Links - -Regular Markdown links are supported, using url paths or relative file paths. - -```md -Let's see how to [Create a page](/create-a-page). -``` - -```md -Let's see how to [Create a page](./create-a-page.md). -``` - -**Result:** Let's see how to [Create a page](./create-a-page.md). - -## Images - -Regular Markdown images are supported. - -You can use absolute paths to reference images in the static directory (`static/img/docusaurus.png`): - -```md -![Docusaurus logo](/img/docusaurus.png) -``` - -![Docusaurus logo](/img/docusaurus.png) - -You can reference images relative to the current file as well. This is particularly useful to colocate images close to the Markdown files using them: - -```md -![Docusaurus logo](./img/docusaurus.png) -``` - -## Code Blocks - -Markdown code blocks are supported with Syntax highlighting. - -````md -```jsx title="src/components/HelloDocusaurus.js" -function HelloDocusaurus() { - return

Hello, Docusaurus!

; -} -``` -```` - -```jsx title="src/components/HelloDocusaurus.js" -function HelloDocusaurus() { - return

Hello, Docusaurus!

; -} -``` - -## Admonitions - -Docusaurus has a special syntax to create admonitions and callouts: - -```md -:::tip My tip - -Use this awesome feature option - -::: - -:::danger Take care - -This action is dangerous - -::: -``` - -:::tip My tip - -Use this awesome feature option - -::: - -:::danger Take care - -This action is dangerous - -::: - -## MDX and React Components - -[MDX](https://mdxjs.com/) can make your documentation more **interactive** and allows using any **React components inside Markdown**: - -```jsx -export const Highlight = ({children, color}) => ( - { - alert(`You clicked the color ${color} with label ${children}`) - }}> - {children} - -); - -This is Docusaurus green ! - -This is Facebook blue ! -``` - -export const Highlight = ({children, color}) => ( - { - alert(`You clicked the color ${color} with label ${children}`); - }}> - {children} - -); - -This is Docusaurus green ! - -This is Facebook blue ! diff --git a/website/docs/tutorial-extras/_category_.json b/website/docs/tutorial-extras/_category_.json deleted file mode 100644 index a8ffcc1..0000000 --- a/website/docs/tutorial-extras/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "Tutorial - Extras", - "position": 3, - "link": { - "type": "generated-index" - } -} diff --git a/website/docs/tutorial-extras/img/docsVersionDropdown.png b/website/docs/tutorial-extras/img/docsVersionDropdown.png deleted file mode 100644 index 97e4164..0000000 Binary files a/website/docs/tutorial-extras/img/docsVersionDropdown.png and /dev/null differ diff --git a/website/docs/tutorial-extras/img/localeDropdown.png b/website/docs/tutorial-extras/img/localeDropdown.png deleted file mode 100644 index e257edc..0000000 Binary files a/website/docs/tutorial-extras/img/localeDropdown.png and /dev/null differ diff --git a/website/docs/tutorial-extras/manage-docs-versions.md b/website/docs/tutorial-extras/manage-docs-versions.md deleted file mode 100644 index ccda0b9..0000000 --- a/website/docs/tutorial-extras/manage-docs-versions.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Manage Docs Versions - -Docusaurus can manage multiple versions of your docs. - -## Create a docs version - -Release a version 1.0 of your project: - -```bash -npm run docusaurus docs:version 1.0 -``` - -The `docs` folder is copied into `versioned_docs/version-1.0` and `versions.json` is created. - -Your docs now have 2 versions: - -- `1.0` at `http://localhost:3000/docs/` for the version 1.0 docs -- `current` at `http://localhost:3000/docs/next/` for the **upcoming, unreleased docs** - -## Add a Version Dropdown - -To navigate seamlessly across versions, add a version dropdown. - -Modify the `docusaurus.config.js` file: - -```js title="docusaurus.config.js" -export default { - themeConfig: { - navbar: { - items: [ - // highlight-start - { - type: 'docsVersionDropdown', - }, - // highlight-end - ], - }, - }, -}; -``` - -The docs version dropdown appears in your navbar: - -![Docs Version Dropdown](./img/docsVersionDropdown.png) - -## Update an existing version - -It is possible to edit versioned docs in their respective folder: - -- `versioned_docs/version-1.0/hello.md` updates `http://localhost:3000/docs/hello` -- `docs/hello.md` updates `http://localhost:3000/docs/next/hello` diff --git a/website/docs/tutorial-extras/translate-your-site.md b/website/docs/tutorial-extras/translate-your-site.md deleted file mode 100644 index b5a644a..0000000 --- a/website/docs/tutorial-extras/translate-your-site.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Translate your site - -Let's translate `docs/intro.md` to French. - -## Configure i18n - -Modify `docusaurus.config.js` to add support for the `fr` locale: - -```js title="docusaurus.config.js" -export default { - i18n: { - defaultLocale: 'en', - locales: ['en', 'fr'], - }, -}; -``` - -## Translate a doc - -Copy the `docs/intro.md` file to the `i18n/fr` folder: - -```bash -mkdir -p i18n/fr/docusaurus-plugin-content-docs/current/ - -cp docs/intro.md i18n/fr/docusaurus-plugin-content-docs/current/intro.md -``` - -Translate `i18n/fr/docusaurus-plugin-content-docs/current/intro.md` in French. - -## Start your localized site - -Start your site on the French locale: - -```bash -npm run start -- --locale fr -``` - -Your localized site is accessible at [http://localhost:3000/fr/](http://localhost:3000/fr/) and the `Getting Started` page is translated. - -:::caution - -In development, you can only use one locale at a time. - -::: - -## Add a Locale Dropdown - -To navigate seamlessly across languages, add a locale dropdown. - -Modify the `docusaurus.config.js` file: - -```js title="docusaurus.config.js" -export default { - themeConfig: { - navbar: { - items: [ - // highlight-start - { - type: 'localeDropdown', - }, - // highlight-end - ], - }, - }, -}; -``` - -The locale dropdown now appears in your navbar: - -![Locale Dropdown](./img/localeDropdown.png) - -## Build your localized site - -Build your site for a specific locale: - -```bash -npm run build -- --locale fr -``` - -Or build your site to include all the locales at once: - -```bash -npm run build -``` diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 4a77abd..d8ea4bf 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -39,7 +39,7 @@ const currentBaseUrl = siteConfig[deployTarget].baseUrl const config = { title: 'AboutCode.org', tagline: '[Tagline . . . ?]', - favicon: 'img/nexB_icon.png', + favicon: 'img/favicon.ico', markdown: { format: 'detect', // Auto-detects: .md = plain Markdown (CommonMark), .mdx = MDX @@ -56,7 +56,7 @@ const config = { // Adapt the www.packageurl.org approach for the GH Pages vs. DreamHost baseUrl adjustment. url: siteConfig[deployTarget].url, baseUrl: siteConfig[deployTarget].baseUrl, - trailingSlash: false, + trailingSlash: true, onBrokenLinks: 'throw', // The following is deprecated, to be removed in v4, replaced with similar structure above under 'markdown:'. @@ -108,42 +108,57 @@ const config = { themeConfig: /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ ({ - // Replace with your project's social card - // image: 'img/docusaurus-social-card.jpg', // colorMode: { // respectPrefersColorScheme: true, // }, navbar: { logo: { alt: 'www.aboutcode.org Logo', - src: 'img/AboutCode-logo-stackedv3.png', + src: 'img/AboutCode.svg', }, style: 'dark', items: [ - { to: '/', label: 'Home', position: 'left', exact: true }, { - type: 'docSidebar', - sidebarId: 'getting_started', + type: 'dropdown', + label: 'Documentation', position: 'left', - label: 'Getting Started', + items: [ + { + type: 'docSidebar', + sidebarId: 'getting_started', + label: 'Getting Started', + }, + { + href: 'https://aboutcode.readthedocs.io', + label: 'Reference', + }, + ], }, + { to: '/blog', label: 'Blog', position: 'left' }, { - type: 'docSidebar', - sidebarId: 'about', + type: 'dropdown', + label: 'Community', position: 'left', - label: 'About', + items: [ + { to: '/docs/about/about-contribute', label: 'Contribute' }, + { to: '/docs/about/about-meetings', label: 'Meetings' }, + { to: '/docs/about/about-news', label: 'News' }, + { to: '/docs/about/about-events', label: 'Events' }, + { + href: 'https://join.slack.com/t/aboutcode-org/shared_invite/zt-1paqwxccw-IuafuiAvYJFkTqGaZsC1og', + label: 'Slack', + }, + { + href: 'https://github.com/aboutcode-org', + label: 'GitHub', + }, + ], }, - { to: '/blog', label: 'Blog', position: 'left' }, { - href: 'https://github.com/aboutcode-org/www.aboutcode.org', + href: 'https://github.com/aboutcode-org', label: 'GitHub', position: 'right', }, - { - href: 'https://join.slack.com/t/aboutcode-org/shared_invite/zt-1paqwxccw-IuafuiAvYJFkTqGaZsC1og', - label: 'Slack', - position: 'right', - }, ], }, footer: { diff --git a/website/make-relative.js b/website/make-relative.js new file mode 100644 index 0000000..ba070f8 --- /dev/null +++ b/website/make-relative.js @@ -0,0 +1,40 @@ +#!/usr/bin/env node +// Post-build script: rewrite absolute paths to relative paths in HTML files +// so the site can be browsed via file:// without a server. + +const fs = require('fs'); +const path = require('path'); + +const buildDir = path.join(__dirname, 'build'); + +function getRelativePrefix(filePath) { + const rel = path.relative(path.dirname(filePath), buildDir); + if (rel === '') return './'; + return rel.replace(/\\/g, '/') + '/'; +} + +function processFile(filePath) { + let content = fs.readFileSync(filePath, 'utf8'); + const prefix = getRelativePrefix(filePath); + + // Replace absolute paths starting with / (but not //) with relative prefix + content = content.replace(/(href|src|action)="\/(?!\/)/g, `$1="${prefix}`); + content = content.replace(/url\(\/(?!\/)/g, `url(${prefix}`); + + fs.writeFileSync(filePath, content, 'utf8'); +} + +function walk(dir) { + const entries = fs.readdirSync(dir, { withFileTypes: true }); + for (const entry of entries) { + const full = path.join(dir, entry.name); + if (entry.isDirectory()) { + walk(full); + } else if (entry.name.endsWith('.html')) { + processFile(full); + } + } +} + +walk(buildDir); +console.log('All HTML paths converted to relative.'); diff --git a/website/sidebars.js b/website/sidebars.js index 426f3d5..126d7d9 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -18,6 +18,7 @@ const sidebars = { 'getting_started/getting_started-security', 'getting_started/getting_started-compliance', 'getting_started/getting_started-cravex', + 'getting_started/getting_started-standards', ], }; diff --git a/website/src/components/AdoptersBanner/index.js b/website/src/components/AdoptersBanner/index.js new file mode 100644 index 0000000..d464fa7 --- /dev/null +++ b/website/src/components/AdoptersBanner/index.js @@ -0,0 +1,128 @@ +import React from 'react'; +import styles from './styles.module.css'; + +const adopters = [ + { name: 'Apache Software Foundation', url: 'https://www.apache.org', logo: 'img/logos/apache.svg' }, + { name: 'Adobe', url: 'https://www.adobe.com' }, + { name: 'CSAF', url: 'https://csaf.io', logo: 'img/logos/csaf.png' }, + { name: 'Amazon', url: 'https://www.amazon.com' }, + { name: 'CVE', url: 'https://www.cve.org', logo: 'img/logos/cve.svg' }, + { name: 'Anchore', url: 'https://anchore.com' }, + { name: 'ClearlyDefined', url: 'https://clearlydefined.io', logo: 'img/logos/clearlydefined.png' }, + { name: 'Apple', url: 'https://www.apple.com' }, + { name: 'CycloneDX', url: 'https://cyclonedx.org', logo: 'img/logos/cyclonedx.png' }, + { name: 'Audi', url: 'https://www.audi.com' }, + { name: 'Dependency-Track', url: 'https://dependencytrack.org', logo: 'img/logos/dependency-track.svg' }, + { name: 'BANG', url: 'https://github.com/armijnhemel/binaryanalysis-ng' }, + { name: 'Eclipse Apoapsis', url: 'https://projects.eclipse.org/projects/technology.apoapsis', logo: 'img/logos/eclipse-apoapsis.png' }, + { name: 'BMW', url: 'https://www.bmw.com' }, + { name: 'Eclipse Foundation', url: 'https://www.eclipse.org', logo: 'img/logos/eclipse-foundation.svg' }, + { name: 'Bosch', url: 'https://www.bosch.com' }, + { name: 'Erlang Ecosystem Foundation', url: 'https://erlef.org', logo: 'img/logos/erlang-ecosystem.png' }, + { name: 'BlackDuck Software', url: 'https://www.blackduck.com' }, + { name: 'Ecosyste.ms', url: 'https://ecosyste.ms', logo: 'img/logos/ecosystems.png' }, + { name: 'CARIAD', url: 'https://cariad.technology' }, + { name: 'FOSSLight', url: 'https://fosslight.org', logo: 'img/logos/fosslight.png' }, + { name: 'Chainguard', url: 'https://www.chainguard.dev' }, + { name: 'FSFE', url: 'https://fsfe.org', logo: 'img/logos/fsfe.svg' }, + { name: 'Checkmarx', url: 'https://checkmarx.com' }, + { name: 'FOSSology', url: 'https://www.fossology.org', logo: 'img/logos/fossology.png' }, + { name: 'Citi', url: 'https://www.citigroup.com' }, + { name: 'Google OSV', url: 'https://osv.dev', logo: 'img/logos/osv.svg' }, + { name: 'Cisco', url: 'https://www.cisco.com' }, + { name: 'Grype', url: 'https://github.com/anchore/grype', logo: 'img/logos/grype.png' }, + { name: 'CIRCL.lu', url: 'https://www.circl.lu' }, + { name: 'Hugging Face', url: 'https://huggingface.co', logo: 'img/logos/huggingface.svg' }, + { name: 'deps.dev', url: 'https://deps.dev' }, + { name: 'Linux Foundation', url: 'https://www.linuxfoundation.org', logo: 'img/logos/linux-foundation.svg' }, + { name: 'Deutsche Bahn', url: 'https://www.deutschebahn.com' }, + { name: 'OpenChain', url: 'https://www.openchainproject.org', logo: 'img/logos/openchain.png' }, + { name: 'Endor Labs', url: 'https://www.endorlabs.com' }, + { name: 'OpenSSF', url: 'https://openssf.org', logo: 'img/logos/openssf.png' }, + { name: 'Ericsson', url: 'https://www.ericsson.com' }, + { name: 'OpenSSF GUAC', url: 'https://guac.sh', logo: 'img/logos/guac.png' }, + { name: 'FSF', url: 'https://www.fsf.org' }, + { name: 'OW2', url: 'https://www.ow2.org', logo: 'img/logos/ow2.png' }, + { name: 'Fujitsu', url: 'https://www.fujitsu.com' }, + { name: 'OWASP', url: 'https://owasp.org', logo: 'img/logos/owasp.png' }, + { name: 'GitHub', url: 'https://github.com' }, + { name: 'OpenVEX', url: 'https://openvex.dev', logo: 'img/logos/openvex.png' }, + { name: 'Google', url: 'https://www.google.com' }, + { name: 'ORT', url: 'https://oss-review-toolkit.org', logo: 'img/logos/ort.png' }, + { name: 'HERE', url: 'https://www.here.com' }, + { name: 'OSI', url: 'https://opensource.org', logo: 'img/logos/osi.png' }, + { name: 'Huawei', url: 'https://www.huawei.com' }, + { name: 'OSSelot', url: 'https://www.osselot.org', logo: 'img/logos/osselot.svg' }, + { name: 'HPE', url: 'https://www.hpe.com' }, + { name: 'OSSIndex', url: 'https://ossindex.sonatype.org', logo: 'img/logos/ossindex.png' }, + { name: 'IBM', url: 'https://www.ibm.com' }, + { name: 'OSS Compass', url: 'https://oss-compass.org', logo: 'img/logos/oss-compass.png' }, + { name: 'LG', url: 'https://www.lg.com' }, + { name: 'Rust Foundation', url: 'https://foundation.rust-lang.org', logo: 'img/logos/rust-foundation.png' }, + { name: 'Liferay', url: 'https://www.liferay.com' }, + { name: 'REUSE.software', url: 'https://reuse.software', logo: 'img/logos/reuse.png' }, + { name: 'Maven Central', url: 'https://central.sonatype.com' }, + { name: 'SCANOSS', url: 'https://www.scanoss.com', logo: 'img/logos/scanoss.png' }, + { name: 'Mend', url: 'https://www.mend.io' }, + { name: 'Software Heritage', url: 'https://www.softwareheritage.org', logo: 'img/logos/software-heritage.png' }, + { name: 'Mercedes-Benz', url: 'https://www.mercedes-benz.com' }, + { name: 'SPDX', url: 'https://spdx.dev', logo: 'img/logos/spdx.png' }, + { name: 'Meta', url: 'https://about.meta.com' }, + { name: 'Syft', url: 'https://github.com/anchore/syft', logo: 'img/logos/syft.png' }, + { name: 'Microsoft', url: 'https://www.microsoft.com' }, + { name: 'SW360', url: 'https://www.eclipse.org/sw360/', logo: 'img/logos/sw360.svg' }, + { name: 'Nokia', url: 'https://www.nokia.com' }, + { name: 'Trivy', url: 'https://trivy.dev', logo: 'img/logos/trivy.png' }, + { name: 'OpenRails', url: 'https://openrails.org' }, + { name: 'Oracle', url: 'https://www.oracle.com' }, + { name: 'Orange', url: 'https://www.orange.com' }, + { name: 'OSADL', url: 'https://www.osadl.org' }, + { name: 'Porsche', url: 'https://www.porsche.com' }, + { name: 'Qualcomm', url: 'https://www.qualcomm.com' }, + { name: 'Red Hat', url: 'https://www.redhat.com' }, + { name: 'ReversingLabs', url: 'https://www.reversinglabs.com' }, + { name: 'Saab', url: 'https://www.saab.com' }, + { name: 'Samsung', url: 'https://www.samsung.com' }, + { name: 'SAP', url: 'https://www.sap.com' }, + { name: 'ServiceNow', url: 'https://www.servicenow.com' }, + { name: 'Siemens', url: 'https://www.siemens.com' }, + { name: 'Siemens Healthineers', url: 'https://www.siemens-healthineers.com' }, + { name: 'Snyk', url: 'https://snyk.io' }, + { name: 'SODGE IT', url: 'https://www.sodge-it.com' }, + { name: 'Sony', url: 'https://www.sony.com' }, + { name: 'Sonatype', url: 'https://www.sonatype.com' }, + { name: 'Veracode', url: 'https://www.veracode.com' }, + { name: 'Verizon', url: 'https://www.verizon.com' }, + { name: 'VMware', url: 'https://www.vmware.com' }, + { name: 'Volkswagen', url: 'https://www.volkswagen.com' }, + { name: 'VulnCheck', url: 'https://vulncheck.com' }, + { name: 'Wiz', url: 'https://www.wiz.io' }, + { name: 'Zeiss', url: 'https://www.zeiss.com' }, +]; + +export default function AdoptersBanner() { + return ( +
+
+ {adopters.map((a) => ( + + {a.logo ? ( + {a.name} + ) : ( + {a.name} + )} + + ))} + {adopters.map((a) => ( + + {a.logo ? ( + {a.name} + ) : ( + {a.name} + )} + + ))} +
+
+ ); +} diff --git a/website/src/components/AdoptersBanner/styles.module.css b/website/src/components/AdoptersBanner/styles.module.css new file mode 100644 index 0000000..e7b978d --- /dev/null +++ b/website/src/components/AdoptersBanner/styles.module.css @@ -0,0 +1,70 @@ +.bannerWrapper { + overflow: hidden; + width: 100%; + max-width: 1200px; + margin: 1rem auto; + padding: 1rem 0; + mask-image: linear-gradient(to right, transparent, black 5%, black 95%, transparent); + -webkit-mask-image: linear-gradient(to right, transparent, black 5%, black 95%, transparent); +} + +.bannerTrack { + display: flex; + align-items: center; + gap: 1rem; + width: max-content; + animation: scroll 480s linear infinite; +} + +.bannerTrack:hover { + animation-play-state: paused; +} + +.adopter { + display: inline-flex; + align-items: center; + justify-content: center; + white-space: nowrap; + padding: 0.5rem 1.25rem; + border-radius: 6px; + border: 1px solid #e0e6ef; + background: var(--ifm-background-surface-color); + text-decoration: none; + flex-shrink: 0; + min-height: 48px; +} + +[data-theme='dark'] .adopter { + border-color: #3a4a6e; +} + +.adopter:hover { + border-color: #2a6bc7; + text-decoration: none; +} + +.adopterLogo { + height: 28px; + width: auto; + max-width: 140px; + object-fit: contain; +} + +.adopterName { + font-size: 0.9rem; + font-weight: 500; + color: #2b3a5e; +} + +[data-theme='dark'] .adopterName { + color: #c8d0e0; +} + +@keyframes scroll { + 0% { + transform: translateX(0); + } + 100% { + transform: translateX(-50%); + } +} diff --git a/website/src/components/CapabilitiesGrid/index.js b/website/src/components/CapabilitiesGrid/index.js new file mode 100644 index 0000000..af5cf48 --- /dev/null +++ b/website/src/components/CapabilitiesGrid/index.js @@ -0,0 +1,48 @@ +import React from 'react'; +import styles from './styles.module.css'; + +const capabilities = [ + { + title: 'Open Reference Data', + description: 'Curated datasets for 2,400+ licenses, millions of packages, and aggregated vulnerability data from dozens of public sources.', + link: '/docs/getting_started/getting_started-software-identification/', + }, + { + title: 'License Detection', + description: 'Detect licenses in any codebase, whether open source, proprietary, or in between. Powers dozens of open source and commercial SCA tools.', + link: '/docs/getting_started/getting_started-compliance/', + }, + { + title: 'Code Matching and Binary Analysis', + description: 'Identify code origin at package, file, and snippet level using PurlDB fingerprints. Match deployed binaries, containers, and firmware back to source packages.', + link: '/docs/getting_started/getting_started-software-identification/', + }, + { + title: 'Dependency Management', + description: 'Resolve direct and transitive dependencies across package ecosystems with ScanCode pipelines and dedicated inspectors.', + link: '/docs/getting_started/getting_started-software-identification/', + }, + { + title: 'Vulnerability Management', + description: 'Aggregate vulnerability data, map to affected packages, identify fixes, and score exploitability and risk for triage.', + link: '/docs/getting_started/getting_started-security/', + }, + { + title: 'SBOMs and Compliance', + description: 'Generate and manage SBOMs in CycloneDX and SPDX. Meet CRA requirements with automated VEX reporting and vulnerability tracking.', + link: '/docs/getting_started/getting_started-cravex/', + }, +]; + +export default function CapabilitiesGrid() { + return ( +
+ {capabilities.map((cap) => ( + +

{cap.title}

+

{cap.description}

+
+ ))} +
+ ); +} diff --git a/website/src/components/CapabilitiesGrid/styles.module.css b/website/src/components/CapabilitiesGrid/styles.module.css new file mode 100644 index 0000000..a9ab0f5 --- /dev/null +++ b/website/src/components/CapabilitiesGrid/styles.module.css @@ -0,0 +1,41 @@ +.grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: 1.25rem; + max-width: 1200px; + margin: 1.5rem auto; + padding: 0; +} + +.card { + display: flex; + flex-direction: column; + padding: 1.25rem; + border: 1px solid #e0e6ef; + border-radius: 8px; + background: var(--ifm-background-surface-color); + text-decoration: none; + color: inherit; + transition: transform 0.15s ease, box-shadow 0.15s ease, border-color 0.15s ease; +} + +.card:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + border-color: #2a6bc7; + text-decoration: none; + color: inherit; +} + +.cardTitle { + margin: 0 0 0.5rem 0; + font-size: 1.1rem; + color: #2a6bc7; +} + +.cardDescription { + margin: 0; + font-size: 0.9rem; + line-height: 1.4; + color: var(--ifm-font-color-base); +} diff --git a/website/src/components/EcosystemGrid/index.js b/website/src/components/EcosystemGrid/index.js new file mode 100644 index 0000000..5f771b4 --- /dev/null +++ b/website/src/components/EcosystemGrid/index.js @@ -0,0 +1,117 @@ +import React from 'react'; +import styles from './styles.module.css'; + +const ecosystemAndLanguageItems = [ + { label: 'Alpine', logo: 'img/logos/apk.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/apk-definition' }, + { label: 'Arch Linux', logo: 'img/logos/alpm.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/alpm-definition' }, + { label: 'Bazel', logo: 'img/logos/bazel.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/bazel-definition' }, + { label: 'Bitbucket', logo: 'img/logos/bitbucket.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/bitbucket-definition' }, + { label: 'Bitnami', logo: 'img/logos/bitnami.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/bitnami-definition' }, + { label: 'Bower', logo: 'img/logos/bower.png', url: 'https://bower.io' }, + { label: 'Cargo', logo: 'img/logos/cargo.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/cargo-definition' }, + { label: 'Chef', logo: 'img/logos/chef.png', url: 'https://www.chef.io' }, + { label: 'CocoaPods', logo: 'img/logos/cocoapods.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/cocoapods-definition' }, + { label: 'Composer', logo: 'img/logos/composer.jpg', url: 'https://packageurl.org/docs/purl-spec/types-doc/composer-definition' }, + { label: 'Conan', logo: 'img/logos/conan.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/conan-definition' }, + { label: 'Conda', logo: 'img/logos/conda.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/conda-definition' }, + { label: 'CPAN', logo: 'img/logos/cpan.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/cpan-definition' }, + { label: 'CRAN', logo: 'img/logos/cran.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/cran-definition' }, + { label: 'Debian / Ubuntu', logo: 'img/logos/deb.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/deb-definition' }, + { label: 'Docker', logo: 'img/logos/docker.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/docker-definition' }, + { label: 'F-Droid', logo: 'img/logos/fdroid.png', url: 'https://f-droid.org' }, + { label: 'FreeBSD', logo: 'img/logos/freebsd.png', url: 'https://www.freebsd.org/ports/' }, + { label: 'Gentoo', logo: 'img/logos/gentoo.png', url: 'https://packages.gentoo.org' }, + { label: 'GitHub', logo: 'img/logos/github.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/github-definition' }, + { label: 'Hackage', logo: 'img/logos/hackage.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/hackage-definition' }, + { label: 'Hex', logo: 'img/logos/hex.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/hex-definition' }, + { label: 'Hugging Face', logo: 'img/logos/huggingface.svg', url: 'https://packageurl.org/docs/purl-spec/types-doc/huggingface-definition' }, + { label: 'Julia', logo: 'img/logos/julia.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/julia-definition' }, + { label: 'LuaRocks', logo: 'img/logos/luarocks.svg', url: 'https://packageurl.org/docs/purl-spec/types-doc/luarocks-definition' }, + { label: 'Maven', logo: 'img/logos/maven.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/maven-definition' }, + { label: 'MLflow', logo: 'img/logos/mlflow.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/mlflow-definition' }, + { label: 'npm', logo: 'img/logos/npm.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/npm-definition' }, + { label: 'NuGet', logo: 'img/logos/nuget.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/nuget-definition' }, + { label: 'OCI', logo: 'img/logos/oci.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/oci-definition' }, + { label: 'opam', logo: 'img/logos/opam.svg', url: 'https://packageurl.org/docs/purl-spec/types-doc/opam-definition' }, + { label: 'OpenWrt', logo: 'img/logos/openwrt.png', url: 'https://openwrt.org' }, + { label: 'OTP', logo: 'img/logos/otp.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/otp-definition' }, + { label: 'Pub', logo: 'img/logos/pub.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/pub-definition' }, + { label: 'PyPI', logo: 'img/logos/pypi.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/pypi-definition' }, + { label: 'RPM', logo: 'img/logos/rpm.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/rpm-definition' }, + { label: 'RubyGems', logo: 'img/logos/gem.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/gem-definition' }, + { label: 'Swift', logo: 'img/logos/swift.svg', url: 'https://packageurl.org/docs/purl-spec/types-doc/swift-definition' }, + { label: 'Yocto', logo: 'img/logos/yocto.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/yocto-definition' }, + { label: 'Go', logo: 'img/logos/golang.png', url: 'https://packageurl.org/docs/purl-spec/types-doc/golang-definition' }, + { label: 'Haxe', logo: 'img/logos/haxe.png', url: 'https://lib.haxe.org' }, + { label: 'Raku', logo: 'img/logos/raku.svg', url: 'https://raku.org' }, +]; + +const vulnSources = [ + { label: 'Alpine Security', logo: 'img/logos/apk.png', url: 'https://secdb.alpinelinux.org' }, + { label: 'Apache HTTPD', logo: 'img/logos/apache.svg', url: 'https://httpd.apache.org/security/', logoClass: 'logoWideLarge' }, + { label: 'Apache Kafka', logo: 'img/logos/apache.svg', url: 'https://kafka.apache.org/cve-list', logoClass: 'logoWideLarge' }, + { label: 'Apache Tomcat', logo: 'img/logos/apache.svg', url: 'https://tomcat.apache.org/security.html', logoClass: 'logoWideLarge' }, + { label: 'Arch Linux', logo: 'img/logos/alpm.png', url: 'https://security.archlinux.org', logoClass: 'logoLarge' }, + { label: 'curl', logo: 'img/logos/curl.svg', url: 'https://curl.se/docs/security.html', logoClass: 'logoWideLarge' }, + { label: 'Debian Security', logo: 'img/logos/deb.png', url: 'https://security-tracker.debian.org' }, + { label: 'Elixir Advisories', logo: 'img/logos/elixir.png', url: 'https://github.com/dependabot/elixir-security-advisories', logoClass: 'logoLarge' }, + { label: 'EPSS', logo: 'img/logos/epss.png', url: 'https://www.first.org/epss/' }, + { label: 'Gentoo GLSA', logo: 'img/logos/gentoo.png', url: 'https://security.gentoo.org' }, + { label: 'GitHub Advisories', logo: 'img/logos/github.png', url: 'https://github.com/advisories' }, + { label: 'GitLab Advisories', logo: 'img/logos/gitlab.png', url: 'https://advisories.gitlab.com' }, + { label: 'Istio', logo: 'img/logos/istio.png', url: 'https://istio.io/latest/news/security/' }, + { label: 'Mattermost', logo: 'img/logos/mattermost.png', url: 'https://mattermost.com/security-updates/' }, + { label: 'Mozilla', logo: 'img/logos/mozilla.svg', url: 'https://www.mozilla.org/en-US/security/advisories/' }, + { label: 'NVD', logo: 'img/logos/nvd.png', url: 'https://nvd.nist.gov' }, + { label: 'OpenSSL', logo: 'img/logos/openssl.png', url: 'https://www.openssl.org/news/vulnerabilities.html' }, + { label: 'OSS-Fuzz', logo: 'img/logos/ossfuzz.png', url: 'https://google.github.io/oss-fuzz/' }, + { label: 'OSV.dev', logo: 'img/logos/osv.svg', url: 'https://osv.dev', logoClass: 'logoWideLarge' }, + { label: 'PostgreSQL', logo: 'img/logos/postgresql.svg', url: 'https://www.postgresql.org/support/security/' }, + { label: 'PyPA', logo: 'img/logos/pypi.png', url: 'https://github.com/pypa/advisory-database' }, + { label: 'Red Hat', logo: 'img/logos/redhat.png', url: 'https://access.redhat.com/security/security-updates/' }, + { label: 'Ruby Advisory DB', logo: 'img/logos/gem.png', url: 'https://github.com/rubysec/ruby-advisory-db' }, + { label: 'Rust Advisory DB', logo: 'img/logos/cargo.png', url: 'https://github.com/rustsec/advisory-db' }, + { label: 'SUSE', logo: 'img/logos/suse.svg', url: 'https://www.suse.com/security/', logoClass: 'logoWideLarge' }, + { label: 'Ubuntu USN', logo: 'img/logos/ubuntu.svg', url: 'https://ubuntu.com/security/notices', logoClass: 'ubuntuLogo' }, + { label: 'Vulnrichment (CISA)', logo: 'img/logos/cisa.png', url: 'https://github.com/cisagov/vulnrichment' }, + { label: 'Xen', logo: 'img/logos/xen.png', url: 'https://xenbits.xen.org/xsa/' }, +]; + +function GridSection({ title, items }) { + return ( +
+

{title}

+
+ {items.map((item) => ( + +
+ {item.logo && ( + {item.label} + )} +
+ {item.label} +
+ ))} +
+
+ ); +} + +export default function EcosystemGrid() { + return ( +
+ + +
+ ); +} diff --git a/website/src/components/EcosystemGrid/styles.module.css b/website/src/components/EcosystemGrid/styles.module.css new file mode 100644 index 0000000..8a213b0 --- /dev/null +++ b/website/src/components/EcosystemGrid/styles.module.css @@ -0,0 +1,103 @@ +.gridWrapper { + max-width: 1200px; + margin: 1rem auto; + padding: 0; +} + +.section { + margin-bottom: 1.5rem; +} + +.sectionTitle { + color: #2a6bc7; + font-size: 1rem; + margin-bottom: 0.75rem; +} + +.grid { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; + gap: 0.5rem; + background: #f7f7f7; + border-radius: 8px; + padding: 1rem; + box-shadow: inset 0 10px 20px -10px rgba(0, 0, 0, 0.04); +} + +[data-theme='dark'] .grid { + background: #1e1e1e; +} + +.cell { + flex: 0 1 105px; + display: flex; + flex-direction: column; + align-items: center; + text-decoration: none; + background: #ffffff; + border: 1px solid #e0e6ef; + border-radius: 10px; + padding: 0.4rem; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); + transition: transform 0.15s ease, box-shadow 0.15s ease, border-color 0.15s ease; + line-height: 1; +} + +[data-theme='dark'] .cell { + background: #2a2a2a; + border-color: #3a4a6e; +} + +.cell:hover { + transform: translateY(-2px); + box-shadow: 0 3px 8px rgba(0, 0, 0, 0.1); + border-color: #2a6bc7; + text-decoration: none; +} + +.logoSlot { + height: 44px; + display: flex; + align-items: center; + justify-content: center; +} + +.cellLogo { + width: 32px; + height: 32px; + object-fit: contain; + border-radius: 4px; +} + +.logoLarge { + width: 42px; + height: 42px; +} + +.logoWideLarge { + width: 62px; + height: 40px; +} + +.ubuntuLogo { + width: 40px; + height: 40px; + padding: 5px; + border-radius: 50%; + background: #e95420; + box-sizing: border-box; +} + +.cellLabel { + margin-top: auto; + font-size: 0.7rem; + font-weight: 500; + text-align: center; + color: #2b3a5e; + padding-top: 0.2rem; +} + +[data-theme='dark'] .cellLabel { + color: #c8d0e0; +} diff --git a/website/src/components/HomepageContent/HomeIntro.mdx b/website/src/components/HomepageContent/HomeIntro.mdx index b0098f0..7df2e45 100644 --- a/website/src/components/HomepageContent/HomeIntro.mdx +++ b/website/src/components/HomepageContent/HomeIntro.mdx @@ -1,17 +1,7 @@ -AboutCode is a family of FOSS projects to discover, report and manage metadata -about software: -- Where does the software come from? -- What is its license? its copyright? -- What are its dependencies? -- Was the software well maintained? -- Are there security vulnerabilities? -- Are there licensing issues? +Modern software is assembled from thousands of open source components. +For each one you need to know where it comes from, what license applies, +whether it has known vulnerabilities, and if it is actively maintained. -These are all important questions because there are millions of free and open -source software components available on the web for reuse. - -Knowing where a software package comes from, what its license is and whether -it is vulnerable should be a problem of the past such that everyone can safely -consume more free and open source software. We support not only open source -software, but also open data, generated and curated by our applications. +AboutCode provides open tools, open data, and open standards to answer +these questions and keep your software supply chains safe and compliant. diff --git a/website/src/components/HomepageContent/ProjectOverview.md b/website/src/components/HomepageContent/ProjectOverview.md index 4a6dec8..e07058a 100644 --- a/website/src/components/HomepageContent/ProjectOverview.md +++ b/website/src/components/HomepageContent/ProjectOverview.md @@ -3,19 +3,3 @@ libraries and data. All of the software is open source (primarily licensed under [Apache-2.0](https://scancode-licensedb.aboutcode.org/apache-2.0.html)) and all of the data is open (primarily licensed under [CC-BY-SA-4.0](https://scancode-licensedb.aboutcode.org/cc-by-sa-4.0.html)). - -The AboutCode stack supports important industry standards including: - -**Package-URL (PURL)**: a widely used standard to identify software -packages of any type with simple, readable and concise URLs. The PURL -standard is [ECMA-427](https://ecma-tc54.github.io/ECMA-427/). - -**CycloneDX**: (OWASP CycloneDX) is a full-stack Bill of Materials (BOM) -standard ([ECMA-424](https://ecma-international.org/publications-and-standards/standards/ecma-424/)) -that provides advanced supply chain capabilities for cyber risk reduction. - -**SPDX**: (System Package Data Exchange) is a [specification](https://spdx.dev/use/specifications/) -for representing systems with software components as SBOMs -(Software Bill of Materials) and other AI, data and security references. - -The following sections provide details about each project. diff --git a/website/src/components/HomepageContent/StandardsOverview.md b/website/src/components/HomepageContent/StandardsOverview.md new file mode 100644 index 0000000..b053a0c --- /dev/null +++ b/website/src/components/HomepageContent/StandardsOverview.md @@ -0,0 +1,9 @@ +AboutCode created Package-URL (PURL), the universal identifier for software +packages now used across CycloneDX, SPDX, CSAF, OpenVEX, OSV, MITRE CVE, +and many more standards. AboutCode also created VERS for version ranges and +contributes to CycloneDX and co-founded SPDX. + +PURL is the common thread that ties SBOMs, vulnerability databases, security +advisories, and attestations together. + +[See all supported standards](/docs/getting_started/getting_started-standards/) diff --git a/website/src/components/HomepageContent/Supporters.md b/website/src/components/HomepageContent/Supporters.md index dd54ba4..143b962 100644 --- a/website/src/components/HomepageContent/Supporters.md +++ b/website/src/components/HomepageContent/Supporters.md @@ -1,15 +1,25 @@ -The home for AboutCode software is the [aboutcode-org](https://github.com/aboutcode-org) -organization on GitHub. AboutCode is managed by AboutCode Europe ASBL -(a Brussels-based non-profit) and is supported by: +AboutCode is managed by AboutCode Europe ASBL (a Brussels-based non-profit) +and is supported by **contributions from users like you** and by: -- Contributions from users like you -- Google, including the Google Summer of Code and Season of Docs -programmes -- Mercedes-Benz Group -- Microsoft and Microsoft Azure -- nexB Inc. -- The European Commission NGI programme -- The NLnet Foundation -- The Swiss State Secretariat for Education, Research and Innovation (SERI) -- Zeiss -- and many others! +Amazon, +Bloomberg, +Bosch, +ECMA International, +Eclipse Foundation, +European Commission NGI and OIS programs, +German Sovereign Tech Agency, +GitHub, +Google (including GSoC and Season of Docs), +Liferay, +Mercedes-Benz Group, +Microsoft, +nexB Inc., +NLnet Foundation, +Open Source Initiative (OSI), +OWASP, +Porsche, +SODGE IT, +Swiss State Secretariat for Education, Research and Innovation, +Texas Instruments, +Zeiss, +and many others. diff --git a/website/src/components/HomepageContent/index.js b/website/src/components/HomepageContent/index.js index ff14238..5f2b099 100644 --- a/website/src/components/HomepageContent/index.js +++ b/website/src/components/HomepageContent/index.js @@ -1,16 +1,18 @@ import React from 'react'; -import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import Link from '@docusaurus/Link'; import HomeIntro from './HomeIntro.mdx'; +import StandardsOverview from './StandardsOverview.md'; +import AdoptersBanner from '@site/src/components/AdoptersBanner'; import ProjectOverview from './ProjectOverview.md'; import Supporters from './Supporters.md'; +import ValuePillars from '@site/src/components/ValuePillars'; +import CapabilitiesGrid from '@site/src/components/CapabilitiesGrid'; +import EcosystemGrid from '@site/src/components/EcosystemGrid'; import ProjectGridTemplate from '@site/src/components/ProjectGridTemplate'; +import { featuredProjectSources } from '@site/src/data/projects-featured'; import styles from './styles.module.css'; export default function HomepageContent() { - // Get baseUrl from Docusaurus context - const { siteConfig } = useDocusaurusContext(); - const { baseUrl } = siteConfig; - return (
@@ -24,34 +26,93 @@ export default function HomepageContent() {
+
+ +
+ +
+ +
+
-

AboutCode Projects Overview

+

Community and Adopters

+
+
+

AboutCode is supported by over 700 contributors and + downloaded over 4 millions times per day. +

+

Our open tools, data, and standards are used by + leading open source projects and organizations worldwide. +

+ +
+
+
+

Supporters

+
- + +
+
+ +
+
+

Software supply chain standards

+
+ +
+
+ - +
+
+

Projects

+
+
+ +
+ +
+ + See all supported projects + +
-

Supporters

+

Supported ecosystems, languages, and data sources

- +

AboutCode tools support 70+ package ecosystems, programming languages, + and vulnerability data sources, all identified using{' '} + Package-URL (PURL).

+
- {/* temp dummy div to create space above footer */}
); diff --git a/website/src/components/HomepageContent/styles.module.css b/website/src/components/HomepageContent/styles.module.css index 66d4130..77df78f 100644 --- a/website/src/components/HomepageContent/styles.module.css +++ b/website/src/components/HomepageContent/styles.module.css @@ -175,7 +175,11 @@ .sectionHeader h2 { margin-bottom: 0px; - color: #992600; + color: #2a6bc7; +} + +.sectionIntro h3 { + color: #2a6bc7; } .sectionContainer { @@ -183,3 +187,18 @@ margin: 0 auto; padding: 0 1.5rem; } + +.projectLinkRow { + max-width: 1200px; + margin: 0.4rem auto 0; + text-align: left; +} + +.projectLink { + color: #2a6bc7; + font-weight: 600; +} + +.projectLink:hover { + color: #2a6bc7; +} diff --git a/website/src/components/HomepageFeatures/index.js b/website/src/components/HomepageFeatures/index.js deleted file mode 100644 index acc7621..0000000 --- a/website/src/components/HomepageFeatures/index.js +++ /dev/null @@ -1,64 +0,0 @@ -import clsx from 'clsx'; -import Heading from '@theme/Heading'; -import styles from './styles.module.css'; - -const FeatureList = [ - { - title: 'Easy to Use', - Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, - description: ( - <> - Docusaurus was designed from the ground up to be easily installed and - used to get your website up and running quickly. - - ), - }, - { - title: 'Focus on What Matters', - Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default, - description: ( - <> - Docusaurus lets you focus on your docs, and we'll do the chores. Go - ahead and move your docs into the docs directory. - - ), - }, - { - title: 'Powered by React', - Svg: require('@site/static/img/undraw_docusaurus_react.svg').default, - description: ( - <> - Extend or customize your website layout by reusing React. Docusaurus can - be extended while reusing the same header and footer. - - ), - }, -]; - -function Feature({Svg, title, description}) { - return ( -
-
- -
-
- {title} -

{description}

-
-
- ); -} - -export default function HomepageFeatures() { - return ( -
-
-
- {FeatureList.map((props, idx) => ( - - ))} -
-
-
- ); -} diff --git a/website/src/components/HomepageFeatures/styles.module.css b/website/src/components/HomepageFeatures/styles.module.css deleted file mode 100644 index b248eb2..0000000 --- a/website/src/components/HomepageFeatures/styles.module.css +++ /dev/null @@ -1,11 +0,0 @@ -.features { - display: flex; - align-items: center; - padding: 2rem 0; - width: 100%; -} - -.featureSvg { - height: 200px; - width: 200px; -} diff --git a/website/src/components/HomepageHeader/index.js b/website/src/components/HomepageHeader/index.js index 6a783d5..79375be 100644 --- a/website/src/components/HomepageHeader/index.js +++ b/website/src/components/HomepageHeader/index.js @@ -6,10 +6,10 @@ export default function HomepageHeader() {

- Welcome to AboutCode.org + Healthy Software Supply Chains

- FOSS for FOSS + We build, maintain, and sustain open data with open source code and open standards for the software supply chains.

diff --git a/website/src/components/ProjectGridTemplate/index.js b/website/src/components/ProjectGridTemplate/index.js index 4b26540..c30caf5 100644 --- a/website/src/components/ProjectGridTemplate/index.js +++ b/website/src/components/ProjectGridTemplate/index.js @@ -1,63 +1,19 @@ import React, { useState, useEffect } from 'react'; import styles from './styles.module.css'; -import projects_application from '@site/src/data/projects-application.json'; -import projects_scancode from '@site/src/data/projects-scancode.json'; -import projects_package_url from '@site/src/data/projects-package-url.json'; -import projects_inspectors from '@site/src/data/projects-inspectors.json'; -import projects_libraries from '@site/src/data/projects-libraries.json'; import project_field_help from '@site/src/data/project_field_help.json'; -export default function ProjectGrids() { +export default function ProjectGrids({ + projectSources = [], + showSectionTitles = true, +}) { const [selectedProject, setSelectedProject] = useState(null); - const [isModalOpen, setIsModalOpen] = useState(false); - - // list of data sources - const projectSources = [ - { - id: 'application-projects', - title: 'Application Projects', - data: projects_application, - description: - 'These projects offer an application that you can install in the cloud or a local environment.', - }, - { - id: 'scancode-projects', - title: 'ScanCode projects', - data: projects_scancode, - description: - 'These projects are components or extensions of ScanCode.', - }, - { - id: 'purl-projects', - title: 'Package-URL (PURL) projects', - data: projects_package_url, - description: - 'These projects provide tools and data to support the use of the PURL (Package-URL) or VERS (Version Range Specifier) specifications.', - }, - { - id: 'inspectors', - title: 'Inspectors', - data: projects_inspectors, - description: - 'AboutCode Inspectors are special-purpose analysis tools. You can run them as a ScanCode Toolkit plugin, as steps in a ScanCode.io pipeline, or from the command line.', - }, - { - id: 'libraries', - title: 'Libraries', - data: projects_libraries, - description: - 'AboutCode libraries are key building blocks for the AboutCode software and data stack - they have also been incorporated into other major FOSS projects and are available for use by anyone.', - }, - ]; const openModal = (project) => { setSelectedProject(project); - setIsModalOpen(true); }; const closeModal = () => { setSelectedProject(null); - setIsModalOpen(false); }; // Close modal on Escape key @@ -153,19 +109,72 @@ export default function ProjectGrids() { const isUsableValue = (value) => normalizeToArray(value).length > 0; + function CardLinks({ project }) { + const hasLinks = + isUsableValue(project.documentation_url) || + isUsableValue(project.repository_url) || + isUsableValue(project.service_url); + + if (!hasLinks) { + return null; + } + + return ( +
+ {isUsableValue(project.documentation_url) && ( + e.stopPropagation()} + > + Doc + + )} + {isUsableValue(project.repository_url) && ( + e.stopPropagation()} + > + Code + + )} + {isUsableValue(project.service_url) && ( + e.stopPropagation()} + > + Demo + + )} +
+ ); + } + return (
{/* Iterate through each data source */} {projectSources.map((source, sourceIdx) => (
{/* Add a heading for each grid */} -
-

{source.title}

-
+ {showSectionTitles && ( +
+

{source.title}

+
+ )} -
- {source.description} -
+ {source.description && ( +
+ {source.description} +
+ )}
@@ -181,13 +190,7 @@ export default function ProjectGrids() {

{project.name}

-
- logo -
+
@@ -207,73 +210,6 @@ export default function ProjectGrids() {
)} - {isUsableValue( - project.documentation_url, - ) && ( -
- - - e.stopPropagation() - } - > - {project.documentation_url} - -
- )} - - {isUsableValue(project.repository_url) && ( -
- - - e.stopPropagation() - } - > - {project.repository_url} - -
- )} - - {isUsableValue(project.service_url) && ( -
- - - e.stopPropagation() - } - > - {project.service_url} - -
- )}
))} @@ -312,7 +248,7 @@ export default function ProjectGrids() { ) && (
+ {pillars.map((pillar) => ( +
+ +

{pillar.title}

+

{pillar.description}

+
+ ))} +
+ ); +} diff --git a/website/src/components/ValuePillars/styles.module.css b/website/src/components/ValuePillars/styles.module.css new file mode 100644 index 0000000..83ac974 --- /dev/null +++ b/website/src/components/ValuePillars/styles.module.css @@ -0,0 +1,60 @@ +.pillarsGrid { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 1.5rem; + max-width: 1200px; + margin: 2rem auto; + padding: 0; +} + +@media (max-width: 768px) { + .pillarsGrid { + grid-template-columns: 1fr 1fr; + } +} + +@media (max-width: 480px) { + .pillarsGrid { + grid-template-columns: 1fr; + } +} + +.pillar { + text-align: center; + padding: 1.5rem 1rem; + border-radius: 8px; + background: var(--ifm-background-surface-color); + border: 1px solid #e0e6ef; + display: flex; + flex-direction: column; + align-items: center; +} + +.pillarIcon { + width: 56px; + height: 56px; + object-fit: contain; + margin-bottom: 0.75rem; +} + +[data-theme='dark'] .pillar { + border-color: #3a4a6e; +} + +.pillarTitle { + margin: 0 0 0.5rem 0; + font-size: 1.1rem; + font-weight: 600; + color: #2b3a5e; +} + +[data-theme='dark'] .pillarTitle { + color: #2a6bc7; +} + +.pillarDescription { + margin: 0; + font-size: 0.85rem; + line-height: 1.4; + color: var(--ifm-font-color-secondary); +} diff --git a/website/src/components/archive/ProjectGrid/index-new.js b/website/src/components/archive/ProjectGrid/index-new.js deleted file mode 100644 index 9edbd3d..0000000 --- a/website/src/components/archive/ProjectGrid/index-new.js +++ /dev/null @@ -1,313 +0,0 @@ -// 2025-11-22 Saturday 09:58:08. From ToolGrid -import React, { useState, useEffect } from 'react'; -import styles from './styles.module.css'; -// import projects from '@site/src/data/projects-v02.json'; -import projects_library from '@site/src/data/projects-library.json'; -import projects_main from '@site/src/data/projects-main.json'; - -export default function ProjectGrid() { - const [message, setMessage] = useState(null); - const [selectedProject, setSelectedProject] = useState(null); - const [activeTab, setActiveTab] = useState('overview'); - // Monitor open modal -- state prevents display of main-page alert - const [isModalOpen, setIsModalOpen] = useState(false); - const openModal = (project) => { - setSelectedProject(project); // sets modal content - }; - // Use a separate state for the modal alert - const [modalMessage, setModalMessage] = useState(null); - - // Close modal on Escape key - useEffect(() => { - function handleKeyDown(event) { - if (event.key === 'Escape') { - setSelectedProject(null); - setActiveTab('overview'); - } - } - if (selectedProject) { - window.addEventListener('keydown', handleKeyDown); - } - return () => { - window.removeEventListener('keydown', handleKeyDown); - }; - }, [selectedProject]); - - const closeModal = () => { - setSelectedProject(null); - setActiveTab('overview'); - }; - - return ( -
-
-
- {projects.map((project, idx) => ( -
openModal(project)} - > -
-
-

- {project.repository_url ? ( - - e.stopPropagation() - } - > - {project.name} - - ) : ( - project.name - )} -

-
-
- -
-
- {project.description} -
-
- -
-
- Package Download URL: - {project.package_download_url && - project.package_download_url.length > - 0 && ( -
    - {project.package_download_url.map( - (url, idx) => ( -
  • - - {url} - -
  • - ) - )} -
- )} -
-
-
- ))} -
- {/* ^ end of projectGrid */} -
- {/* ^ end of projectGridContainer */} - - {/* Popup message */} - {/* Don't display this message if the modal is open. */} - {!isModalOpen && message && ( -
{message}
- )} - - {/* Modal */} - {selectedProject && ( -
-
e.stopPropagation()} - > -
- <> - {/* Full width section */} -
-

{selectedProject.name}

-

{selectedProject.description}

-
- -
-
- - Repository URL:{' '} - - - {selectedProject.repository_url && - selectedProject.repository_url !== - 'n/a' && - selectedProject.repository_url !== - '#' ? ( - - {selectedProject.repository_url} - - ) : ( - n/a - )} -
-
- - Documentation URL:{' '} - - - {selectedProject.documentation_url && - selectedProject.documentation_url !== - 'n/a' && - selectedProject.documentation_url !== - '#' ? ( - - { - selectedProject.documentation_url - } - - ) : ( - n/a - )} -
- -
- Package Download URL: - {selectedProject.package_download_url && - selectedProject.package_download_url - .length > 0 && ( -
    - {selectedProject.package_download_url.map( - (url, idx) => ( -
  • - - {url} - -
  • - ) - )} -
- )} -
- -
- - Service URL:{' '} - - - {selectedProject.service_url && - selectedProject.service_url !== 'n/a' && - selectedProject.service_url !== '#' ? ( - - {selectedProject.service_url} - - ) : ( - n/a - )} -
- -
- - Language:{' '} - -
- {selectedProject.language} -
-
- -
- - License:{' '} - -
- {selectedProject.license} -
-
- -
- - Platform:{' '} - -
- {selectedProject.platform} -
-
- -
- - Comments:{' '} - -
- {selectedProject.comments} -
-
-
- -
- - {/* Close button */} -
- -
- {/* Display alert inside open modal. */} - {modalMessage && ( -
- {modalMessage} -
- )} -
-
- )} - {/* end of modal */} -
- ); -} diff --git a/website/src/components/archive/ProjectGrid/index-saved.js b/website/src/components/archive/ProjectGrid/index-saved.js deleted file mode 100644 index bef8bec..0000000 --- a/website/src/components/archive/ProjectGrid/index-saved.js +++ /dev/null @@ -1,575 +0,0 @@ -// 2025-12-11 Thursday 12:09:35.Saved. -// 2025-11-22 Saturday 09:58:08. From ToolGrid -import React, { useState, useEffect } from 'react'; -import styles from './styles.module.css'; -// import specs from '@site/src/data/specifications.json'; -// import projects from '@site/src/data/projects-v01.json'; -import projects from '@site/src/data/projects-v02.json'; - -export default function ProjectGrid() { - const [message, setMessage] = useState(null); - const [selectedProject, setSelectedProject] = useState(null); - const [activeTab, setActiveTab] = useState('overview'); - // Monitor open modal -- state prevents display of main-page alert - const [isModalOpen, setIsModalOpen] = useState(false); - const openModal = (project) => { - setSelectedProject(project); // sets modal content - }; - // Use a separate state for the modal alert - const [modalMessage, setModalMessage] = useState(null); - - // Close modal on Escape key - useEffect(() => { - function handleKeyDown(event) { - if (event.key === 'Escape') { - setSelectedProject(null); - setActiveTab('overview'); - } - } - if (selectedProject) { - window.addEventListener('keydown', handleKeyDown); - } - return () => { - window.removeEventListener('keydown', handleKeyDown); - }; - }, [selectedProject]); - - // modal link events - // const handleLinkClick = (e, project, linkType) => { - // e.preventDefault(); - // e.stopPropagation(); - - // let message = null; - - // if ( - // linkType === 'homepage' && - // (!project.homepage || project.homepage === 'n/a') - // ) { - // message = `The homepage for "${project.name}" is not available.`; - // } else if ( - // linkType === 'source_download' && - // (!project.source_download || project.source_download === 'n/a') - // ) { - // message = `The source download URL for "${project.name}" is not available.`; - // } else if ( - // linkType === 'package_download' && - // (!project.package_download || project.package_download === 'n/a') - // ) { - // message = `The package download URL for "${project.name}" is not available.`; - // } - - // if (message) { - // setModalMessage(message); - // setTimeout(() => setModalMessage(null), 3000); - // } else { - // // manually open the valid link if it passed checks - // const url = - // linkType === 'homepage' - // ? project.homepage - // : project.source_download; - // window.open(url, '_blank', 'noopener noreferrer'); - // } - // }; - - const closeModal = () => { - setSelectedProject(null); - setActiveTab('overview'); - }; - - return ( -
-
-
- {projects.map((project, idx) => ( -
openModal(project)} - > - {/*
*/} -
-
-

- {project.repository_url ? ( - - e.stopPropagation() - } - > - {project.name} - - ) : ( - project.name - )} -

- - {/* Optional logo (only if available) */} - {/* {project.logo && ( -
- {`${project.name} -
- )} */} -
-
- - {/*
*/} -
-
- {project.description} -
-
- - {/*
-
    -
  • - Base language:{' '} - {project.language} -
  • -
  • - License:{' '} - {project.license} -
  • -
  • - Standards:{' '} - {project.standards} -
  • -
-
*/} - -{/*
*/} -
-
- Package Download URL: - {project.package_download_url && - project.package_download_url.length > - 0 && ( -
    - {project.package_download_url.map( - (url, idx) => ( -
  • - - {url} - -
  • - ) - )} -
- )} -
-
- - -
- ))} -
- {/* ^ end of projectGrid */} -
- {/* ^ end of projectGridContainer */} - - {/* Popup message */} - {/* Don't display this message if the modal is open. */} - {!isModalOpen && message && ( -
{message}
- )} - - {/* Modal */} - {selectedProject && ( -
-
e.stopPropagation()} - > -
- <> - {/* Full width section */} -
-

{selectedProject.name}

-

{selectedProject.description}

-
- - {/* 2025-12-11 Thursday 09:06:10. Copy one of the single-column sections from below. */} -
-
- - Repository URL:{' '} - - - {selectedProject.repository_url && - selectedProject.repository_url !== - 'n/a' && - selectedProject.repository_url !== - '#' ? ( - - {selectedProject.repository_url} - - ) : ( - n/a - )} - - {/* {selectedProject.homepage && - selectedProject.homepage !== 'n/a' && - selectedProject.homepage !== '#' ? ( - - {selectedProject.homepage} - - ) : ( - n/a - )} */} -
-
- - Documentation URL:{' '} - - - {selectedProject.documentation_url && - selectedProject.documentation_url !== - 'n/a' && - selectedProject.documentation_url !== - '#' ? ( - - { - selectedProject.documentation_url - } - - ) : ( - n/a - )} -
- -
- {/*
*/} - Package Download URL: - {selectedProject.package_download_url && - selectedProject.package_download_url.length > - 0 && ( -
    - {selectedProject.package_download_url.map( - (url, idx) => ( -
  • - - {url} - -
  • - ) - )} -
- )} - {/*
*/} - -
- - {/*
- - Package Download URL:{' '} - - - {selectedProject.package_download_url && - selectedProject.package_download_url !== - 'n/a' && - selectedProject.package_download_url !== - '#' ? ( - - { - selectedProject.package_download_url - } - - ) : ( - n/a - )} -
*/} - -
- - Service URL:{' '} - - - {selectedProject.service_url && - selectedProject.service_url !== - 'n/a' && - selectedProject.service_url !== - '#' ? ( - - { - selectedProject.service_url - } - - ) : ( - n/a - )} -
- -
- - Language:{' '} - -
- {selectedProject.language} -
-
- -
- - License:{' '} - -
- {selectedProject.license} -
-
- -
- - Platform:{' '} - -
- {selectedProject.platform} -
-
- -
- - Comments:{' '} - -
- {selectedProject.comments} -
-
-
- - {/* Two column section */} - {/*
-
-
    -
  • - Base language:{' '} - {selectedProject.language} -
  • -
  • - License:{' '} - {selectedProject.license} -
  • -
  • - Functions:{' '} - {selectedProject.functions} -
  • -
  • - Type:{' '} - {selectedProject.type} -
  • -
  • - Standards:{' '} - {selectedProject.standards} -
  • -
  • - Platform:{' '} - {selectedProject.platform} -
  • -
-
- -
-
- - Home:{' '} - - - {selectedProject.homepage && - selectedProject.homepage !== - 'n/a' && - selectedProject.homepage !== '#' ? ( - - {selectedProject.homepage} - - ) : ( - n/a - )} -
-
- - Source download:{' '} - - - {selectedProject.source_download && - selectedProject.source_download !== - 'n/a' && - selectedProject.source_download !== - '#' ? ( - - { - selectedProject.source_download - } - - ) : ( - n/a - )} -
- -
- - Package download:{' '} - - - {selectedProject.package_download && - selectedProject.package_download !== - 'n/a' && - selectedProject.package_download !== - '#' ? ( - - { - selectedProject.package_download - } - - ) : ( - n/a - )} -
- -
- - Notes:{' '} - -
- {selectedProject.notes} -
-
-
-
*/} - -
- - {/* Close button */} -
- -
- {/* Display alert inside open modal. */} - {modalMessage && ( -
- {modalMessage} -
- )} -
-
- )} - {/* end of modal */} -
- ); -} diff --git a/website/src/components/archive/ProjectGrid/index.js b/website/src/components/archive/ProjectGrid/index.js deleted file mode 100644 index 2592e1a..0000000 --- a/website/src/components/archive/ProjectGrid/index.js +++ /dev/null @@ -1,318 +0,0 @@ -// 2025-11-22 Saturday 09:58:08. From ToolGrid -import React, { useState, useEffect } from 'react'; -import styles from './styles.module.css'; -import projects from '@site/src/data/projects-v02.json'; -import projects_library from '@site/src/data/projects-library.json'; -import projects_main from '@site/src/data/projects-main.json'; - -export default function ProjectGrid() { - const [message, setMessage] = useState(null); - const [selectedProject, setSelectedProject] = useState(null); - // 2025-12-11 Thursday 18:04:12.No longer used right? - // const [activeTab, setActiveTab] = useState('overview'); - // Monitor open modal -- state prevents display of main-page alert - const [isModalOpen, setIsModalOpen] = useState(false); - const openModal = (project) => { - setSelectedProject(project); // sets modal content - }; - // Use a separate state for the modal alert - const [modalMessage, setModalMessage] = useState(null); - - // Close modal on Escape key - useEffect(() => { - function handleKeyDown(event) { - if (event.key === 'Escape') { - setSelectedProject(null); - // 2025-12-11 Thursday 18:04:12.No longer used right? - // setActiveTab('overview'); - } - } - if (selectedProject) { - window.addEventListener('keydown', handleKeyDown); - } - return () => { - window.removeEventListener('keydown', handleKeyDown); - }; - }, [selectedProject]); - - const closeModal = () => { - setSelectedProject(null); - // 2025-12-11 Thursday 18:04:12.No longer used right? - // setActiveTab('overview'); - }; - - return ( -
-
-
- {projects.map((project, idx) => ( -
openModal(project)} - > -
-
-

- {project.repository_url ? ( - - e.stopPropagation() - } - > - {project.name} - - ) : ( - project.name - )} -

-
-
- -
-
- {project.description} -
-
- -
-
- Package Download URL: - {project.package_download_url && - project.package_download_url.length > - 0 && ( -
    - {project.package_download_url.map( - (url, idx) => ( -
  • - - {url} - -
  • - ) - )} -
- )} -
-
-
- ))} -
- {/* ^ end of projectGrid */} -
- {/* ^ end of projectGridContainer */} - {/*
? */} - {/* ))} */} - - {/* Popup message */} - {/* Don't display this message if the modal is open. */} - {!isModalOpen && message && ( -
{message}
- )} - - {/* Modal */} - {selectedProject && ( -
-
e.stopPropagation()} - > -
- <> - {/* Full width section */} -
-

{selectedProject.name}

-

{selectedProject.description}

-
- -
-
- - Repository URL:{' '} - - - {selectedProject.repository_url && - selectedProject.repository_url !== - 'n/a' && - selectedProject.repository_url !== - '#' ? ( - - {selectedProject.repository_url} - - ) : ( - n/a - )} -
-
- - Documentation URL:{' '} - - - {selectedProject.documentation_url && - selectedProject.documentation_url !== - 'n/a' && - selectedProject.documentation_url !== - '#' ? ( - - { - selectedProject.documentation_url - } - - ) : ( - n/a - )} -
- -
- Package Download URL: - {selectedProject.package_download_url && - selectedProject.package_download_url - .length > 0 && ( -
    - {selectedProject.package_download_url.map( - (url, idx) => ( -
  • - - {url} - -
  • - ) - )} -
- )} -
- -
- - Service URL:{' '} - - - {selectedProject.service_url && - selectedProject.service_url !== 'n/a' && - selectedProject.service_url !== '#' ? ( - - {selectedProject.service_url} - - ) : ( - n/a - )} -
- -
- - Language:{' '} - -
- {selectedProject.language} -
-
- -
- - License:{' '} - -
- {selectedProject.license} -
-
- -
- - Platform:{' '} - -
- {selectedProject.platform} -
-
- -
- - Comments:{' '} - -
- {selectedProject.comments} -
-
-
- -
- - {/* Close button */} -
- -
- {/* Display alert inside open modal. */} - {modalMessage && ( -
- {modalMessage} -
- )} -
-
- )} - {/* end of modal */} -
- ); -} diff --git a/website/src/components/archive/ProjectGrid/styles.module.css b/website/src/components/archive/ProjectGrid/styles.module.css deleted file mode 100644 index 591838f..0000000 --- a/website/src/components/archive/ProjectGrid/styles.module.css +++ /dev/null @@ -1,721 +0,0 @@ -/* Grid layout (reuse existing) */ -.projectGridWrapper { - margin: 2rem auto; - margin: 1rem auto; - margin: 0.5rem auto; - padding: 1rem; - background-color: #e8e8e8; - background-color: #f5f5f5; - border-radius: 12px; - - border: solid 1px #b8b8b8; - border: 0; -} - -.projectGridContainer { - max-width: 1200px; - width: 100%; - /* Center the projectgrid on the page. */ - margin: 0 auto; -} - - /* NEW: Replace flexbox with a proper grid */ -.projectGrid { - display: grid; - grid-template-columns: repeat(3, 1fr); /* 3 columns */ - gap: 1.5rem; - align-items: stretch; /* Auto-match heights per row */ -} - -.projectCard { - background: #fff; - border: 1px solid #e0e0e0; - border: 1px solid #909090; - border-radius: 12px; - box-shadow: 0 2px 6px rgba(0, 0, 0, 0.08); - - padding: 1rem; - text-align: left; - cursor: pointer; - transition: transform 0.2s ease, box-shadow 0.2s ease; - - /* Remove sizing from flexbox layout */ - flex: none; - max-width: none; - - /* Keep your vertical stacking */ - display: flex; - flex-direction: column; - margin-bottom: 0; - /* Handle the long URL values. */ - word-break: break-all; - overflow-wrap: anywhere; - min-width: 0; /* critical for grid children */ - - /* YO: Modern approach: */ - overflow-wrap: break-word; - word-break: normal; - -} - -.projectCard:hover { - transform: translateY(-3px); - box-shadow: 0 4px 10px rgba(0, 0, 0, 0.15); -} - -/* Breakpoints for tablets */ -@media (max-width: 1024px) { - .projectGrid { - grid-template-columns: repeat(2, 1fr); - } -} - -/* Breakpoints for mobile */ -@media (max-width: 640px) { - .projectGrid { - grid-template-columns: 1fr; - } -} - -.projectLogo { - width: 60px; - height: 60px; - margin: 0 auto 1rem; -} - -@keyframes slideUp { - to { - transform: translateY(0); - opacity: 1; - } -} - -/* Close button */ -.modalClose { - position: absolute; - bottom: 1rem; - right: 1rem; - padding: 0.5rem 1rem; - background-color: #0366d6; - color: white; - border: none; - border-radius: 6px; - cursor: pointer; -} - -.modalClose:hover { - background-color: #024c9c; -} - - -/* Spec links inside modal */ -.projectLinks { - text-align: left; - border-top: solid 1px #d8d8d8; - padding-top: 5px; - margin-top: 10px; - - /* Handle the long URL values. */ - word-break: break-all; - overflow-wrap: anywhere; - line-height: 1.25rem; - - /* Modern approach: */ - overflow-wrap: break-word; - word-break: normal; -} - -.projectLinks a { - margin-right: 1rem; - text-decoration: none; - color: #0366d6; - font-weight: 500; - /* 'break-all' for links -- "words" don't matter */ - word-break: break-all; - overflow-wrap: anywhere; -} - -.projectLinks a:hover { - text-decoration: underline; -} - -.modalLinks01 { - text-align: left; - padding-top: 5px; - line-height: 1.25rem; -} -.modalLinks01 a { - margin-right: 1rem; - text-decoration: none; - color: #0366d6; - font-weight: 500; - font-weight:normal; - /* Handle the long URL values. */ - word-break: break-all; - overflow-wrap: anywhere; -} -.modalLinks01 a:hover { - text-decoration: underline; -} - -/* 2025-12-11 Thursday 11:14:14. */ -/* .modalLinks01 ul { -list-style-type: disc !important; -} */ - -/* .modalLinks01 li { -display: list-item !important; -} */ - -.featureList { - line-height: 1.25rem; -} - -/* Spec metadata list */ -.projectMeta { - list-style: none; - padding: 0; - margin: 0.5rem 0; - margin: 0.1rem 0; -} - -/* Modal. */ -/* Modal styles */ -.modalBackdrop { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.6); - display: flex; - align-items: center; - justify-content: center; - z-index: 1000; - padding: 1rem; -} - -/* Adding another .modalContent below with 'position: relative;' hoping to position the alert inside the open modal. */ -.modalContent { - background: white; - border-radius: 8px; - max-width: 1200px; - max-width: 1000px; - max-width: 800px; - width: 100%; - max-height: 90vh; - /* overflow: hidden; */ - /* overflow-y: auto; */ - overflow:none; - display: flex; - flex-direction: column; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); -} - -/* Tabs */ -.modalTabs { - display: flex; - border-bottom: 1px solid #e0e0e0; - border-bottom: 2px solid #e0e0e0; - border-bottom: 0; - background-color: #f5f5f5; - background-color: #ffffff; -} - -.tab { - flex: 1; - padding: 1rem; - border: none; - background: none; - cursor: pointer; - font-size: 1rem; - font-weight: 500; - transition: background-color 0.2s; - - border-bottom: 2px solid #e8e8e8; - - color: #606060; - background-color: #f8f8f8; - background-color: #f5f5f5; - background-color: #e8e8e8; - background-color: #ffffff; -} - -.tab:hover { - background-color: #e8e8e8; - background-color: #f5f5f5; - background-color: #ffffff; - color: #0066ff; - border-bottom: 2px solid #0066ff; -} - -.tabActive { - background-color: white; - border-bottom: 2px solid #007bff; - border-bottom: 2px solid #000000; - - color: #000000; -} - -.tabActive:hover { - background-color: white; - cursor: auto; - border-bottom: 2px solid #000000; - color: #000000; -} - -/* Modal body */ -.modalBody { - flex: 1; - overflow-y: auto; - padding: 2rem; - padding: 1.5rem; - border-top: solid 1px #ff0000; - border-top: 0 !important; - - /* padding-bottom: 0; */ -} - -/* Full width section */ -.fullWidthSection { - margin-bottom: 2rem; - padding-bottom: 2rem; - - margin-bottom: 0rem; - padding-bottom: 0rem; - - border-bottom: 1px solid #e0e0e0; - line-height: 1.25rem; -} - -.fullWidthSection h2 { - margin-top: 0; - margin-bottom: 1rem; -} - -/* Two column section */ -.twoColumnSection { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 2rem; - - margin-top: 1rem; -} - -.column h3 { - margin-top: 0; - margin-bottom: 1rem; -} - -/* 2025-12-11 Thursday 11:25:36.I don't think we need or want. */ -/* .column ul { - list-style: none; - padding: 0; -} - -.column ul li { - margin-bottom: 0.5rem; -} */ - -/* See also new modalLinks01 style I'm creating below the projectlinks style toward the top of this file -- using that in the modal to displayHome: x on 1 line. */ -.modalLinks { - display: flex; - flex-direction: column; - gap: 0.5rem; -} - -.modalLinks a { - display: inline-block; - background-color: #007bff; - background-color: #ffffff; - color: white; - color: #0066ff; - text-decoration: none; - border-radius: 4px; - transition: background-color 0.2s; - - /* No effect? */ - display: inline; -} - -.modalLinks a:hover { - background-color: #0056b3; - background-color: #ffffff; - text-decoration: underline; -} - -.modalFooter { - padding: 1rem 2rem; - padding: 0rem 1.5rem 1.5rem 1.5rem; - /* 2025-12-11 Thursday 10:19:33. */ - padding: 1.5rem 1.5rem 1.5rem 1.5rem; - border-top: solid 1px #e8e8e8; - - display: flex; - justify-content: flex-end; -} - -.closeButton { - padding: 0.5rem 1.5rem; - background: #2563eb; - color: white; - border: none; - border-radius: 4px; - cursor: pointer; - font-size: 1rem; - transition: background-color 0.2s; -} - -.closeButton:hover { - background-color: #5a6268; -} - -/* Responsive design */ -@media (max-width: 768px) { - .twoColumnSection { - grid-template-columns: 1fr; - gap: 1.5rem; - } - - .modalBody { - padding: 1rem; - } - - .modalFooter { - padding: 1rem; - } -} - -/* Limit display to two lines, then add ellipsis. */ -/* YO 2025-11-18 Tuesday 18:22:21. Maybe rename to tooltipTarget */ -.projectDescription { - overflow: hidden; - text-overflow: ellipsis; - display: -webkit-box; - /* -webkit-line-clamp: 2; */ - /* line-clamp: 2; */ - -webkit-box-orient: vertical; - /* line-height: 1.4em; */ - /* height: 2.8em; */ - /* height: 4.2em; */ - cursor: default; - - /* 2025-11-18 Tuesday 09:40:29. */ - /* line-height: 1.25em; */ - /* 2025-11-24 Monday 14:27:30. */ - /* line-height: 0.5rem; */ -} - -.projectDescriptionWrapper { - position: relative; - width: 100%; - line-height: 1.25rem; - /* line-height: 1.4rem; */ - - /* 2025-12-11 Thursday 07:51:06. */ - /* border-top: 1px solid #d8d8d8; */ - margin-top: 20px; - margin-top: 0px; - - padding-top: 10px; - padding-top: 0px; -} - -/* Tooltip arrow */ -/* .tooltip::after { - content: ''; - position: absolute; - top: 100%; - left: 50%; - margin-left: -6px; - border-width: 6px; - border-style: solid; - border-color: rgba(40, 40, 40, 0.95) transparent transparent transparent; -} */ - -/* .tooltip { - position: absolute; - bottom: 100%; - left: 50%; - transform: translateX(-50%); - background: var(--ifm-background-surface-color); - color: var(--ifm-font-color-base); - border: 1px solid var(--ifm-color-emphasis-200); - border: solid 1px #0066ff; - padding: 8px 10px; - border-radius: 6px; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); - white-space: normal; - width: max-content; - max-width: 420px; - z-index: 10; - opacity: 0; - pointer-events: none; - transition: opacity 0.2s ease-in-out; - - font-size: 0.9rem; - font-size: 14px; - font-size: 15px; - line-height: 1.5; - line-height: 1.25em; - font-size: 0.9rem; - - overflow-wrap: break-word; - word-break: normal; -} */ - -/* .projectDescriptionWrapper:hover .tooltip { - opacity: 1; -} */ - -.packageDownloadWrapper { - position: relative; - width: 100%; - line-height: 1.25rem; - /* line-height: 1.4rem; */ - - /* 2025-12-11 Thursday 07:51:06. */ - border-top: 1px solid #d8d8d8; - margin-top: 20px; - padding-top: 10px; -} - -/* This is for the alert that appears inside -the modal when the link is clicked from inside an open modal. */ -.modalAlert { - margin-top: 1rem; - padding: 0.75rem 1rem; - background-color: #f8d7da; - color: #721c24; - border: 1px solid #f5c6cb; - border-radius: 6px; - text-align: center; - font-size: 0.9rem; - animation: fadeIn 0.3s ease; -} -@keyframes fadeIn { - from { - opacity: 0; - transform: translateY(4px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -/* In place of .modalAlert just above, try this (including another .modalContent with 'position: relative;' hoping to position the alert inside the open modal. */ - /* ensure positioning context */ -.modalContent { - position: relative; -} - -.modalAlertOverlay { - position: absolute; - bottom: 1rem; - left: 50%; - transform: translateX(-50%); - background-color: #f8d7da; - color: #721c24; - border: 1px solid #f5c6cb; - border-radius: 6px; - padding: 0.6rem 1rem; - text-align: center; - width: 80%; - max-width: 320px; - z-index: 10; - animation: fadeIn 0.3s ease; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); -} -@keyframes fadeIn { - from { - opacity: 0; - transform: translate(-50%, 4px); - } - to { - opacity: 1; - transform: translate(-50%, 0); - } -} - -/* For the under-construction popup. */ -.popupMessage { - position: fixed; - bottom: 2rem; - left: 50%; - transform: translateX(-50%); - background: #2563eb; - background: #fcf3ce; - color: #fff; - color: #000; - padding: 0.75rem 1.25rem; - border-radius: 8px; - font-size: 0.95rem; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3); - box-shadow: 0 2px 10px #000000; - z-index: 999; - opacity: 0; - animation: fadeInOut 2.5s ease forwards; - animation: fadeInOut 5s ease forwards; -} - -@keyframes fadeInOut { - 0% { - opacity: 0; - transform: translate(-50%, 10px); - } - 10% { - opacity: 1; - transform: translate(-50%, 0); - } - 90% { - opacity: 1; - transform: translate(-50%, 0); - } - 100% { - opacity: 0; - transform: translate(-50%, 10px); - } -} - -/* See if I can adapt this (used in the modal) to the main page: */ -.modalAlertOverlay_main { - position: absolute; - position: fixed; - bottom: 1rem; - left: 50%; - transform: translateX(-50%); - background-color: #f8d7da; - color: #721c24; - border: 1px solid #f5c6cb; - border-radius: 6px; - padding: 0.6rem 1rem; - text-align: center; - width: 80%; - max-width: 320px; - z-index: 10; - z-index: 999; - animation: fadeIn 0.3s ease; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); -} -@keyframes fadeIn { - from { - opacity: 0; - transform: translate(-50%, 4px); - } - to { - opacity: 1; - transform: translate(-50%, 0); - } -} - -/* Handle the long URLs. */ -.modalLinkUrl { - /* font-size: 0.85rem; */ - /* line-height: 1.2; */ - word-break: break-all; /* forces breaks anywhere when needed */ - overflow-wrap: anywhere; /* clean modern wrapping */ - max-width: 100%; /* prevents overflow */ - /* 2025-11-24 Monday 15:00:41. */ - width: auto; - - /* This fixed the display-on-same-line-as-field problem!!! */ - display: inline; - /* line-height: 1.25rem; */ -} -/* 2025-11-24 Monday 16:45:48. For the project.name value */ -.modalLinkUrl_break_word { - overflow-wrap: break-word; - word-break: normal; - max-width: 100%; - width: auto; - display: inline; -} - -.modalText { - font-size: 1rem; - line-height: 1.2; - max-width: 100%; /* prevents overflow */ - /* This fixed the display-on-same-line-as-field problem!!! */ - display: inline; - line-height: 1.25rem; - /* Modern approach: */ - overflow-wrap: break-word; - word-break: normal; -} - -.note_field { - line-height: 1.25rem; - padding-top: 5px; -} - - -/* 2025-11-22 Saturday 12:08:53. Does this work? */ -/* Dark mode */ -/* [data-theme='dark'] .card { - background: #1d1f21; - color: #e5e5e5; -} */ - -/* [data-theme='dark'] .sectionHeader h1, -[data-theme='dark'] .column h2 { - color: #f0f0f0; -} */ - -/* [data-theme='dark'] .projectCard { - background: #1d1f21; - background: #303030; - border-color: #909090; - color: #e5e5e5; -} */ - -[data-theme='dark'] .projectCard { - background: #000000; - border-color: #909090; - border-color: #505050; - color: #e5e5e5; -} - -[data-theme='dark'] .projectGridWrapper { - background: #303030; - border: solid 1px #505050; - color: #e5e5e5; -} - -/* 2025-11-23 Sunday 18:53:02. */ -.projectName { - /* Modern approach: */ - overflow-wrap: break-word; - word-break: normal; -} - -/* 2025-11-24 Monday 16:33:21. Modify project card to add logo (if any). */ -.topRow { - display: flex; - align-items: center; - justify-content: space-between; - gap: 0.5rem; /* space between title and logo */ -} - -.logoWrapper { - flex-shrink: 0; /* logo never shrinks */ - width: 40px; /* pick your static width */ - height: 40px; /* consistent box */ - display: flex; - align-items: center; - align-items: flex-start; /* align logo at the top */ - justify-content: center; -} - -.logoImg { - max-width: 100%; - max-height: 100%; - object-fit: contain; -} - -/* 2025-12-10 Wednesday 18:53:41. For the JSON values that are lists of URLs. */ -.wordWrap { - word-wrap: break-word; /* old name, still works */ - overflow-wrap: break-word; /* modern standard */ - word-break: break-all; /* fallback for very stubborn strings */ -} diff --git a/website/src/css/custom.css b/website/src/css/custom.css index 5fba515..a41d92e 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -6,13 +6,18 @@ margin-right: 0; } +.navbar__logo img { + height: 32px; + width: auto; +} + /* Consolidate navbar and sidebar CSS. */ .navbar--dark { - --ifm-navbar-background-color: #375298; + --ifm-navbar-background-color: #2b3a5e; } /* navbar (full width) */ .navbar { - background-color: #375298; + background-color: #2b3a5e; } .navbar .navbar__link { color: #ffffff; @@ -45,14 +50,14 @@ @media (max-width: 996px) { .menu__link { color: #ffffff; - background-color: #375298; + background-color: #2b3a5e; font-weight: 400; } .menu__link:hover, .menu__link--active { color: #ffffff; text-decoration: underline; - background-color: #375298; + background-color: #2b3a5e; } /* sidebar */ @@ -82,5 +87,5 @@ } .footer { - background-color: #101010; + background-color: #2b3a5e; } diff --git a/website/src/data/projects-all.js b/website/src/data/projects-all.js new file mode 100644 index 0000000..c41a7d2 --- /dev/null +++ b/website/src/data/projects-all.js @@ -0,0 +1,37 @@ +import projectsApplication from '@site/src/data/projects-application.json'; +import projectsScancode from '@site/src/data/projects-scancode.json'; +import projectsPackageUrl from '@site/src/data/projects-package-url.json'; +import projectsInspectors from '@site/src/data/projects-inspectors.json'; +import projectsLibraries from '@site/src/data/projects-libraries.json'; +import { + clearlyDefinedProject, + packageUrlProject, +} from '@site/src/data/projects-featured'; + +export const allProjectSources = [ + { + id: 'application-projects', + title: 'Apps for the software supply chains', + data: [...projectsApplication, clearlyDefinedProject], + }, + { + id: 'scancode-projects', + title: 'Scan code with ScanCode', + data: projectsScancode, + }, + { + id: 'purl-projects', + title: 'Data keyed by Package-URL (PURL)', + data: [packageUrlProject, ...projectsPackageUrl], + }, + { + id: 'inspectors', + title: 'Inspectors for special purpose', + data: projectsInspectors, + }, + { + id: 'libraries', + title: 'Libraries and building blocks', + data: projectsLibraries, + }, +]; diff --git a/website/src/data/projects-featured.js b/website/src/data/projects-featured.js new file mode 100644 index 0000000..8c18122 --- /dev/null +++ b/website/src/data/projects-featured.js @@ -0,0 +1,149 @@ +export const packageUrlProject = { + group: 'package-url', + name: 'Package-URL', + description: [ + 'Package-URL (PURL) is a specification to reliably identify and locate software packages across package ecosystems.', + ], + repository_url: 'https://github.com/package-url/purl-spec', + documentation_url: 'https://github.com/package-url/purl-spec', + package_download_url: ['Not applicable'], + service_url: 'https://packageurl.org/', + languages: 'Not applicable', + software_license: 'MIT', + data_license: 'Not applicable', + platform: 'Not applicable', + lead_maintainer: ['Not applicable'], + notes: 'Not applicable', +}; + +export const clearlyDefinedProject = { + group: 'application', + name: 'ClearlyDefined', + description: [ + 'ClearlyDefined curates and serves open source component metadata for license, copyright, source, and security compliance.', + ], + repository_url: 'https://github.com/clearlydefined/clearlydefined', + documentation_url: 'https://docs.clearlydefined.io/', + package_download_url: ['Not applicable'], + service_url: 'https://clearlydefined.io/', + languages: 'TypeScript, JavaScript', + software_license: 'MIT', + data_license: 'CC-BY-4.0', + platform: 'Web', + lead_maintainer: ['Not applicable'], + notes: 'Not applicable', +}; + +export const featuredProjectSources = [ + { + id: 'featured-projects', + title: 'Featured projects', + data: [ + packageUrlProject, + { + group: 'scancode', + name: 'ScanCode Toolkit', + description: [ + 'ScanCode Toolkit is a set of code scanning tools that detect the origin (copyrights), license and vulnerabilities of code, packages and dependencies in a codebase.', + ], + repository_url: 'https://github.com/aboutcode-org/scancode-toolkit', + documentation_url: + 'https://scancode-toolkit.readthedocs.io/en/stable/', + package_download_url: [ + 'https://pypi.org/project/scancode-toolkit/', + 'https://pypi.org/project/scancode-toolkit-mini/', + ], + service_url: 'Not applicable', + languages: 'Python', + software_license: 'Apache-2.0', + data_license: 'CC-BY-4.0', + platform: 'Python', + lead_maintainer: ['https://github.com/AyanSinhaMahapatra'], + notes: 'Not applicable', + }, + { + group: 'application', + name: 'ScanCode.io', + description: [ + 'ScanCode.io provides a Web UI and API to run and review complex scans in rich scripted pipelines, on different kinds of containers, docker images, package archives, manifests etc, to get information on licenses, copyrights, sources, and vulnerabilities.', + ], + repository_url: 'https://github.com/aboutcode-org/scancode.io', + documentation_url: 'https://scancodeio.readthedocs.io/en/latest/', + package_download_url: ['https://pypi.org/project/scancodeio/'], + service_url: 'Not applicable', + languages: 'Python', + software_license: 'Apache-2.0', + data_license: 'Not applicable', + platform: 'Docker', + lead_maintainer: ['https://github.com/tdruez'], + notes: 'Not applicable', + }, + { + group: 'package-url', + name: 'PurlDB', + description: [ + 'PURLDB provides tools to create and update a database of package metadata keyed by PURL (Package URL) and an API for the PURL data.', + ], + repository_url: 'https://github.com/aboutcode-org/purldb', + documentation_url: 'https://purldb.readthedocs.io/en/stable/', + package_download_url: [ + 'https://pypi.org/project/minecode-pipelines/', + 'https://pypi.org/project/purl2vcs/', + ], + service_url: 'https://public.purldb.io/api/', + languages: 'Python', + software_license: 'Apache-2.0', + data_license: 'CC-BY-SA-4.0', + platform: 'Debian-based Linux distros', + lead_maintainer: ['https://github.com/JonoYang'], + notes: 'Not applicable', + }, + { + group: 'application', + name: 'DejaCode', + description: [ + 'DejaCode provides an enterprise-level application to automate open source license compliance and ensure software supply chain integrity, powered by ScanCode.', + ], + repository_url: 'https://github.com/aboutcode-org/dejacode', + documentation_url: 'https://dejacode.readthedocs.io/en/stable/', + package_download_url: ['https://pypi.org/project/dejacode/'], + service_url: 'https://public.dejacode.com/account/register/', + languages: 'Python', + software_license: 'AGPL-3.0-only', + data_license: 'Not applicable', + platform: 'Docker, Debian-based Linux distros', + lead_maintainer: [ + 'https://github.com/tdruez', + 'https://github.com/DennisClark', + ], + notes: 'Not applicable', + }, + { + group: 'application', + name: 'VulnerableCode', + description: [ + 'VulnerableCode provides a Web UI and API to access a database of known software package vulnerabilities with comprehensive information from upstream and downstream public sources including packages affected by a vulnerability and packages that fix a vulnerability. There is a public VulnerableCode database at: https://public.vulnerablecode.io/ and the project also provides the tools to build your own instance of the database.', + ], + repository_url: 'https://github.com/aboutcode-org/vulnerablecode', + documentation_url: + 'https://vulnerablecode.readthedocs.io/en/stable/', + package_download_url: [ + 'https://pypi.org/project/vulnerablecode/', + 'https://pypi.org/project/aboutcode.federated/', + 'https://pypi.org/project/aboutcode.hashid/', + ], + service_url: 'https://public.vulnerablecode.io/', + languages: 'Python', + software_license: 'Apache-2.0', + data_license: 'CC-BY-SA-4.0', + platform: 'Docker, Debian-based Linux distros, MacOS', + lead_maintainer: [ + 'https://github.com/TG1999', + 'https://github.com/keshav-space', + ], + notes: 'Coming soon: https://public2.vulnerablecode.io/.', + }, + clearlyDefinedProject, + ], + }, +]; diff --git a/website/src/data/projects-libraries.json b/website/src/data/projects-libraries.json index 27d8556..74d8cde 100644 --- a/website/src/data/projects-libraries.json +++ b/website/src/data/projects-libraries.json @@ -1,7 +1,7 @@ [ { "group": "libraries", - "name": "ag-gen-code-search", + "name": "ai-gen-code-search", "description": ["Open source tools to find code that may have been generated using LLMs and GPT tools."], "repository_url": "https://github.com/aboutcode-org/ai-gen-code-search", "documentation_url": "https://ai-gen-code-search.readthedocs.io/en/stable/", diff --git a/website/src/pages/index.js b/website/src/pages/index.js index b877021..293f41c 100644 --- a/website/src/pages/index.js +++ b/website/src/pages/index.js @@ -4,7 +4,7 @@ import HomepageContent from "../components/HomepageContent"; export default function Home() { return ( - + diff --git a/website/src/pages/index.module.css b/website/src/pages/index.module.css deleted file mode 100644 index 639334b..0000000 --- a/website/src/pages/index.module.css +++ /dev/null @@ -1,28 +0,0 @@ -/** - * CSS files with the .module.css suffix will be treated as CSS modules - * and scoped locally. - */ - -.heroBanner { - padding: 4rem 0; - text-align: center; - position: relative; - overflow: hidden; -} - -@media screen and (max-width: 996px) { - .heroBanner { - padding: 2rem; - } -} - -.buttons { - display: flex; - align-items: center; - justify-content: center; -} - -.container { - background-color: #e8e8e8 !important; - background: #ffffcc !important; -} diff --git a/website/src/pages/markdown-page.md b/website/src/pages/markdown-page.md deleted file mode 100644 index 9756c5b..0000000 --- a/website/src/pages/markdown-page.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Markdown page example ---- - -# Markdown page example - -You don't need React to write simple standalone pages. diff --git a/website/src/pages/projects.js b/website/src/pages/projects.js new file mode 100644 index 0000000..af020c1 --- /dev/null +++ b/website/src/pages/projects.js @@ -0,0 +1,31 @@ +import React from 'react'; +import Layout from '@theme/Layout'; +import ProjectOverview from '@site/src/components/HomepageContent/ProjectOverview.md'; +import ProjectGridTemplate from '@site/src/components/ProjectGridTemplate'; +import { allProjectSources } from '@site/src/data/projects-all'; +import styles from '@site/src/components/HomepageContent/styles.module.css'; + +export default function Projects() { + return ( + +
+
+
+

Projects

+
+
+ +
+ +
+
+
+
+ ); +} diff --git a/website/static/img/AboutCode-logo-stackedv3.png b/website/static/img/AboutCode-logo-stackedv3.png deleted file mode 100644 index 8d98e50..0000000 Binary files a/website/static/img/AboutCode-logo-stackedv3.png and /dev/null differ diff --git a/website/static/img/LI-In-Bug.png b/website/static/img/LI-In-Bug.png deleted file mode 100644 index 8bc2d53..0000000 Binary files a/website/static/img/LI-In-Bug.png and /dev/null differ diff --git a/website/static/img/SLA-Slack-from-Salesforce-logo-inverse.png b/website/static/img/SLA-Slack-from-Salesforce-logo-inverse.png deleted file mode 100644 index 2401b3e..0000000 Binary files a/website/static/img/SLA-Slack-from-Salesforce-logo-inverse.png and /dev/null differ diff --git a/website/static/img/docusaurus-social-card.jpg b/website/static/img/docusaurus-social-card.jpg deleted file mode 100644 index ffcb448..0000000 Binary files a/website/static/img/docusaurus-social-card.jpg and /dev/null differ diff --git a/website/static/img/docusaurus.png b/website/static/img/docusaurus.png deleted file mode 100644 index f458149..0000000 Binary files a/website/static/img/docusaurus.png and /dev/null differ diff --git a/website/static/img/favicon-test.ico b/website/static/img/favicon-test.ico deleted file mode 100644 index fc9b323..0000000 Binary files a/website/static/img/favicon-test.ico and /dev/null differ diff --git a/website/static/img/favicon.ico b/website/static/img/favicon.ico index c01d54b..5e9f31a 100644 Binary files a/website/static/img/favicon.ico and b/website/static/img/favicon.ico differ diff --git a/website/static/img/gitter.jpg b/website/static/img/gitter.jpg deleted file mode 100644 index 65d173e..0000000 Binary files a/website/static/img/gitter.jpg and /dev/null differ diff --git a/website/static/img/help.svg b/website/static/img/help.svg deleted file mode 100644 index 32d85e2..0000000 --- a/website/static/img/help.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - diff --git a/website/static/img/icons/pillar-data.png b/website/static/img/icons/pillar-data.png new file mode 100644 index 0000000..c05ce29 Binary files /dev/null and b/website/static/img/icons/pillar-data.png differ diff --git a/website/static/img/icons/pillar-shared.png b/website/static/img/icons/pillar-shared.png new file mode 100644 index 0000000..b039c3b Binary files /dev/null and b/website/static/img/icons/pillar-shared.png differ diff --git a/website/static/img/icons/pillar-standards.png b/website/static/img/icons/pillar-standards.png new file mode 100644 index 0000000..3aba7e8 Binary files /dev/null and b/website/static/img/icons/pillar-standards.png differ diff --git a/website/static/img/icons/pillar-tools.png b/website/static/img/icons/pillar-tools.png new file mode 100644 index 0000000..835db11 Binary files /dev/null and b/website/static/img/icons/pillar-tools.png differ diff --git a/website/static/img/icons8-envelope-50.png b/website/static/img/icons8-envelope-50.png deleted file mode 100644 index 6478c17..0000000 Binary files a/website/static/img/icons8-envelope-50.png and /dev/null differ diff --git a/website/static/img/link.svg b/website/static/img/link.svg deleted file mode 100644 index 8692433..0000000 --- a/website/static/img/link.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - diff --git a/website/static/img/logo.svg b/website/static/img/logo.svg deleted file mode 100644 index 9db6d0d..0000000 --- a/website/static/img/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/website/static/img/logos/alpm.png b/website/static/img/logos/alpm.png new file mode 100644 index 0000000..f3757c6 Binary files /dev/null and b/website/static/img/logos/alpm.png differ diff --git a/website/static/img/logos/apache.svg b/website/static/img/logos/apache.svg new file mode 100644 index 0000000..f1084df --- /dev/null +++ b/website/static/img/logos/apache.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website/static/img/logos/apk.png b/website/static/img/logos/apk.png new file mode 100644 index 0000000..976f428 Binary files /dev/null and b/website/static/img/logos/apk.png differ diff --git a/website/static/img/logos/bazel.png b/website/static/img/logos/bazel.png new file mode 100644 index 0000000..ac74e82 Binary files /dev/null and b/website/static/img/logos/bazel.png differ diff --git a/website/static/img/logos/bitbucket.png b/website/static/img/logos/bitbucket.png new file mode 100644 index 0000000..680f501 Binary files /dev/null and b/website/static/img/logos/bitbucket.png differ diff --git a/website/static/img/logos/bitnami.png b/website/static/img/logos/bitnami.png new file mode 100644 index 0000000..f321194 Binary files /dev/null and b/website/static/img/logos/bitnami.png differ diff --git a/website/static/img/logos/bower.png b/website/static/img/logos/bower.png new file mode 100644 index 0000000..9885feb Binary files /dev/null and b/website/static/img/logos/bower.png differ diff --git a/website/static/img/logos/cargo.png b/website/static/img/logos/cargo.png new file mode 100644 index 0000000..e3a9920 Binary files /dev/null and b/website/static/img/logos/cargo.png differ diff --git a/website/static/img/logos/chef.png b/website/static/img/logos/chef.png new file mode 100644 index 0000000..e7e318d Binary files /dev/null and b/website/static/img/logos/chef.png differ diff --git a/website/static/img/logos/cisa.png b/website/static/img/logos/cisa.png new file mode 100644 index 0000000..4197944 Binary files /dev/null and b/website/static/img/logos/cisa.png differ diff --git a/website/static/img/logos/clearlydefined.png b/website/static/img/logos/clearlydefined.png new file mode 100644 index 0000000..e14b003 Binary files /dev/null and b/website/static/img/logos/clearlydefined.png differ diff --git a/website/static/img/logos/cocoapods.png b/website/static/img/logos/cocoapods.png new file mode 100644 index 0000000..6c4180b Binary files /dev/null and b/website/static/img/logos/cocoapods.png differ diff --git a/website/static/img/logos/composer.jpg b/website/static/img/logos/composer.jpg new file mode 100644 index 0000000..f32c37d Binary files /dev/null and b/website/static/img/logos/composer.jpg differ diff --git a/website/static/img/logos/conan.png b/website/static/img/logos/conan.png new file mode 100644 index 0000000..eee7100 Binary files /dev/null and b/website/static/img/logos/conan.png differ diff --git a/website/static/img/logos/conda.png b/website/static/img/logos/conda.png new file mode 100644 index 0000000..0b48979 Binary files /dev/null and b/website/static/img/logos/conda.png differ diff --git a/website/static/img/logos/cpan.png b/website/static/img/logos/cpan.png new file mode 100644 index 0000000..fcb0e1e Binary files /dev/null and b/website/static/img/logos/cpan.png differ diff --git a/website/static/img/logos/cran.png b/website/static/img/logos/cran.png new file mode 100644 index 0000000..1d4fcd7 Binary files /dev/null and b/website/static/img/logos/cran.png differ diff --git a/website/static/img/logos/csaf.png b/website/static/img/logos/csaf.png new file mode 100644 index 0000000..0d9dee9 Binary files /dev/null and b/website/static/img/logos/csaf.png differ diff --git a/website/static/img/logos/curl.svg b/website/static/img/logos/curl.svg new file mode 100644 index 0000000..7dc0cd0 --- /dev/null +++ b/website/static/img/logos/curl.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/website/static/img/logos/cve.svg b/website/static/img/logos/cve.svg new file mode 100644 index 0000000..89d19ca --- /dev/null +++ b/website/static/img/logos/cve.svg @@ -0,0 +1 @@ +® \ No newline at end of file diff --git a/website/static/img/logos/cyclonedx.png b/website/static/img/logos/cyclonedx.png new file mode 100644 index 0000000..b4c9854 Binary files /dev/null and b/website/static/img/logos/cyclonedx.png differ diff --git a/website/static/img/logos/deb.png b/website/static/img/logos/deb.png new file mode 100644 index 0000000..045f241 Binary files /dev/null and b/website/static/img/logos/deb.png differ diff --git a/website/static/img/logos/dependency-track.svg b/website/static/img/logos/dependency-track.svg new file mode 100644 index 0000000..375903b --- /dev/null +++ b/website/static/img/logos/dependency-track.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/static/img/logos/docker.png b/website/static/img/logos/docker.png new file mode 100644 index 0000000..a1bb9aa Binary files /dev/null and b/website/static/img/logos/docker.png differ diff --git a/website/static/img/logos/eclipse-apoapsis.png b/website/static/img/logos/eclipse-apoapsis.png new file mode 100644 index 0000000..38dbf24 Binary files /dev/null and b/website/static/img/logos/eclipse-apoapsis.png differ diff --git a/website/static/img/logos/eclipse-foundation.svg b/website/static/img/logos/eclipse-foundation.svg new file mode 100644 index 0000000..936c2fc --- /dev/null +++ b/website/static/img/logos/eclipse-foundation.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/website/static/img/logos/ecosystems.png b/website/static/img/logos/ecosystems.png new file mode 100644 index 0000000..0390ae7 Binary files /dev/null and b/website/static/img/logos/ecosystems.png differ diff --git a/website/static/img/logos/elixir.png b/website/static/img/logos/elixir.png new file mode 100644 index 0000000..9c13fb5 Binary files /dev/null and b/website/static/img/logos/elixir.png differ diff --git a/website/static/img/logos/epss.png b/website/static/img/logos/epss.png new file mode 100644 index 0000000..5ff8a59 Binary files /dev/null and b/website/static/img/logos/epss.png differ diff --git a/website/static/img/logos/erlang-ecosystem.png b/website/static/img/logos/erlang-ecosystem.png new file mode 100644 index 0000000..c1f001f Binary files /dev/null and b/website/static/img/logos/erlang-ecosystem.png differ diff --git a/website/static/img/logos/fdroid.png b/website/static/img/logos/fdroid.png new file mode 100644 index 0000000..ba7ef12 Binary files /dev/null and b/website/static/img/logos/fdroid.png differ diff --git a/website/static/img/logos/fosslight.png b/website/static/img/logos/fosslight.png new file mode 100644 index 0000000..e1f21cd Binary files /dev/null and b/website/static/img/logos/fosslight.png differ diff --git a/website/static/img/logos/fossology.png b/website/static/img/logos/fossology.png new file mode 100644 index 0000000..77718bd Binary files /dev/null and b/website/static/img/logos/fossology.png differ diff --git a/website/static/img/logos/freebsd.png b/website/static/img/logos/freebsd.png new file mode 100644 index 0000000..fd00ed5 Binary files /dev/null and b/website/static/img/logos/freebsd.png differ diff --git a/website/static/img/logos/fsfe.svg b/website/static/img/logos/fsfe.svg new file mode 100644 index 0000000..4838179 --- /dev/null +++ b/website/static/img/logos/fsfe.svg @@ -0,0 +1 @@ + diff --git a/website/static/img/logos/gem.png b/website/static/img/logos/gem.png new file mode 100644 index 0000000..e3ff219 Binary files /dev/null and b/website/static/img/logos/gem.png differ diff --git a/website/static/img/logos/gentoo.png b/website/static/img/logos/gentoo.png new file mode 100644 index 0000000..09f08cf Binary files /dev/null and b/website/static/img/logos/gentoo.png differ diff --git a/website/static/img/logos/github.png b/website/static/img/logos/github.png new file mode 100644 index 0000000..e28a837 Binary files /dev/null and b/website/static/img/logos/github.png differ diff --git a/website/static/img/logos/gitlab.png b/website/static/img/logos/gitlab.png new file mode 100644 index 0000000..b983a0f Binary files /dev/null and b/website/static/img/logos/gitlab.png differ diff --git a/website/static/img/logos/golang.png b/website/static/img/logos/golang.png new file mode 100644 index 0000000..555dd88 Binary files /dev/null and b/website/static/img/logos/golang.png differ diff --git a/website/static/img/logos/grype.png b/website/static/img/logos/grype.png new file mode 100644 index 0000000..496eb95 Binary files /dev/null and b/website/static/img/logos/grype.png differ diff --git a/website/static/img/logos/guac.png b/website/static/img/logos/guac.png new file mode 100644 index 0000000..171e435 Binary files /dev/null and b/website/static/img/logos/guac.png differ diff --git a/website/static/img/logos/hackage.png b/website/static/img/logos/hackage.png new file mode 100644 index 0000000..c41182f Binary files /dev/null and b/website/static/img/logos/hackage.png differ diff --git a/website/static/img/logos/haxe.png b/website/static/img/logos/haxe.png new file mode 100644 index 0000000..0a41eb9 Binary files /dev/null and b/website/static/img/logos/haxe.png differ diff --git a/website/static/img/logos/hex.png b/website/static/img/logos/hex.png new file mode 100644 index 0000000..caba666 Binary files /dev/null and b/website/static/img/logos/hex.png differ diff --git a/website/static/img/logos/huggingface.svg b/website/static/img/logos/huggingface.svg new file mode 100644 index 0000000..ab959d1 --- /dev/null +++ b/website/static/img/logos/huggingface.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/website/static/img/logos/istio.png b/website/static/img/logos/istio.png new file mode 100644 index 0000000..2a56945 Binary files /dev/null and b/website/static/img/logos/istio.png differ diff --git a/website/static/img/logos/julia.png b/website/static/img/logos/julia.png new file mode 100644 index 0000000..8bc51a7 Binary files /dev/null and b/website/static/img/logos/julia.png differ diff --git a/website/static/img/logos/linux-foundation.svg b/website/static/img/logos/linux-foundation.svg new file mode 100644 index 0000000..9c120ff --- /dev/null +++ b/website/static/img/logos/linux-foundation.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website/static/img/logos/luarocks.svg b/website/static/img/logos/luarocks.svg new file mode 100644 index 0000000..24d3a9a --- /dev/null +++ b/website/static/img/logos/luarocks.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/static/img/logos/mattermost.png b/website/static/img/logos/mattermost.png new file mode 100644 index 0000000..aceed89 Binary files /dev/null and b/website/static/img/logos/mattermost.png differ diff --git a/website/static/img/logos/maven.png b/website/static/img/logos/maven.png new file mode 100644 index 0000000..aede0fd Binary files /dev/null and b/website/static/img/logos/maven.png differ diff --git a/website/static/img/logos/mlflow.png b/website/static/img/logos/mlflow.png new file mode 100644 index 0000000..844c197 Binary files /dev/null and b/website/static/img/logos/mlflow.png differ diff --git a/website/static/img/logos/mozilla.svg b/website/static/img/logos/mozilla.svg new file mode 100644 index 0000000..612357c --- /dev/null +++ b/website/static/img/logos/mozilla.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/static/img/logos/npm.png b/website/static/img/logos/npm.png new file mode 100644 index 0000000..db04134 Binary files /dev/null and b/website/static/img/logos/npm.png differ diff --git a/website/static/img/logos/nuget.png b/website/static/img/logos/nuget.png new file mode 100644 index 0000000..cff2f5f Binary files /dev/null and b/website/static/img/logos/nuget.png differ diff --git a/website/static/img/logos/nvd.png b/website/static/img/logos/nvd.png new file mode 100644 index 0000000..fa69991 Binary files /dev/null and b/website/static/img/logos/nvd.png differ diff --git a/website/static/img/logos/oci.png b/website/static/img/logos/oci.png new file mode 100644 index 0000000..3979850 Binary files /dev/null and b/website/static/img/logos/oci.png differ diff --git a/website/static/img/logos/opam.svg b/website/static/img/logos/opam.svg new file mode 100644 index 0000000..423de41 --- /dev/null +++ b/website/static/img/logos/opam.svg @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/static/img/logos/openchain.png b/website/static/img/logos/openchain.png new file mode 100644 index 0000000..9b718b6 Binary files /dev/null and b/website/static/img/logos/openchain.png differ diff --git a/website/static/img/logos/openssf.png b/website/static/img/logos/openssf.png new file mode 100644 index 0000000..31c3dd7 Binary files /dev/null and b/website/static/img/logos/openssf.png differ diff --git a/website/static/img/logos/openssl.png b/website/static/img/logos/openssl.png new file mode 100644 index 0000000..36ae18d Binary files /dev/null and b/website/static/img/logos/openssl.png differ diff --git a/website/static/img/logos/openvex.png b/website/static/img/logos/openvex.png new file mode 100644 index 0000000..587a789 Binary files /dev/null and b/website/static/img/logos/openvex.png differ diff --git a/website/static/img/logos/openwrt.png b/website/static/img/logos/openwrt.png new file mode 100644 index 0000000..89ee069 Binary files /dev/null and b/website/static/img/logos/openwrt.png differ diff --git a/website/static/img/logos/ort.png b/website/static/img/logos/ort.png new file mode 100644 index 0000000..84ce081 Binary files /dev/null and b/website/static/img/logos/ort.png differ diff --git a/website/static/img/logos/osi.png b/website/static/img/logos/osi.png new file mode 100644 index 0000000..83cdc1d Binary files /dev/null and b/website/static/img/logos/osi.png differ diff --git a/website/static/img/logos/oss-compass.png b/website/static/img/logos/oss-compass.png new file mode 100644 index 0000000..f32b460 Binary files /dev/null and b/website/static/img/logos/oss-compass.png differ diff --git a/website/static/img/logos/osselot.svg b/website/static/img/logos/osselot.svg new file mode 100644 index 0000000..0bdc918 --- /dev/null +++ b/website/static/img/logos/osselot.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/website/static/img/logos/ossfuzz.png b/website/static/img/logos/ossfuzz.png new file mode 100644 index 0000000..199df89 Binary files /dev/null and b/website/static/img/logos/ossfuzz.png differ diff --git a/website/static/img/logos/ossindex.png b/website/static/img/logos/ossindex.png new file mode 100644 index 0000000..0bd39b5 Binary files /dev/null and b/website/static/img/logos/ossindex.png differ diff --git a/website/static/img/logos/osv.svg b/website/static/img/logos/osv.svg new file mode 100644 index 0000000..f20bc80 --- /dev/null +++ b/website/static/img/logos/osv.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website/static/img/logos/otp.png b/website/static/img/logos/otp.png new file mode 100644 index 0000000..f16a8ce Binary files /dev/null and b/website/static/img/logos/otp.png differ diff --git a/website/static/img/logos/ow2.png b/website/static/img/logos/ow2.png new file mode 100644 index 0000000..2a6b98f Binary files /dev/null and b/website/static/img/logos/ow2.png differ diff --git a/website/static/img/logos/owasp.png b/website/static/img/logos/owasp.png new file mode 100644 index 0000000..b0af38b Binary files /dev/null and b/website/static/img/logos/owasp.png differ diff --git a/website/static/img/logos/postgresql.svg b/website/static/img/logos/postgresql.svg new file mode 100644 index 0000000..d98e365 --- /dev/null +++ b/website/static/img/logos/postgresql.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website/static/img/logos/pub.png b/website/static/img/logos/pub.png new file mode 100644 index 0000000..e63791e Binary files /dev/null and b/website/static/img/logos/pub.png differ diff --git a/website/static/img/logos/pypi.png b/website/static/img/logos/pypi.png new file mode 100644 index 0000000..4c7ec98 Binary files /dev/null and b/website/static/img/logos/pypi.png differ diff --git a/website/static/img/logos/raku.svg b/website/static/img/logos/raku.svg new file mode 100644 index 0000000..44cde36 --- /dev/null +++ b/website/static/img/logos/raku.svg @@ -0,0 +1,887 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + Master slide + + + Slide + + Group + + Drawing + + + + + + + + + Group + + Drawing + + + + + + + + + Drawing + + + + + + + + + + Drawing + + + + + + + + + + + + + + + + Drawing + + + + + + + + + + Drawing + + + + + + + + + + + + + + + + Drawing + + + + + + + + + + + + + Drawing + + + + + + + + + Drawing + + + + + + + + + Drawing + + + + + + + + + + Group + + Drawing + + + + + + + + + Drawing + + + + + + + + + + Drawing + + + + + + + + + + Drawing + + + + + + + + + Drawing + + + + + + + + + + + + Drawing + + + + + + + + + + Drawing + + + + + + + + + Drawing + + + + + + + + + + + + + Drawing + + + + + + + + + Drawing + + + + + + + + + + + + Drawing + + + + + + + + + + + + Drawing + + + + + + + + + Group + + Drawing + + + Drawing + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Drawing + + + + + + + + + + Drawing + + + + + + + + + Drawing + + + + + + + + + Drawing + + + + + + + + + + Drawing + + + + + + + + + + Drawing + + + + + + + + + + Drawing + + + + + + TM + + + + + + + + + diff --git a/website/static/img/logos/redhat.png b/website/static/img/logos/redhat.png new file mode 100644 index 0000000..59564a2 Binary files /dev/null and b/website/static/img/logos/redhat.png differ diff --git a/website/static/img/logos/reuse.png b/website/static/img/logos/reuse.png new file mode 100644 index 0000000..1014a38 Binary files /dev/null and b/website/static/img/logos/reuse.png differ diff --git a/website/static/img/logos/rpm.png b/website/static/img/logos/rpm.png new file mode 100644 index 0000000..b153973 Binary files /dev/null and b/website/static/img/logos/rpm.png differ diff --git a/website/static/img/logos/rust-foundation.png b/website/static/img/logos/rust-foundation.png new file mode 100644 index 0000000..598f212 Binary files /dev/null and b/website/static/img/logos/rust-foundation.png differ diff --git a/website/static/img/logos/scanoss.png b/website/static/img/logos/scanoss.png new file mode 100644 index 0000000..a48d266 Binary files /dev/null and b/website/static/img/logos/scanoss.png differ diff --git a/website/static/img/logos/software-heritage.png b/website/static/img/logos/software-heritage.png new file mode 100644 index 0000000..91fd3d5 Binary files /dev/null and b/website/static/img/logos/software-heritage.png differ diff --git a/website/static/img/logos/spdx.png b/website/static/img/logos/spdx.png new file mode 100644 index 0000000..60a5e87 Binary files /dev/null and b/website/static/img/logos/spdx.png differ diff --git a/website/static/img/logos/suse.svg b/website/static/img/logos/suse.svg new file mode 100644 index 0000000..2736e28 --- /dev/null +++ b/website/static/img/logos/suse.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/website/static/img/logos/sw360.svg b/website/static/img/logos/sw360.svg new file mode 100644 index 0000000..782095e --- /dev/null +++ b/website/static/img/logos/sw360.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/static/img/logos/swift.svg b/website/static/img/logos/swift.svg new file mode 100644 index 0000000..9e97bfa --- /dev/null +++ b/website/static/img/logos/swift.svg @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/website/static/img/logos/syft.png b/website/static/img/logos/syft.png new file mode 100644 index 0000000..0bbcd2b Binary files /dev/null and b/website/static/img/logos/syft.png differ diff --git a/website/static/img/logos/trivy.png b/website/static/img/logos/trivy.png new file mode 100644 index 0000000..08943b5 Binary files /dev/null and b/website/static/img/logos/trivy.png differ diff --git a/website/static/img/logos/ubuntu.svg b/website/static/img/logos/ubuntu.svg new file mode 100644 index 0000000..377c140 --- /dev/null +++ b/website/static/img/logos/ubuntu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/static/img/logos/xen.png b/website/static/img/logos/xen.png new file mode 100644 index 0000000..8baef3c Binary files /dev/null and b/website/static/img/logos/xen.png differ diff --git a/website/static/img/logos/yocto.png b/website/static/img/logos/yocto.png new file mode 100644 index 0000000..901c8a6 Binary files /dev/null and b/website/static/img/logos/yocto.png differ diff --git a/website/static/img/nexB_icon.png b/website/static/img/nexB_icon.png deleted file mode 100644 index 7842694..0000000 Binary files a/website/static/img/nexB_icon.png and /dev/null differ diff --git a/website/static/img/no_logo_placeholder.svg b/website/static/img/no_logo_placeholder.svg deleted file mode 100644 index 7cd3367..0000000 --- a/website/static/img/no_logo_placeholder.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - NO - LOGO - \ No newline at end of file diff --git a/website/static/img/undraw_docusaurus_mountain.svg b/website/static/img/undraw_docusaurus_mountain.svg deleted file mode 100644 index af961c4..0000000 --- a/website/static/img/undraw_docusaurus_mountain.svg +++ /dev/null @@ -1,171 +0,0 @@ - - Easy to Use - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/website/static/img/undraw_docusaurus_react.svg b/website/static/img/undraw_docusaurus_react.svg deleted file mode 100644 index 94b5cf0..0000000 --- a/website/static/img/undraw_docusaurus_react.svg +++ /dev/null @@ -1,170 +0,0 @@ - - Powered by React - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/website/static/img/undraw_docusaurus_tree.svg b/website/static/img/undraw_docusaurus_tree.svg deleted file mode 100644 index d9161d3..0000000 --- a/website/static/img/undraw_docusaurus_tree.svg +++ /dev/null @@ -1,40 +0,0 @@ - - Focus on What Matters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/website/static/img/www-aboutcode-org-navbar-2026-02-05.png b/website/static/img/www-aboutcode-org-navbar-2026-02-05.png deleted file mode 100644 index 47c1fc8..0000000 Binary files a/website/static/img/www-aboutcode-org-navbar-2026-02-05.png and /dev/null differ