You could pick an app or distro and:
  • Donate money to the project.

  • Seed torrents for a distro's files.

  • If you find bugs during normal use, report them.

  • Get onto the beta or insiders or "proposed" track, and report crashes and bugs.

  • Help to test it, systematically, using a plan and maybe automated tools. Maybe write new tests.

  • Help to improve the docs.

  • Help to improve the project or doc web sites.

  • If you're artistic, work on artwork or logos or themes.

  • Help to port an app or service to more distros or more DEs.

  • Help to translate a distro or app to more human languages.

  • Help to make a distro or app or site more accessible to the disabled or impaired.

  • Help to run a user's group, or conference, or other event.

  • Do some bug-fixing (start small: a smaller app you know well, in a language you know, small bugs).

  • Donate money to fund development or fixing of a particular feature, or do specific work yourself for money: Bountysource.

Jason Evangelho's "8 Ways To Contribute To The Desktop Linux Community, Without Knowing A Single Line Of Code"
wikiHow's "How to Contribute to Open Source"
Linux-For-Everyone / contribute-foss
Open Source Guides' "How to Contribute to Open Source"

John Regehr's "Responsible and Effective Bugfinding"
LTP - Linux Test Project
See "Reporting Bugs" section of my "Linux Troubleshooting" page
Shubheksha's "How to find your first open source bug to fix"
Dev Leonardo videos

Davide Coppola's "How to contribute to an open source project on GitHub"
Elizabeth K. Joseph's "4 ways I contribute to open source as a Linux systems administrator"
Quora discussion "How do I start contributing in Open Source projects?"
Sarah Drasner's "How to Contribute to an Open Source Project"
Jessica Wilkins' "7 common mistakes new contributors make in Open Source Software"
Command Line Heroes' S2E3 "Ready to Commit" (audio)
Debian's' "How can you help Debian?"

Linux Development

Start with an app, DE, or distro you use:
First, become a very good user:
  • Use the software, explore the features, read the docs and Help.

  • Update to the latest version, or the beta version.

  • File bug reports, and read the open issues/bugs.

  • Join the user forum or group or reddit sub.

Second, get into the development side of things:
  • Skim the source code, on GitHub or other site, or by cloning it to your local disk.

  • Build the app from source code and use the copy you built.
    Abhilash Mhaisne's "How to Install Software from Source in Linux"

  • Maybe run some of the tests or unit-tests, if available.

  • Join the developer's forum or group or reddit sub.

  • Read the open issues, and maybe recently-closed issues (and their pull-requests), for the project.

  • Read the project roadmap.

  • Maybe ask what unit or issues you should focus on, or ask for permission to work on a particular unit you're interested in.

kamranahmedse's "Getting Familiar with Unfamiliar Codebase"
Parth Parikh's "General Guide For Exploring Large Open Source Codebases"
Mitchell Hashimoto's "Contributing to Complex Projects"
Jaideep Rao's "4 big lessons from my internship with open source"
Not about open-source: Samuel Taylor's "How to Join a Team and Learn a Codebase"
Shivam Baghla's "Steps to Fall in Love With an Unfamiliar Codebase"

Learn git. Although some projects use another source-control system (e.g. Subversion, Darcs, Mercurial, more).
Catalin's Tech's "How To Make Your First Open-Source Contributions"
mohsen's "Open-Source contribution, a beginner's guide"

Pull Request to Gandalf
Development things to realize:
  • Maybe you will be stepping into a project that has a 20-year history, an enormous base of scripts, code, docs, and issue-tracking, and a big somewhat-changing team of developers. There may be hot-button or sore-point issues, long-running debates, factions, a roadmap.

  • It will take time to learn the code and tools and style.

  • There may be constraints you're not aware of, such as backward-compatibiity, or also runs on operating systems other than Linux, or also runs in cloud or IoT as well as on desktop, translated to 80 human languages, etc.

  • Maybe best not to start with one of the biggest, most-complex projects: kernel, browser, IDE, office suite.

  • Flitting from one project to another may be difficult, if they all use different tools and languages etc.

  • Probably best to keep things stable (e.g. no distro-hopping) while you're working on the project. Although using a VM for development environment can avoid problems.

  • People-issues and process will be very important; follow the rules, be humble, start very small.

  • If a project seems stalled (2 years since last release, bugs open for a long time, pull/merge requests outstanding for a long time), or going through a huge transition, or very undocumented, or broken in some way, maybe stay away (at least as a first project to join).

