diff --git a/frontend/src/app/components/transaction/transaction-raw.component.html b/frontend/src/app/components/transaction/transaction-raw.component.html
new file mode 100644
index 000000000..15293e2dd
--- /dev/null
+++ b/frontend/src/app/components/transaction/transaction-raw.component.html
@@ -0,0 +1,190 @@
+
+
+ @if (!transaction) {
+
+
Preview Transaction
+
+
+ }
+
+ @if (transaction && !error && !isLoading) {
+
+
Preview Transaction
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ errorBroadcast }}
+
+
+
+ @if (!hasPrevouts) {
+
+ This transaction is missing prevouts data. {{ errorPrevouts ? 'Reason: ' + errorPrevouts : '' }}
+
+ }
+
+
+
+
+
+
+
+
Flow
+
+
+
+
+
+
+
+
+
+
+
+
24">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Inputs & Outputs
+
+
+
+
+
+
+
+
+
+
+
+
+
Details
+
+
+
+
+
+
+
+ Size |
+ |
+
+
+ Virtual size |
+ |
+
+
+ Adjusted vsize
+
+
+
+ |
+ |
+
+
+ Weight |
+ |
+
+
+
+
+
+
+
+
+ Version |
+ |
+
+
+ Locktime |
+ |
+
+ = 0">
+ Sigops
+
+
+
+ |
+ |
+
+
+ Transaction hex |
+ |
+
+
+
+
+
+
+ }
+
+ @if (isLoading) {
+
+
+
Loading transaction prevouts ({{ prevoutsLoadedCount }} / {{ prevoutsCount }})
+
+ }
+
\ No newline at end of file
diff --git a/frontend/src/app/components/transaction/transaction-raw.component.scss b/frontend/src/app/components/transaction/transaction-raw.component.scss
new file mode 100644
index 000000000..5bbe5601e
--- /dev/null
+++ b/frontend/src/app/components/transaction/transaction-raw.component.scss
@@ -0,0 +1,194 @@
+.label {
+ margin: 0 5px;
+}
+
+.container-buttons {
+ align-self: center;
+}
+
+.title-block {
+ flex-wrap: wrap;
+ align-items: baseline;
+ @media (min-width: 650px) {
+ flex-direction: row;
+ }
+ h1 {
+ margin: 0rem;
+ margin-right: 15px;
+ line-height: 1;
+ }
+}
+
+.tx-link {
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-start;
+ align-items: baseline;
+ width: 0;
+ max-width: 100%;
+ margin-right: 0px;
+ margin-bottom: 0px;
+ margin-top: 8px;
+ @media (min-width: 651px) {
+ flex-grow: 1;
+ margin-bottom: 0px;
+ margin-right: 1em;
+ top: 1px;
+ position: relative;
+ }
+ @media (max-width: 650px) {
+ width: 100%;
+ order: 3;
+ }
+
+ .txid {
+ width: 200px;
+ min-width: 200px;
+ flex-grow: 1;
+ }
+}
+
+.container-xl {
+ margin-bottom: 40px;
+}
+
+.row {
+ flex-direction: column;
+ @media (min-width: 850px) {
+ flex-direction: row;
+ }
+}
+
+.box.hidden {
+ visibility: hidden;
+ height: 0px;
+ padding-top: 0px;
+ padding-bottom: 0px;
+ margin-top: 0px;
+ margin-bottom: 0px;
+}
+
+.graph-container {
+ position: relative;
+ width: 100%;
+ background: var(--stat-box-bg);
+ padding: 10px 0;
+ padding-bottom: 0;
+}
+
+.toggle-wrapper {
+ width: 100%;
+ text-align: center;
+ margin: 1.25em 0 0;
+}
+
+.graph-toggle {
+ margin: auto;
+}
+
+.table {
+ tr td {
+ padding: 0.75rem 0.5rem;
+ @media (min-width: 576px) {
+ padding: 0.75rem 0.75rem;
+ }
+ &:last-child {
+ text-align: right;
+ @media (min-width: 850px) {
+ text-align: left;
+ }
+ }
+ .btn {
+ display: block;
+ }
+
+ &.wrap-cell {
+ white-space: normal;
+ }
+ }
+}
+
+.effective-fee-container {
+ display: block;
+ @media (min-width: 768px){
+ display: inline-block;
+ }
+ @media (max-width: 425px){
+ display: flex;
+ flex-direction: column;
+ }
+}
+
+.effective-fee-rating {
+ @media (max-width: 767px){
+ margin-right: 0px !important;
+ }
+}
+
+.title {
+ h2 {
+ line-height: 1;
+ margin: 0;
+ padding-bottom: 5px;
+ }
+}
+
+.btn-outline-info {
+ margin-top: 5px;
+ @media (min-width: 768px){
+ margin-top: 0px;
+ }
+}
+
+.flow-toggle {
+ margin-top: -5px;
+ margin-left: 10px;
+ @media (min-width: 768px){
+ display: inline-block;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ }
+}
+
+.subtitle-block {
+ display: flex;
+ flex-direction: row;
+ align-items: baseline;
+ justify-content: space-between;
+
+ .title {
+ flex-shrink: 0;
+ }
+
+ .title-buttons {
+ flex-shrink: 1;
+ text-align: right;
+ .btn {
+ margin-top: 0;
+ margin-bottom: 8px;
+ margin-left: 8px;
+ }
+ }
+}
+
+.cpfp-details {
+ .txids {
+ width: 60%;
+ }
+
+ @media (max-width: 500px) {
+ .txids {
+ width: 40%;
+ }
+ }
+}
+
+.disabled {
+ opacity: 0.5;
+ pointer-events: none;
+}
+
+.no-cursor {
+ cursor: default !important;
+ pointer-events: none;
+}
\ No newline at end of file
diff --git a/frontend/src/app/components/transaction/transaction-raw.component.ts b/frontend/src/app/components/transaction/transaction-raw.component.ts
new file mode 100644
index 000000000..cac7b595f
--- /dev/null
+++ b/frontend/src/app/components/transaction/transaction-raw.component.ts
@@ -0,0 +1,296 @@
+import { Component, OnInit, HostListener, ViewChild, ElementRef, OnDestroy, ChangeDetectorRef } from '@angular/core';
+import { Transaction } from '@interfaces/electrs.interface';
+import { StateService } from '../../services/state.service';
+import { Filter, toFilters } from '../../shared/filters.utils';
+import { decodeRawTransaction, getTransactionFlags, addInnerScriptsToVin, countSigops } from '../../shared/transaction.utils';
+import { ETA, EtaService } from '../../services/eta.service';
+import { combineLatest, firstValueFrom, map, Observable, startWith, Subscription } from 'rxjs';
+import { WebsocketService } from '../../services/websocket.service';
+import { ActivatedRoute, Router } from '@angular/router';
+import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
+import { ElectrsApiService } from '../../services/electrs-api.service';
+import { SeoService } from '../../services/seo.service';
+import { seoDescriptionNetwork } from '@app/shared/common.utils';
+import { ApiService } from '../../services/api.service';
+import { RelativeUrlPipe } from '@app/shared/pipes/relative-url/relative-url.pipe';
+
+@Component({
+ selector: 'app-transaction-raw',
+ templateUrl: './transaction-raw.component.html',
+ styleUrls: ['./transaction-raw.component.scss'],
+})
+export class TransactionRawComponent implements OnInit, OnDestroy {
+
+ pushTxForm: UntypedFormGroup;
+ isLoading: boolean;
+ offlineMode: boolean = false;
+ transaction: Transaction;
+ error: string;
+ errorPrevouts: string;
+ hasPrevouts: boolean;
+ prevoutsLoadedCount: number = 0;
+ prevoutsCount: number;
+ isLoadingBroadcast: boolean;
+ errorBroadcast: string;
+ successBroadcast: boolean;
+
+ isMobile: boolean;
+ @ViewChild('graphContainer')
+ graphContainer: ElementRef;
+ graphExpanded: boolean = false;
+ graphWidth: number = 1068;
+ graphHeight: number = 360;
+ inOutLimit: number = 150;
+ maxInOut: number = 0;
+ flowPrefSubscription: Subscription;
+ hideFlow: boolean = this.stateService.hideFlow.value;
+ flowEnabled: boolean;
+ adjustedVsize: number;
+ filters: Filter[] = [];
+ showCpfpDetails = false;
+ ETA$: Observable