Bedrooms1
Total Baths2
SqFt1,307
Beautifully renovated upper unit at Riverview Townhouse complex with a gorgeous Hudson River view. If you are looking for easy living and low maintenance, you found it. This unit has had kitchen and bathrooms tastefully renovated within last 3-5 years and is ready to move right in. Primary bedroom has double walk-in closets, a window looking over back patio and an adjacent bathroom with a walk-in tiled shower with sliding glass doors. Kitchen has quartz countertops, a tiled back splash, and a beautifully tiled floor. Kitchen opens up to the dining area and an open floor plan to the living room and deck to enjoy the breathtaking views. Additional area off the living room could be an office or sitting area with another window to see the river. Living room opens to a deck for sitting outside and watching the ships go by, beautiful sunrises and the Kingston Lighthouse. In the distance is the Rhinecliff Bridge and across the river is Dutchess County. The stairway already has a stair chair system installed to use if needed now or in the future. In the back of the building is the main entrance with a patio and smaller area for more seating. Under this townhome is a 1 car garage which leads into an additional room for storage or extra space as needed. Included in HOA fee of $480 per mo. (plus a $50 per month assessment) is trash removal, lawn maintenance, exterior building maintenance, snow plowing and access to pool and tennis courts. Walking distance from the townhouse is the Esopus Library and access to the Hudson River at Freer Park. The park has a playground, pavilion and space to picnic, fish, kayak, paddleboard and enjoy the Hudson River. Short drive to downtown Kingston which offers brick walkway for strolling, shopping, many restaurants, coffee shops, boat docking, Maritime Musuem and much more. Watch the sunrise every morning and observe nature including bald eagles flying near the water while you enjoy your coffee on the deck overlooking the Hudson River.
Listing Price$349,900
Listing ID20242138
Year Built1990
Property TypeResidential
ZoningR
CountyUlster
Listing ID20242138
Price$349,900
StatusPending
Bedrooms1
Total Baths2
Full Baths1
Partial Baths1
SqFt 1,307
Acres 0.010
CountyUlster
Year Built1990
Property TypeResidential
Property Sub TypeTownhouse
Zoning Info
More Information
Similar Listings
Contact - Listing ID 20242138
Win Morrison Realty
63 John Street
Kingston, NY12401
Phone: 845-339-1144
Kingston Residential - Kingston Commercial: 845-339-9999 - Woodstock Tinker Street: 845-679-9444 - Woodstock Old Forge: 845-679-2929 - Saugerties: 845-246-3300 - Phoenicia: 845-688-2929
©2008 Multiple Listing Service of Ulster County and the Ulster County Board of Realtors. All rights reserved. The data on this website relating to real estate comes from the (IDX) of the Multiple Listing Service of Ulster County. All information provided is deemed reliable but is not guaranteed and should be independently verified. Data last updated: Sunday, June 9th, 2024 at 03:08:27 AM.
'; var template = '
'+ '
'+ '
'+ '
APR: {{apr}}%
'+ '
Rate: {{rate}}%
'+ '
Points: {{points}}
'+ '
Fees: ${{fees}}
'+ '
Caps: {{firstcap}}/{{addcap}}/{{lifecap}}
'+ '
'+ '
'+ '
${{estpayment}}/mo {{date}}
'+ 'Next'+ '
'+ '
'; var generateMortgages = function() { var mortgages = idx.extend({}, listingDefaultInfo); mortgages.downPayment = parseFloat(idx('#IDX-downPayment input').val().replace(/,/g,'')); mortgages.loanAmount = mortgages.price - mortgages.downPayment; mortgages.fico = idx('#IDX-mortgageRatesFico').val().replace(/,/g,''); mortgages.products = idx('#IDX-mortgageRatesProductId').val(); mortgages.legacyID = idx('#IDX-mortgageRatesProductId option:selected').data('legacyid'); mortgages.ltv = (mortgages.loanAmount / mortgages.price) * 100; return mortgages; }; var xhr; var gatherBankRateData = function() { // clean previous result. idx('#IDX-mortgageShowAllRates').hide(); idx('#IDX-bankRateContent').empty(); idx('#IDX-BankRateDataloading').show(); var mortgages = generateMortgages(); if (xhr) { xhr.abort(); } xhr = idx.ajax({ url: '/idx/api/mortgages/rates', data: {zip: mortgages.zipcode, loanAmount: mortgages.loanAmount, fico: mortgages.fico, ltv: mortgages.ltv, products: mortgages.products, points: mortgages.points } }); xhr.done(function (resp) { if (resp && resp.result && typeof(resp.result[0]) === 'object') { var advertiser, temp, regex, field, points, isEditorial; resp.result.forEach(function(advertiser) { isEditorial = advertiser.ispaid.toLowerCase() === 'false'; if (advertiser.svydate) { advertiser.svydate = new Date(advertiser.svydate).toDateString().replace(/\s\d{4}/, ''); } else { advertiser.svydate = new Date().toDateString().replace(/\s\d{4}/, ''); } temp = template; regex = new RegExp('{{isEditorial}}'); temp = temp.replace(regex, isEditorial); for (field in advertiser) { if (advertiser.hasOwnProperty(field)) { regex = new RegExp('{{'+field+'}}', 'g'); temp = temp.replace(regex, advertiser[field]); } } if (!advertiser.points) { regex = new RegExp('{{points}}'); points = parseFloat(advertiser.originationpoints) + parseFloat(advertiser.discpoints); temp = temp.replace(regex, points); } regex = new RegExp('{{[a-zA-Z]+}}'); temp = temp.replace(regex, ''); idx('#IDX-bankRateContent').append(temp); }); idx('div[data-editorial="true"] .IDX-mortgageRatesLogo').hide(); idx('div[data-editorial="true"] .IDX-mortgageRatesGoBtn').hide(); idx('#IDX-mortgageShowAllRates').show(); if (idx('#IDX-mortgageRatesProductId option:selected').text().match(/arm/i)) { idx('.IDX-mortgageRatesCaps').show(); } else { idx('.IDX-mortgageRatesCaps').hide(); } idx('.IDX-mortgageRatesNMLS').each(function(index, ele){ if (idx(ele).text() == 'NMLS # ') idx(ele).remove(); }); idx('.IDX-mortgageRatesSlic').each(function(index, ele){ if (idx(ele).text() == 'State Lic # ') idx(ele).remove(); }); if (idx(window).width() <=480) { idx('.IDX-mortgageRatesInfo').addClass('IDX-mortgageRatesInfo-small'); } else { idx('.IDX-mortgageRatesInfo').removeClass('IDX-mortgageRatesInfo-small'); } if (idx(window).width() <= 420) { idx('.IDX-mortgageRatesLogo img').addClass('IDX-mortgageRatesLogoImg-small'); idx('#IDX-mortgageRatesTable').addClass('IDX-mortgageRatesTable-small'); } else { idx('.IDX-mortgageRatesLogo img').removeClass('IDX-mortgageRatesLogoImg-small'); idx('#IDX-mortgageRatesTable').removeClass('IDX-mortgageRatesTable-small'); } } else { idx('#IDX-bankRateContent').append(noResult); } }).always(function () { xhr = undefined; idx('#IDX-BankRateDataloading').hide(); }); }; var seeMoreRates = function () { var mortgages = generateMortgages(); if (mortgages.zipcode !== '') { var points; if ( mortgages.points === 'One') { points = 'ZeroToOne'; } else if ( mortgages.points === 'Two' ) { points = 'OneToTwo'; } else { points = mortgages.points; } window.open('http://www.bankrate.com/funnel/mortgages/mortgage-results.aspx?pid=p:idxb&zip=' + mortgages.zipcode + '&loan=' + mortgages.loanAmount + '&perc=' + mortgages.ltv +'&prods=' + mortgages.legacyID + '&points=' + points); } else{ window.open('http://www.bankrate.com/funnel/mortgages/?pid=p:idxb&loan=' + mortgages.loanAmount + '&prods=' + mortgages.legacyID + '&points=All'); } }; idx('#searchBankRate').click(function (e) { e.preventDefault(); gatherBankRateData(); }); // show all rate links idx('#IDX-mortgageShowAllRates').click(function(e) { e.preventDefault(); seeMoreRates(); }); idx('a[href="#IDX-bankRate"]').click(function(e){ e.preventDefault(); var mortgages = generateMortgages(); idx('#IDX-loanAmount input').val(mortgages.loanAmount.formatMoney()); idx('#IDX-downPayment input').val(mortgages.downPayment.formatMoney()); // open bankrate dialog idx("#IDX-BankRateTool-Dialog").dialog({ resizable: false, modal: true, width: '90%' }); gatherBankRateData(); idx('#IDX-mortgageRatesContent').show(); }); // center dialog idx(window).resize(function() { // if (idx(window)) {}; idx("#IDX-BankRateTool-Dialog").dialog("option", "position", {at: "center", collision: "fit", my: "center"}); }); } } if (idx.Modernizr.mq('only screen and (min-width: 640px)')) { if (!idx('#IDX-detailsWrapper').attr('data-collapse-details')) { idx('.IDX-panel-collapse').collapse('show'); idx('.IDX-panel-collapse-toggle').removeClass('IDX-collapsed'); } idx('#IDX-firstDate').datepicker(); idx('#IDX-secondDate').datepicker(); } else { idx('.IDX-panel-collapse').collapse('hide'); idx('.IDX-panel-collapse-toggle').addClass('IDX-collapsed'); } var openVirtualTourModal = function(e) { e.preventDefault(); idx(idx(this).attr('href')).dialog('open'); }; // load slideshow images later. idx(function () { /** * Handle courtesy & disclaimer CSS selector rules. * @param {string} parent The parent selector. */ var moveCourtesiesAndDisclaimers = function (parent) { if (idx(parent).length) { var container = '#IDX-main'; idx(parent + ' > div').each(function () { var selector = idx(this).children('.IDX-selector').text(); var text = idx(this).children('.IDX-selectorText').html(); idx(selector, container).append(text); }); } } var selectors = ['.IDX-mlsSelectorRulesCourtesy', '.IDX-mlsSelectorRulesDisclaimer']; for (var i = 0; i < selectors.length; i++) { moveCourtesiesAndDisclaimers(selectors[i]); } idx('.IDX-mediaContentVT, .IDX-mediaContentOH, .idx-media-content__floor-plans').dialog({ autoOpen: false, resizable: false }); idx('#IDX-detailsVirtualTour, #idx-floor-plans-toggle').click(openVirtualTourModal); const mlmApiBase = '/idx/api/myaccount/properties/' const modifyCookies = function (cookieName, id) { const savedCookie = decodeURIComponent(document.cookie).split(';') let savedString = '' for (var i = 0; i < savedCookie.length; i++) { let c = savedCookie[i] while (c.charAt(0) === ' ') { c = c.substring(1) } if (c.indexOf(cookieName) === 0) { savedString = c.substring(cookieName.length, c.length) } } if (savedString) { let savedJson = JSON.parse(savedString) savedJson = Object.keys(savedJson) .filter(function (key) { return parseInt(key) !== id }) .reduce(function (obj, key) { obj[key] = savedJson[key] return obj }, {}) savedJson = JSON.stringify(savedJson) const cookieSecurity = window.location.protocol === 'https:' ? ' SameSite=None; Secure' : '' document.cookie = cookieName + encodeURIComponent(savedJson) + '; path=/;' + cookieSecurity; } } const showErrorMessage = function () { idx('.IDX-detailsSaveFailure') .removeClass('IDX-hide') .text('Could not unfavorite property. Please refresh and try again.') } const resetSaveButton = function (isFavorite, params, el) { element = idx('.IDX-detailsSaveFailure'); element .removeClass('IDX-removeProperty--fail') .text('') el.attr('disabled', false); if (!isFavorite) { el .removeClass('IDX-btn__remove') .removeClass('IDX-disabled') .attr('href', '#saveProperty') .attr('id', 'IDX-saveProperty') .text('Add to Favorites') .off('click') .on('click', bindSavePropertyButton('#IDX-saveProperty')) } else { el .addClass('IDX-btn__remove') .removeClass('IDX-saveProperty') .attr('href', '#removeProperty') .off('click') .on('click', removeSavedProperty('.IDX-btn__remove')) .text('Unfavorite') } } const removeSavedProperty = function (responseText, params, el) { if (responseText.id) { idx.ajax({ url: mlmApiBase + responseText.id, type: 'DELETE', // Note that the DELETE request, when successful, sends a 204 no content. success: function () { try { modifyCookies('IDX-savedProperties=', responseText.id); resetSaveButton(false, params, el); } catch (error) { showErrorMessage() console.error('error', error) } }, error: function (jqXHR, textStatus, errorThrown) { showErrorMessage() console.error( 'An error was thrown while attempting to delete the saved property. Status: %s %s', jqXHR.status, jqXHR.responseText ); } }); } } const getSavedPropertyId = function (params, el) { if (!params.idxid || !params.listingid) { return false; } el.attr('disabled', 'disabled').addClass('IDX-disabled'); idx.ajax({ url: mlmApiBase + params.idxid + '/' + params.listingid, type: 'GET', success: function (responseText) { removeSavedProperty(responseText, params, el); }, error: function () { showErrorMessage() } }) } const bindRemovePropertyButton = function (target) { idx(target).on('click', function (e) { e.preventDefault(); const data = idx(this).data(); const id = idx(this).attr('id'); const result = getSavedPropertyId(data, idx(this)); }); } const bindSavePropertyButton = function (target) { idx(target).on('click', function (e) { e.preventDefault(); var softLoggedIn = idx('#IDX-registration').attr('data-softLoggedIn'); var idxID = idx(this).attr('data-idxid'); var listingID = idx(this).attr('data-listingid'); if (idx('#IDX-main').hasClass('IDX-loggedIn') && !softLoggedIn) { idx('#IDX-savePropertyForm .IDX-idxID').val(idxID); idx('#IDX-savePropertyForm .IDX-listingID').val(listingID); idx(this).attr('disabled', 'disabled').addClass('IDX-disabled') // they are logged in, submit the form idx('#IDX-savePropertyForm').ajaxSubmit({ dataType: 'json', success: function (responseText, statusText, xhr, $form) { var element = idx('#IDX-saveProperty'); if (responseText.status === 'success' || responseText.status === 'duplicate') { element .attr('href', '#removeProperty') .attr('id', 'IDX-removeProperty') .removeClass('IDX-disabled') .attr('disabled', false) .text('Unfavorite') .off('click') .on('click', bindRemovePropertyButton('#IDX-removeProperty')); } else { element.after('Error saving property'); element.attr('disabled', false).removeClass('IDX-disabled'); } } }); } else { idx('.IDX-saveParams').attr('disabled', 'disabled'); idx('.IDX-saveWhat').val('property').removeAttr('disabled'); idx('.IDX-idxID').val(idxID).removeAttr('disabled'); idx('.IDX-listingID').val(listingID).removeAttr('disabled'); idx('#IDX-registration').dialog('open'); } }); } // Bind any existing saved properties to the click handler. bindRemovePropertyButton('#IDX-removeProperty'); bindSavePropertyButton('#IDX-saveProperty'); idx('.IDX-detailsshowcaseSlides a').click(function(e){ e.preventDefault(); changePrimaryImg(idx(this)); }); // schedule link idx('#IDX-scheduleShowing').click(function(e) { e.preventDefault(); if (idx('#IDX-detailsContactForm:visible').size() && idx('#IDX-scheduleshowingContactForm').size()) { window.location = window.location.href.replace(window.location.hash, '') + '#IDX-detailsContactForm'; } else { window.location = idx(this).attr('href'); } }); // contact agent idx('#IDX-contactAgent').click(function(e) { e.preventDefault(); if (idx('#IDX-detailsContactForm:visible').size() && idx('#IDX-detailscontactContactForm').size()) { window.location = window.location.href.replace(window.location.hash, '') + '#IDX-detailsContactForm'; } else { window.location = idx(this).attr('href'); } }); // request more info idx('#IDX-moreinfo').click(function(e) { e.preventDefault(); if (idx('#IDX-detailsContactForm:visible').size() && idx('#IDX-moreinfoContactForm').size()) { window.location = window.location.href.replace(window.location.hash, '') + '#IDX-detailsContactForm'; } else { window.location = idx(this).attr('href'); } }); // swipe idx('#IDX-primaryPhoto a').click(function(e){ e.preventDefault(); }); var primaryPhotoElement = document.getElementById('IDX-primaryPhoto'); var hammer = new idxHammer.Manager(primaryPhotoElement); hammer.add(new idxHammer.Swipe({direction: idxHammer.DIRECTION_HORIZONTAL, velocity: 0.5})); hammer.on('swipeleft', function() { slideNext(); }); hammer.on('swiperight', function() { slidePrev(); }); // bankRate bankRateSetup(); /** * Set the carousel properties. * * @return array The carousel array. */ var idxSlides = idxSlides || {}; if (!idxSlides.slideShow) { idxSlides.slideShow = (function () { var slideShowElement = undefined; var slideShowContainer = '.IDX-carouselWrapper'; var slides = '.IDX-carouselThumb'; var prev = '.IDX-carouselLeft, #IDX-arrow-previous'; var next = '.IDX-carouselRight, #IDX-arrow-next'; var activeSlide = 'IDX-showcaseSlide-active'; var primaryPhotoId = 'IDX-detailsPrimaryImg' var indexBoundaries = { min: undefined, max: undefined }; var slideWidth = 65; // Buffer time in ms to allow for animations to complete before next code execution. var buffer = 200; // Get a non-rounded number of visible images. var getVisibleImages = function () { return slideShowElement.width() / slideWidth; } // Get a rounded-down number of images. We don't want partial images in this instance. var getVisibleImagesRounded = function () { return Math.ceil(getVisibleImages()); } // Determines how far we can scroll right. var getMaxPosX = function () { return idx(slideShowContainer).width() - slideShowElement.width(); } // Returns the CSS:right position of the carousel. var position = function () { var pos = idx(slideShowContainer).css('right'); return parseInt(pos.substr(0, pos.length - 2)); } // calculate the minimum visible slide index. var getIndexBoundaries = function () { var pos = position(); // Determine if the position divides between slideWidth evenly or not. if (pos % slideWidth == 0) { indexBoundaries.min = pos / slideWidth; } else { indexBoundaries.min = ((pos - (pos % slideWidth)) / slideWidth); } indexBoundaries.max = indexBoundaries.min + getVisibleImages(); return indexBoundaries; } // Replaces the thumbnail src attribute with the data-src attribute. var loadSlideThumbnail = function(index) { var image = idx(slides).eq(index).children('img[data-loaded="false"]'); if (image.length > 0) { image .attr({ 'srcset': image.attr('data-srcset'), 'src': image.attr('data-src') }) .attr('data-loaded', true); } } var removeActive = function (index, callback) { idx('.' + activeSlide).removeClass(activeSlide); if (callback) { callback(); } } var setActive = function (index, callback) { idx(slides) .eq(index) .addClass(activeSlide); idx('#' + primaryPhotoId).attr({ 'srcset': idx(slides).eq(index).children('img').attr('data-srcset') || null, 'src': idx(slides).eq(index).children('img').attr('data-src') }) if (callback) { callback(); } } // Calculates a new position based on the selected index and current position. var calcNewPosition = function (index) { var newPos, maxPosX, currentPos; newPos = { right: index * slideWidth, animate: false }; maxPosX = getMaxPosX(); currentPos = position(); // Don't animate we're near the edge of our slides. if (index <= indexBoundaries.min || index >= Math.floor(indexBoundaries.max)) { newPos.animate = true; } if (newPos.right > maxPosX || currentPos > maxPosX) { // We're skipping from first image to last image. newPos.right = maxPosX; } if (currentPos > maxPosX) { newPos.animate = true; } // If we somehow fall below our minimum right position. if (newPos.right < 0) { newPos.right = 0; } // If newPos > maxPosX && pos > 0, don't animate it. if (newPos == maxPosX && currentPos > 0) { newPos.animate = false; } return newPos; } var animateSlide = function (index, callback) { var newPos = calcNewPosition(index); // If the newly calculated position falls within our slider boundaries. if (newPos.animate) { slideShowElement .find(slideShowContainer) .stop() .css({ right: newPos.right }); // Buffer to allow CSS transition to complete before we recalculate the boundaries. setTimeout(function() { indexBoundaries = getIndexBoundaries(); lazyLoadImages(); }, buffer) } if (callback) { callback(); } } var lazyLoadImages = function () { for (var i=indexBoundaries.min; i<=Math.ceil(indexBoundaries.max); i++) { loadSlideThumbnail(i); } } var newSlide = function (index) { if (index < 0) { // Send to last slide instead. index = idx(slides).last().index(); } else if (index > (idx(slides).length - 1)) { // Send to first slide. index = 0; } // Animate the slide. animateSlide(index, function () { removeActive(index, function () { setActive(index); }); }); } var setup = function () { // Set slide length. idx(slideShowContainer) .css({ width: idx(slides).length * slideWidth }); // Apply some CSS to override any client modifications, otherwise they could break the slider. idx(slides).children('img').slice(0, idx(slides).length).css({ 'box-sizing': 'border-box', 'object-fit': 'cover', 'max-width': slideWidth - 10 }); // Calc min/max visible indexes, loop through for lazy-loading. var visibleImages = getVisibleImagesRounded(); for (var i=0; i
Data services provided by IDX Broker