Big projects often have extensive guides for developers:
GNOME Wiki's "Building system components"
[GNOME] Tobias Bernard's "Community Power Part 1: Misconceptions"
KDE Community Wiki's "Get Involved"
Linux Mint Developer Guide
Debian Developers' Manuals
What can I do for Mozilla
What can I do for LibreOffice
What can I do for Fedora ?

From someone on reddit:
Anyone suitably capable can become an Ubuntu developer! ...

You start by providing fixes for existing Ubuntu developers to sponsor. Once you have a track record of good work and your existing sponsors are willing to endorse you, you can apply to become an Ubuntu developer yourself. ...
Ubuntu Packaging and Development Guide

Kernel Development

Konrad Zapalowicz's "Three Ways for Beginners to Contribute to the Linux Kernel"
Adam Zerella's "How to become a Linux kernel developer"
Jason Wertz's "Kernel Basics" (video) (2013 but interesting)
kernel.org's "HOWTO do Linux kernel development"
torvalds / linux "HOWTO do Linux kernel development"
Paul E. McKenney's "Joining the Linux Kernel Community"
Linux Kernel Newbies
Ubuntu Wiki's "Kernel / SourceCode"

Garrit Franke's "Compiling your own kernel"
danvet's "Why GitHub can't host the Linux Kernel Community"
david-0609's "How to Compile the Linux Kernel"
Ramces Red's "How to Build and Install a Custom Kernel on Ubuntu"
Shehroz Azam's "Compile and install kernel ubuntu"
phoenixNAP's "How to Build Linux Kernel From Scratch"
Arch: KernelBuild

Tamir Suliman's "Beginner's Guide to Writing your First Linux patch"
Sayli Karnik's "A checklist for submitting your first Linux kernel patch"
Kosta Zertsekel's "Who should I sent Linux Kernel patch to?"
Paul E. McKenney's post about getting a bugfix accepted
Byte Lab blog

IBM's "Anatomy of the Linux kernel"
Ashish Vara's "Kernel Architecture Of Linux (Part 7/15)"
Wikipedia's "Linux kernel - Architecture"
linux-kernel-labs' "Introduction"
linux-kernel-labs' "Overview of the Linux kernel"
Greg Kroah-Hartman's "Linux Kernel in a Nutshell"
Tigran Aivazian's "Linux Kernel 2.4 Internals"
online copy of Mel Gorman's book "Understanding the Linux Virtual Memory Manager"
online copy of Daniel Bovat and Marco Cesati's book "Understanding the Linux Kernel"
"Linux IP Stacks - Commentary"

The Linux Kernel documentation
Bootlin Elixir (Linux kernel source tree)
torvalds / linux (Linux kernel source tree)
Plailect / linux-devel (kernel development using VS Code and libvirtd)

Jesse Smith's "Benefits to building your own kernel"

Gaurav Kamathe's "Analyze the Linux kernel with ftrace"
Gaurav Kamathe's "Kernel tracing with trace-cmd"

SoByte's "Debugging Linux kernels with Qemu and GDB"
Chris Siebenmann's "Using drgn for poking into Linux kernel internals"

Sergio Prado's "How is the Linux kernel tested?"
Gaurav Kamathe's "Test your Linux system with LTP"

To get a local copy of the kernel source:

sudo apt install linux-source

mkdir $HOME/kernel
cd $HOME/kernel

tar -xaf /usr/src/linux-source-*.tar.*

du -sh *

Paraphrased from the Open Source Security podcast:
The kernel mostly is written in C, but it's not standard C as you might think of it. There are kernel-specific conventions, styles, and macroes that must be used.

From article:
"... the Linux kernel is not written in standard C, but rather in a dialect that relies on gcc extensions, code-style standards, and external tools. ..."

Driver / Kernel Module Development

Hcamael's "How to Develop Linux Driver from Scratch"
Corbet, Rubini, and Kroah-Hartman's "Linux Device Drivers, Third Edition"
Salzman, Burian, Pomerantz, Mottram, and Huang's "The Linux Kernel Module Programming Guide"
Salzman, Burian, and Pomerantz's "The Linux Kernel Module Programming Guide"
Andrew Klotz's "Making your first kernel module"
kernel.org's "The Linux driver implementer's API guide"
kmille's "How to debug a Linux Kernel Module"
baeldung's "How to Find Out What Is Using a Kernel Module"

From someone on reddit:
> do i need the entire kernel source to build modules?

Your distribution might provide the files needed to build kernel modules as a separate package.

