felixhageloh / uebersicht
ˈyːbɐˌzɪçt
AI Architecture Analysis
This repository is indexed by RepoMind. By analyzing felixhageloh/uebersicht in our AI interface, you can instantly generate complete architecture diagrams, visualize control flows, and perform automated security audits across the entire codebase.
Our Agentic Context Augmented Generation (Agentic CAG) engine loads full source files into context on-demand, avoiding the fragmentation of traditional RAG systems. Ask questions about the architecture, dependencies, or specific features to see it in action.
Repository Overview (README excerpt)
Crawler viewÜbersicht *Keep an eye on what's happening on your machine and in the world.* For general info check out the Übersicht website. Writing Widgets In essence, widgets are JavaScript modules that expose a few key properties and methods. They need to be defined in a single file with a extension for Übersicht to pick them up. Previously, widgets could be written in CoffeeScript and are still supported. Check the old documentation for details. Übersicht will listen to file changes inside your widget directory, so you can edit widgets and see the result live. Widget rendering is done using React and its JSX syntax. Simple widget state is managed for you by Übersicht, but for more advanced widgets you can manage state using a Redux-like pattern. You events, which get processed by a single function which returns the new state, which is passed to the render function of your widget. State is kept when you modify your widget, which allows for live coding. Any changes to the UI of your widget will be immediately visible. One drawback (at least with the current implementation) is that if you change the shape of your state you might have to 'Refresh all Widgets' from the app menu for your widget to work. You can also include node modules and split your widget into separate files using ESM syntax. Any file that is in a directory called , or will be treated as a module and will not show up as a separate widget. The following properties and methods are supported: command A **string** containing the shell command to be executed, or a **function(dispatch : function)** which eventually dispatches an event, or **undefined** meaning that no command will be executed for this widget. For example: Watch out for quotes inside commands. Often they need to properly escaped, like: Example using a command function: The first and only argument passed to a command function is a function, which you can use to dispatch plain JasvaScript objects, called events, to be picked up by your function. refreshFrequency An **number** specifying how often the above command is executed. It defines the delay in milliseconds between consecutive commands executions. Example: The default is 1000 (1s). If set to the widget won't refresh automatically. className An **object** or **string** defining the CSS rules to applied to the root of your widget. It is most commonly used control the position of your widget. It is converted to a CSS class name using the Emotion CSS-in-JS library. Read more about styling your widgets here. or Note that widgets are positioned absolute in relation to the screen (minus the menu bar), so a widget with and will be positioned in the top left corner of the screen, just below the menu bar. render : props A **function(props : object)** to render your widget. If you know React functional components you know how render works. The passed to this function is whatever state your function returns. If you don't provide your own function, the default props that are passed are and , containing the output your command produced and any error that might have occurred. The default implementation of render just returns . updateState : event, previousState A **function(event : object, previousState : object)** implementing the state update behavior of this widget. When provided, this function must return the next state, which will be passed as to your render function. The default function will return and from the event object. This will pass a props object containing and to the render function. If an error occurred, it will pass the previous state plus a warning message. If your widget has more complex state logic, for example because it is fetching data from several different sources, it is a good idea to add a property to your events. You can use this type to decide how to update your state. For example: This example also shows that you can make use of functions to further break down your state update logic. initialState An **object** with the initial state of your widget. If you provide a custom function you might need to define the initial state that gets passed on initial render of the widget. before any command has been run. The default initial state is . init : dispatch A **function(dispatch : function)** that is called the first time your widget loads. Many widgets won't need this, but you can use this function to perform any initial setup for more advanced use cases. For example, instead of relying on periodic shell commands, you might want to open and listen to WebSocket events to update your widget. Styling Widgets Uebersicht comes bundled with Emotion (version 9). It exposes it's and functions via the module. As described above, you can use to style and position the root node of your widget. For further styling you can do something like this: Alternatively, you can also make use of Emotion's styles components: Finally, since you can also install and import any module you like, you can use your favorite styling library instead. Running Shell Commands If need to run extra shell commands without using the command property, you can import the function from the module. It returns a Promise, which will resolve to the output of the command (stdout) or reject if any error occurred. > Note that in order to receive click events you need to configure an interaction shortcut and give Übersicht accessibility access. Geolocation API While the WebView used by Übersicht seems to provide the standard HTML5 geolocation API, it is not functional and there seems to be no way to enable it. Übersicht now provides a custom implementation, which tries to follow the standard implementation as closely as possible. However, so far it provides only the basics and might still be somewhat unstable. The api can be found under (instead of ). And supports the following methods Check the documentation for details on how to use these methods. The main difference to the standard API is that none of them…