# Introduction to the OpenTitan Project

&lt;Deeper dive into what the project is all about, as compared to intro paragraph on bubble server.
Open source strategy; History; Who are we?; Etc (more deep from the intro paragraph)&gt;

## OpenTitan project governance

&lt;Governance.
Keep the “garden” healthy;
Corp partners;
Technical ‘code owners’ etc;
How to get commit permission / acceptance;
How are PRs accepted; what is the process by which things are allowed / rejected;
partner criteria;
code of conduct; and maintaining code and community health;
Code style and format issues;
steering committees;
Trademark use policy;
License policy / CLA&gt;

## How to get involved

&lt;Just brief points as to how to start out;
“My company just signed up, how do I figure out what to work on and who to talk to?”;
link to getting started user guides;
Team drive (for internal/confidential docs) vs github, mailing list vs chat, etc.&gt;

## Quality standards for open hardware IP

&lt;Maturity standards - what they are;
Articulate maturity/quality level per IP (could vary across different IPs);
Different “support” expectation;
How we maintain quality;
possible reference to certification;
Process to ensure logical security of included IP;
Security exposure/disclosure.&gt;

## Project status

&lt;Process - who is doing what, current status, how to document;
List of partners; list of contributing individuals
Some presentation of current status;
Code coverage + completion;
Test coverage;
alpha/beta designation;
design dashboard.&gt;