Note that the naming can sometimes be confusing here. "Kernel headers" is often used to mean "the header files needed by userspace software to talk to the kernel", but this is not what you want. Instead, you want "the header files used by kernel code". These are quite distinct from the userspace kernel headers.

On Fedora, for instance, the kernel-devel package contains everything that is needed to build out-of-tree kernel modules. The package contains not just header files, but also some of the scripts and tools associated with the kernel build process.

... you need not have actually compiled the kernel source. You should be able to build an out-of-tree kernel module against a regular kernel source tree without already having compiled that source tree.

As far as I know there isn't a kernel Makefile target to "install the internal kernel headers somewhere". This kind of makes sense ... the kernel developers themselves have no need for it, since they've already got the kernel tree. ("make headers_install" actually installs the other kind of headers I mentioned above, the userspace headers.)

Linux Application Development

From someone on reddit:
> I want to take a stab at creating a couple of GUI Linux apps
> to improve the usability of some parts of the system that
> are locked to CLI.

Honestly, coding probably isn't going to be the lynchpin issue you'll run into.

Most projects are ruled like fiefdoms. Some are more reasonable/practical than others and as a result allow for more broader contributions, but you still run into issues where maintainers/developers will not accept or consider certain features because it either violates their vision or ethos for what they think their creation should be, or they don't want to support features they aren't interested in (desktop icons disappearing from GNOME 3 is a prime example). Whatever the case it's not a coding issue, the biggest problems with OSs are people issues.

Make a Linux App

Develop an Application

Nate's "Where bugfixes and new features come from"

I'm looking to bug-fix:

Pix / gThumb simple image-editor:
I decided to try fixing some of my own bug reports / feature requests in Pix, the image-processing app in Linux Mint. It's an app I use a fair amount, on a distro I use, written in a language (C) that I know.

