Build me a single-file Streamlit app, dashboard.py. Point it at a folder of IDEA StatiCa .ideaCon files and show how often each plate thickness, weld size, and bolt size/grade is used across the project — so I can spot odd sizes and standardize them. Count one row per occurrence (pandas dataframe: file, connection, category, size_label). Three sections (Plates/Welds/Bolts), each with a bar chart (sorted from x axis label smallest to largest not from count), a count table, and a dropdown to pick a size and see which file + connection use it. Read how to use idea statica api https://developer.ideastatica.com/llms.txt Six things I learned the hard way — get these right: 1. Don't parse .ideaCon (binary). Don't use export_iom_connection_data either — it gives data.plates / data.welds / data.bolt_grids but OMITS the bolt assembly, so you can't get bolt sizes. Use export_iom(pid, conn_id), which returns the full OpenModelContainer as XML, and parse it with xml.etree.ElementTree. Plates/welds/bolt grids are under OpenModel/Connections/ConnectionData/{Plates/PlateData, Welds/WeldData, BoltGrids/BoltGrid}. 2. Values come back in METRES — multiply thickness/diameter by 1000 for mm. 3. The typed export_iom wrapper throws "Unsupported content type: application/xml" (it only deserializes JSON). Call export_iom_without_preload_content(pid, conn_id) and read raw resp.data bytes. 4. The body is UTF-8 bytes but the XML declaration says encoding="utf-16", so ET.fromstring(bytes) throws "encoding specified in XML declaration is incorrect". Decode the bytes yourself (utf-8-sig, utf-16 fallback) and strip the leading declaration before parsing. The root also has a default namespace, so strip namespaces (tag.rsplit('}',1)[-1]) or every find('OpenModel') returns None. 5. Bolt size isn't on the grid; BoltGrid/BoltAssembly/Id is just a reference. Match that id against the project bolt-assembly library at OpenModel/BoltAssembly/BoltAssembly (each has Id, Name like "M30 8.8", and Diameter in metres). These ids ARE self-consistent within the one XML document — joining them is the whole point of using export_iom. 6. Build the bolt label yourself: f"M{round(diameter*1000)} {grade}" -> "M30 8.8", where diameter is BoltAssembly/Diameter and grade is the trailing token of BoltAssembly/Name. Don't trust the raw Name verbatim, it's inconsistent between files. Skip plates where is_negative_object is true. Skip broken files instead of crashing. When done, let me know how to start the app.