The Thing About Universal Remote Control Codes
I spent three days last month trying to get a Logitech Harmony to control a 2007 Panasonic plasma and a 2012 Onkyo receiver through a 2020 Sony TV. That is not hypothetical. It happened to me. The final fix wasn't in any manual. I ended up using IR blaster code injection combined with a raw signal capture from a working universal remote I found at a friend's house. But before we get into the messy middle, let's clear up what these codes actually are. Universal Remote Control Codes are basically lookup tables. Each entry maps a brand and model to a sequence of infrared pulses that your TV or receiver was designed to respond to. When you program a remote, you're telling it to send that specific pulse pattern. The remote doesn't know what a TV is. It just knows to flash an LED in a certain rhythm. That rhythm turns out volume up on your Samsung and nothing on your LG because they use different timing.
Where to Find Universal Remote Control Codes
The most reliable sources are manufacturer databases and community-maintained repositories. Logitech publishes Harmony code lists directly. RCA and GE remotes share code databases through their parent company, Hillcrest. For DIY setups, Remote Central has been the go-to archive for two decades. It's not pretty, but it works. I've also used the common-ir-remote-definitions GitHub project when building custom solutions with Arduino or ESP32 modules. Download links matter less than understanding the format. Most databases give you codes in HEX, DEC, or NEC protocol format. If you're programming a standalone remote like a GE 3-Device or a One For All URC, you just punch in the four-to-six-digit code. If you're flashing custom firmware or using a learning remote, you need the full protocol definition including timing values. The distinction ruins people more often than anything else.
How Programming Actually Works
Auto-search is the first method most people try, and it has a legitimate use case. You hold the setup button, point the remote at the device, and press channel up repeatedly until the TV powers off. Then you save. This works fine when the remote has the right code built in and the device responds to a basic power command. It fails when the auto-search picks a code that turns the TV on but doesn't control volume, input switching, or menu navigation. You end up with a remote that does one thing adequately and everything else poorly. The better approach is direct code entry. You look up the exact code for your device brand and model, enter it manually, and test every function. Most universal remotes require you to test power, volume, and channel separately. If the volume responds but channel doesn't, you try the next code in the list. This usually takes about ten to twenty minutes per device. Doing three devices properly means forty-five minutes to an hour, not the thirty-minute estimate that comes with auto-search. Learning mode is the third option. You point two remotes at each other and press buttons one by one to capture the original signal. This sounds elegant. It's also painfully slow and unreliable for anything beyond basic functions. The captured signal often includes manufacturer-specific timing extensions that your second remote can't reproduce accurately. I learned this the hard way when I tried to learn a DirecTV remote's input switching commands and ended up with a remote that could change channels but couldn't access the guide or settings menu.
Get the Full Details

Edge Cases and What Nobody Tells You
One of the most frustrating scenarios involves devices that use multiple protocols or require handshaking. Some AV receivers, for example, need a specific initialization sequence before they'll accept volume or input commands. If you just send a generic volume-up pulse, the receiver ignores it because it hasn't completed its boot handshake. The workaround is either finding a code that includes the full initialization sequence or using a macro function if your remote supports it. Macros let you chain multiple IR bursts together and trigger them with a single button press. Another common failure point is TVs with IR blaster ports versus built-in receivers. Some newer Samsung and LG models moved the IR receiver to a small separate panel on the top edge of the screen. Point your remote at the bezel and nothing happens. You have to aim at the actual sensor location, which isn't always obvious. I solved this on my own setup by mounting a $15 IR extender cable that routes the signal from the back of the TV to a visible position near the stand. It's cheap, it works, and nobody mentions it in any of the packaging. There's also the HDMI-CEC complication. Many people think that once they set up a universal remote, they're done. But CEC lets devices talk to each other over HDMI. Your TV remote can control the soundbar volume through the cable. A universal remote doesn't participate in CEC. So you end up with two control systems fighting each other. I had a client who spent two weeks troubleshooting a Harmony setup only to realize the real problem was CEC commands from his cable box overriding the remote's volume commands. Turning off CEC in the TV's settings fixed it instantly. Check that before you replace anything.
Universal Remote Control Codes for Specific Scenarios
Here's where the detail matters. If you have a Vizio TV from 2018 or later, the codes aren't consistent across the line. The M-series uses different codes than the P-series even though they're from the same year and the same brand. Model numbers matter more than you'd expect. Look up your exact model, not just "Vizio 55-inch TV." The same applies to Roku streaming sticks. A Roku Premiere and a Roku Ultra from the same year can have different IR codes depending on which generation of firmware was loaded at the factory. For older equipment, like CRT televisions or pre-2000 stereo receivers, the code databases are spotty. Some manufacturers didn't standardize their IR protocols back then. Sanyo and Sharp in particular have inconsistent code coverage in most public databases. When that happens, your options narrow to learning mode, raw signal capture with a device like an XMP3, or building a custom macro from scratch. The XMP3 is a $100 tool that records IR signals and lets you build, edit, and replay custom code sequences. It's the most powerful option for people who hit database limitations, and it's also the steepest learning curve.
What Fails and When to Walk Away
Universal remotes don't work for everything. Devices that use RF or WiFi instead of IR are completely outside their scope. Sonos speakers, Apple TV with its remote-first design, and most smart home assistants simply can't be controlled by an IR universal remote. You need a separate solution for those, whether that's the manufacturer's app, a dedicated RF remote, or a smart hub that aggregates both IR and IP control. Even within IR, there are hard limits. If a device uses bidirectional communication where it sends acknowledgments back to the remote, a basic universal remote can't handle it. Some high-end Denon and Marantz receivers do this during source selection. You press the input button and the receiver confirms the switch with a beep and a display update. A universal remote sends the command and moves on. It doesn't receive the confirmation. This isn't a malfunction. It's just how the protocol works, and no amount of code digging will change it. The biggest disappointment is universal remote control over apps and menus on smart TVs. Your remote can change the input from HDMI 1 to HDMI 2. It cannot navigate Netflix's interface or adjust picture calibration settings. Those require the TV's own remote or a companion app. People buy universal remotes expecting full control and then get frustrated when the Netflix button doesn't exist. It won't. This limitation is worth stating upfront so you don't waste time looking for something that isn't there.

If you find yourself dealing with more than four IR devices plus multiple IP-controlled components, the math stops working in favor of a simple universal remote. At that point, a dedicated system controller like a Savant, Control4, or even a modest Home Assistant setup with an IR blaster module gives you way more flexibility for less headache. The initial investment is higher. The long-term maintenance is lower. I switched half my clients to Home Assistant with broadlink RM4 units after watching them spend hundreds on Harmony replacements that still couldn't control their multi-zone audio system properly. The codes themselves are straightforward. Getting them to work reliably across a mixed-generality setup is where the actual work lives. Pick the right tool for what you're trying to control, verify your model numbers against the database before you start, and don't assume a universal remote will solve a problem that a CEC setting or a protocol mismatch is actually causing.