I started the wrong way around, from the GitHub project for Pix (and filed bug report https://github.com/linuxmint/pix/issues/86). Had to wipe that out and start again.

Instead, start with Linux Mint Developer Guide. Install the tools:

apt update
apt install mint-dev-tools --install-recommends
apt install devhelp
"In general it's a good idea to build mint-common and xapps first."
But I didn't do that.

Project is https://github.com/linuxmint/pix

cd ~/projects
git clone https://github.com/linuxmint/pix.git
cd pix
# lots of:  warning: "gtk_*" is deprecated [-Wdeprecated-declarations]
# some:    warning: remember to run 'libtool --finish /usr/lib/x86_64-linux-gnu/pix/extensions'
# succeeded, and created ELF binary ./pix/pix, and also a bunch
# of installer files in .. (above the project directory !)
Test via:

# replace standard with new one just built
sudo mv /usr/bin/pix /usr/bin/pix.sav
sudo cp pix/pix /usr/bin/pix

# run new one, see if it works

# restore back to standard version
sudo rm /usr/bin/pix
sudo mv /usr/bin/pix.sav /usr/bin/pix
Subsequent builds (after the first) can be done by:

cd ~/projects/pix
I see that someone has had a Pix "pull request" (new code ready to merge into the master branch) outstanding for about 7 weeks now. Not a good sign.

In the README I see "Pix is based on gThumb 3.2.8.". Does this mean I should be bug-fixing in gThumb instead of in Pix, and the fixes will flow down to Pix ? gThumb is under active development. Looks like gThumb has a different build setup (meson + ninja) than Pix does (autoconf + make). Looks like Pix started from gThumb in 5/2016.

Installed gThumb. Turns out that Mint's Software Manager has the latest version that is compatible with this base version of Ubuntu. So installed from Software Manager.

Comparing Pix to gThumb (Pix is forked from gThumb), I like the Pix UI modifications done by the Mint team, and I found a setting that gets rid of one irritation I had with Pix. Also investigated and found a partial way to deal with another annoyance. Filed another small bug report against Pix.

Found this about building gThumb and other GNOME apps: GNOME Wiki's "Building system components"

And I see that someone has had a gThumb "merge request" (new code ready to merge into the master branch) outstanding for about 5 months now. Not a good sign. There has been lots of recent dev activity; maybe this request fell through the cracks.

So, I gave up on fixing Pix or gThumb. I found the setting I wanted, already implemented.

Thunderbird email client:
Wanted to fix error messages that say "something failed" or "password needed" without saying what email account, what server, what operation, etc.

Thunderbird's "Get Involved"

# You're going to need probably 25 GB of free disk space

sudo apt install mercurial

cd projects
mkdir mozilla
cd mozilla
# Next line takes about 30 minutes and 8 GB of disk
hg clone https://hg.mozilla.org/mozilla-central source/
cd source
hg clone https://hg.mozilla.org/comm-central comm/

sudo apt install python3-pip

sudo apt install llvm

sudo apt install libnotify-bin

# In source dir:
./mach bootstrap
# Choose option "2. Firefox for Desktop"

# Got some notice about updating PATH.
# Log out and back in.

rustc --version
# If you're missing Rust and/or cargo:
curl https://sh.rustup.rs -sSf | sh

cbindgen --version
# If you're missing cbindgen:
cargo install cbindgen
# If cargo is not found, maybe log out so PATH gets refreshed

# In source dir:
echo 'ac_add_options --enable-application=comm/mail' >mozconfig
echo 'ac_add_options --with-app-basename=Thunderbird' >>mozconfig

cd source
./mach build	# takes a couple of hours on my slow laptop
# And I found the cooling on my laptop is dead; 3+ minutes
# of heavy compiling makes CPU core temps spike from 55C to 82C.
# Now the mozilla tree will be about 20 GB of disk space

# First couple of builds on old laptop failed; did:
./mach clobber
./mach build

# Build on new fast laptop took 22 minutes,
# temperatures around 80 - 83C.
# Now projects/mozilla totals 21 GB.
# Executable result is ./source/obj-x86_64-pc-linux-gnu/dist/bin/thunderbird ?
# It's about 8 MB, since it includes symbols.

# Maybe quit out of existing Thunderbird and back it up before doing this ?
./mach run
# or:

# To get latest changes and build again:
# In source directory:
hg pull -u; (cd comm; hg pull -u)
./mach build

# Not sure where app is getting its config info from;
# not from my standard $HOME/.thunderbird

It appears the project is in the middle of MAJOR changes: https://www.ghacks.net/2021/02/10/thunderbird-team-outlines-plans-for-the-email-client/ I don't think I want to try to get involved.

Liferea RSS client:
I forget what I wanted to fix here.

lwindolf / liferea (code and bug-reporting)

Basic sanity:

# run installed release version of Liferea and export feed list to a file, in case of disaster

sudo apt install libtool intltool libxml2-dev libxslt1-dev libsqlite3-dev libwebkit2gtk-4.0-dev libjson-glib-dev libgirepository1.0-dev libpeas-dev gsettings-desktop-schemas-dev

cd ~/projects
git clone https://github.com/lwindolf/liferea.git
cd liferea

# says "Liferea will be installed in /usr/local/bin"
whereis liferea
# says I have release version of Liferea in /usr/bin

# see lots of warnings about deprecated GTK and pango things
# big gcc line near end gave lots of assertion failures

sudo make install

/usr/bin/liferea --version
/usr/local/bin/liferea --version


I submitted a PR to the README file, to make a section "how to build the app". It got rejected, they know that stuff already, feel no need to document it so new contributors could join. Gave up.

Akregator RSS client:
I want to fix:
(feed history:)
and implement:
(filename prefix:)

Source code
78K lines of code: Summary on Open Hub
KDE-PIM developer mailing list
KDE developer mailing list
The Akregator Handbook
KDE Community Forums (OLD)
Discuss - KDE Community (NEW)
KDE Community Wiki's "Mentoring"

The mailing-lists are low-volume; maybe IRC and Matrix etc have more traffic. Some tidbits: Konqueror (a huge-sounding app: combined web browser and file manager) has only one active developer, and the sole change-reviewer is quitting.

Akregator has 310 open issues as of 29 Oct 2022; oldest is 6 years old.

Quick glance at the code: dates back to 2004, Qt of course, all C++ (nice, only one language to deal with) and QML, almost no comments, (but with good naming, comments are less needed), no design document, no roadmap document. There is a test capability (in src/job/autotest) but only one small test.

Maybe start by writing a test that crawls the archive, gives stats, and checks it for compliance with settings ? Archive is stored in $HOME/.local/share/akregator/Archive (not that the test needs to know that).

Some getting-started questions:
- Okay to start by writing some autotests ? Are they actually used ?
- There are some "what is intended function ?" questions, such as "what does no-archiving mean ?" and "okay to delete feed history when a feed is deleted ?"

[I'm on MX Linux 21.2.1 Xfce:]
Tried installing Qt Creator 8.0.1, downloading Akregator source code, building it. Lots of Qt dependencies missing. Tried to fix them, but eventually realized that I should be on KDE Neon.

KDE development in a VM:
I like to distro-hop, so maybe I should run Neon and tool-chain and source etc in a VM. Handily, there is: KDE Community Wiki's "Developing in a virtual machine".

So I installed KDE Neon developer/unstable edition in a VM, following that article. I gave the VM 3 GB of RAM instead of the 2 shown in article, and should have done 22 GB of storage instead of 20. Did lots of updates, had to remove Okular and an old kernel to make enough space to do update to 22.04. Had 3.8 GB free after OS updates finished.

In Neon's Settings / Quick Settings, set "single-click" to "select".
In Neon's Settings / Search / File Search, disable search.
In VirtualBox's Settings / General / Advanced, set Clipboard to "bidirectional".
In VirtualBox's settings for the VM, create a Share of the Downloads directory ? Inside VM, it is accessible only to root.

Saved a backup of the VM (while shut down) by copying it in file-manager (see VirtualBox 'clone' vs 'snapshot' vs 'copy'). Ran VM. Consulted KDE Community Wiki's "Development".

How to set up source and tool-chain:

sudo apt install git cmake dialog

mkdir -p ~/kde/src
cd ~/kde/src/
git clone https://invent.kde.org/sdk/kdesrc-build.git
cd kdesrc-build

./kdesrc-build --initial-setup
source ~/.bashrc
# Check that source has worked by checking the
# new path for "~/kde/src/kdesrc-build":
echo $PATH
# https://apps.kde.org/kdesrc_build/
# https://docs.kde.org/trunk5/en/kdesrc-build/kdesrc-build/index.html

# Don't build all of Qt from source, use from distro:
# Edit ~/.config/kdesrc-buildrc so:
# qtdir
# and the lines include...qt5-build-include
# and include...custom-qt5-libs-build-include
# are commented out,
# and confirm line with kf5-qt5-build-include
# has NOT been commented out.
# Set include-dependencies to false.

# reboot VM and log back in

Free disk in VM is down to 3.5 GB.

How to build and run application:

# Do this in home directory:
kdesrc-build akregator
# Will download source via git,
# and build into ~/kde/usr/bin/akregator

# Run the copy you built:
kdesrc-run akregator
# App runs okay but doesn't quit cleanly IF YOU Alt+F4,
# GUI closes but then command in terminal is hung.
# Quits cleanly if you File / Quit (Ctrl+Q).

# Worked fine for a week or so, then some update to
# the app source resulted in version mismatch with
# headers/libraries on the distro.  Have to wait for
# distro update ?

# Tried to change ~/.config/kdesrc-buildrc to say
# "build everything", and couldn't get it to work.

# Then a distro update came through.  Updated, got
# build system back to sanity, still have version
# mismatch problem.  Wants "KF5GrantleeTheme" 5.22.40,
# I have 5.21.40.  Another distro update came through,
# still dead.

# Sent an email to mailing list, asking
# for help.  Got a DMARC failure, not sure on which end.

How to run with logging enabled:

# AKREGATOR_LOG is a Qt "logging category" ?
# https://www.qt.io/blog/2014/03/11/qt-weekly-1-categorized-logging

# There is ~/.config/QtProject.conf
# https://stackoverflow.com/questions/17305374/qt-5-0-built-in-logging

# Default, logging goes to console.  Send to log file with:
#    kdesrc-run akregator 2>log.txt
# If I add a statement:
#    qCInfo(AKREGATOR_LOG) << "in main.";
# on console I see:
#    org.kde.pim.akregator: in main.
# So by default, logging at the "info" level is enabled.
# Same if I use qCWarning(); no indication of level of message.

# Some messages are coming from outside the application.

# There are qCDebug() qCInfo() qCWarning() qCCritical()
# qCFatal() from <cassert> ?
# There are qDebug() qInfo() qWarning() qCritical()
# qFatal() from <QtGlobal> or <QDebug> ?

# There is a way to log to system journal or system log:
# https://www.ics.com/blog/whats-new-qt-560-logging-syslog-and-journald
# but what is the "configure script" it talks about ?

Free disk in VM is down to 3.2 GB.

How to build and run tests:

cd ~/kde/build/akregator/
source ./prefix.sh
ctest --show-only
ctest --verbose
ctest --output-on-failure

How to create a new test:
Test sources are in: ~/kde/src/akregator/src/job/autotests/ and ~/kde/src/akregator/src/job/ The main test code is in the latter.

But I think that is for tests that involve asynchronous behavior. For a simple synchronous test, just need files in ~/kde/src/akregator/src/job/autotests/

Some test "appstreamtest" is being run, seems to be some built-in KDE/ECM thing ?

Tests run inside namespace of application (have access to all classes), but not inside an instance of the running application.

Want to print allFeedsFolder()->totalCount()

https://doc.qt.io/qt-6/qtest-overview.html (for Qt 6.4)

Usually I use VSCodium editor, but since Kate is installed already, I'll use that.
Launch Kate, open a Folder at ~/kde/src/akregator.
Settings / Configure Kate / Session / Open Last Used Session.
Settings / Configure Kate / Session / Include Window Configuration.
Settings / Configure Kate / Appearance / Borders, disable Minimap.
Settings / disable Show Navigation Bar.
Settings / disable Show Statusbar.
Settings / Toolbars shown / disable Main Toolbar and Hamburger Menu Toolbar.
Then: Sessions / Save Session (name Default if asked).

Quit all apps. There were 2 updates for KDE Neon, I applied them and restarted the VM, and ... black screen, hung. Thought maybe the VM was dead, but then did a VirtualBox Machine / Reset, and it booted, applied updates, restarted, and booted to GUI normally.

Now the hard work: understand the app's codebase. For the time being, I'm interested in the tree of feeds and when articles get "archived", so don't care about GUI, and fetching feeds and items from URLS, and WebKit rendering article previews, etc.

    articles() gives all articles in all feeds in the folder ?
  FeedList contains:
    Storage *storage
    list of TreeNode flatList
    constructor creates the folder "All Feeds"
    feedIds() gives list of feed IDs
    folders() gives list of folders in the FeedList
  Feed contains:
    ArchiveMode m_archiveMode
    list of articles
    appendArticles() does something with removing from archive
  FeedStorage contains:
    c4_Storage *storage;
      Storage *mainStorage;
      c4_View archiveView;
    articles() gives list of articles
    knows file path to archive
    opens index files archiveindex.mk4 and feedlistbackup.mk4
    rest of files in Archive are individual feeds, named URL.mk4
    all files are binary format
    feeds() gives list of feeds (URLs)
    Status bits: Deleted Trash New Read Keep (can be multiple)

"action manager": sets up GUI and connects it to internals ?
"commands": come from "actions" and open GUI dialogs etc ?

Akregator app is a "Part" in the KDE PIM framework.
Exposed methods: org.kde.akregator.part.xml

Asynchronous operations are done via "slots" and "jobs" (KJob, QTimer) ?

Trivial cleanups I'd like to do:
- more info in log message in ArticleViewerWidget::slotArticlesListed()
- ditto in SelectionController::articleHeadersAvailable()
- ditto in SubscriptionListModel::aboutToRemoveSubscription and next method
- ditto in FeedStorage::FeedStorage

Just for the heck of it, I put a "Q_ASSERT(false);" in main.cpp, and couldn't get it to fire, at least visibly. Why not ? "does nothing if QT_NO_DEBUG was defined during compilation". And QT_NO_DEBUG IS defined on lines in src/akregator/compile_commands.json

Couldn't get anywhere with writing a test, everything I tried caused building to fail. Gave up for a while. Came back after a week, lots of updates to the distro, then tried to build app, and it failed with "unable to merge changes" and then with some CMake error. Gave up again.

Then real life got in the way, and I did other things for many months. Also realize I need to do some systematic learning of C++, a language I really don't know.

Note: to inspect and alter the GUI of a running KDE application, run the GammaRay utility and attach it to the running app ? See https://www.youtube.com/watch?v=DbYLxuCSxSY

KDE development: https://www.youtube.com/@nmariusp/videos
Qt: https://www.youtube.com/@KDABtv/videos
KDE community: https://www.youtube.com/@KdeOrg/videos

Make a New Distro

Bender I'm gonna make my own distro

Please don't create a new distro.

We have far too many distros already. GNU/Linux Distributions Timeline

If you want/need something, do it some other way. A configuration script that modifies an existing distro. A new DE or theme. A new kernel module. Whatever is appropriate for your need/idea.

Of course, if you have some great new world-beating idea that just can't be done in an existing distro, go for it ! But expect lots of work and little audience. Better if you could implement your idea in some major distro such as Ubuntu, and get it out to millions of users.

Make a Linux App

Linux is suffering from Fragmentation:
See "Fragmentation" section of my "Linux Problems" page.